Upgraded to ADOdb 4.5.1. Contains a lot of small fixes and speed-ups.

This commit is contained in:
moodler 2004-08-07 14:10:19 +00:00
parent f5f346a594
commit fab7e07e19
90 changed files with 1555 additions and 832 deletions

View file

@ -7,7 +7,7 @@ global $ADODB_INCLUDED_CSV;
$ADODB_INCLUDED_CSV = 1; $ADODB_INCLUDED_CSV = 1;
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.
@ -249,4 +249,56 @@ $ADODB_INCLUDED_CSV = 1;
$rs->InitArrayFields($arr,$flds); $rs->InitArrayFields($arr,$flds);
return $rs; return $rs;
} }
/**
* 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
# modified the file exclusively.
# What a stupid need - having to simulate locking.
# Risks:
# 1. $tempfile name is not unique -- very very low
# 2. unlink($filename) fails -- ok, rename will fail
# 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs
# 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated
if (strncmp(PHP_OS,'WIN',3) === 0) {
// skip the decimal place
$mtime = substr(str_replace(' ','_',microtime()),2);
// getmypid() actually returns 0 on Win98 - never mind!
$tmpname = $filename.uniqid($mtime).getmypid();
if (!($fd = fopen($tmpname,'a'))) return false;
$ok = ftruncate($fd,0);
if (!fwrite($fd,$contents)) $ok = false;
fclose($fd);
chmod($tmpname,0644);
// the tricky moment
@unlink($filename);
if (!@rename($tmpname,$filename)) {
unlink($tmpname);
$ok = false;
}
if (!$ok) {
if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed'));
}
return $ok;
}
if (!($fd = fopen($filename, 'a'))) return false;
if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) {
$ok = fwrite( $fd, $contents );
fclose($fd);
chmod($filename,0644);
}else {
fclose($fd);
if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename<br>\n");
$ok = false;
}
return $ok;
}
?> ?>

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/** /**
* @version V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. * @version V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license. * Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses, * Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence. * the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
* @version V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. * @version V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
* Released under both BSD license and Lesser GPL library license. * Released under both BSD license and Lesser GPL library license.
* Whenever there is any discrepancy between the two licenses, * Whenever there is any discrepancy between the two licenses,
* the BSD license will take precedence. * the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -59,13 +59,6 @@
return call_user_func_array(array($this->rs, $func), $params); return call_user_func_array(array($this->rs, $func), $params);
} }
function __toString()
{
if (isset($rs->databaseType)) $s = ' for '.$rs->databaseType;
else $s = '';
return 'ADODB Iterator'.$s;
}
function hasMore() function hasMore()
{ {
@ -79,6 +72,12 @@ class ADODB_BASE_RS implements IteratorAggregate {
function getIterator() { function getIterator() {
return new ADODB_Iterator($this); return new ADODB_Iterator($this);
} }
function __toString()
{
include_once(ADODB_DIR.'/toexport.inc.php');
return _adodb_export($this,',',',',false,true);
}
} }
?> ?>

View file

@ -63,7 +63,7 @@ function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_
if ($uSet && $where) { if ($uSet && $where) {
$update = "UPDATE $table SET $uSet WHERE $where"; $update = "UPDATE $table SET $uSet WHERE $where";
$rs = $zthis->Execute($update); $rs = $zthis->_Execute($update);
if ($rs) { if ($rs) {
if ($zthis->poorAffectedRows) { if ($zthis->poorAffectedRows) {
/* /*
@ -77,10 +77,12 @@ function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_
$cnt = $zthis->GetOne("select count(*) from $table where $where"); $cnt = $zthis->GetOne("select count(*) from $table where $where");
if ($cnt > 0) return 1; // record already exists if ($cnt > 0) return 1; // record already exists
} else } else {
if (($zthis->Affected_Rows()>0)) return 1; if (($zthis->Affected_Rows()>0)) return 1;
} }
} }
}
// print "<p>Error=".$this->ErrorNo().'<p>'; // print "<p>Error=".$this->ErrorNo().'<p>';
$first = true; $first = true;
foreach($fieldArray as $k => $v) { foreach($fieldArray as $k => $v) {
@ -96,7 +98,7 @@ function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_
} }
} }
$insert = "INSERT INTO $table ($iCols) VALUES ($iVals)"; $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)";
$rs = $zthis->Execute($insert); $rs = $zthis->_Execute($insert);
return ($rs) ? 2 : 0; return ($rs) ? 2 : 0;
} }
@ -216,7 +218,7 @@ function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql; if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql;
else $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql); else $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
$rstest = &$zthis->Execute($rewritesql,$inputarr); $rstest = &$zthis->_Execute($rewritesql,$inputarr);
if ($rstest) { if ($rstest) {
$qryRecs = $rstest->RecordCount(); $qryRecs = $rstest->RecordCount();
if ($qryRecs == -1) { if ($qryRecs == -1) {
@ -266,11 +268,7 @@ function &_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page,
$lastpageno = (int) ceil($qryRecs / $nrows); $lastpageno = (int) ceil($qryRecs / $nrows);
$zthis->_maxRecordCount = $qryRecs; $zthis->_maxRecordCount = $qryRecs;
// If page number <= 1, then we are at the first page
if (!isset($page) || $page <= 1) {
$page = 1;
$atfirstpage = true;
}
// ***** Here we check whether $page is the last page or // ***** Here we check whether $page is the last page or
// whether we are trying to retrieve // whether we are trying to retrieve
@ -280,6 +278,12 @@ function &_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page,
$atlastpage = true; $atlastpage = true;
} }
// If page number <= 1, then we are at the first page
if (empty($page) || $page <= 1) {
$page = 1;
$atfirstpage = true;
}
// We get the data we want // We get the data we want
$offset = $nrows * ($page-1); $offset = $nrows * ($page-1);
if ($secs2cache > 0) if ($secs2cache > 0)
@ -372,7 +376,7 @@ function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq
// If the recordset field is one // If the recordset field is one
// of the fields passed in then process. // of the fields passed in then process.
$upperfname = strtoupper($field->name); $upperfname = strtoupper($field->name);
if (adodb_key_exists($upperfname,$arrFields)) { if (adodb_key_exists($upperfname,$arrFields,$forcenulls)) {
// If the existing field value in the recordset // If the existing field value in the recordset
// is different from the value passed in then // is different from the value passed in then
@ -407,6 +411,7 @@ function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq
$fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote; $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;
else else
$fnameq = $upperfname; $fnameq = $upperfname;
//we do this so each driver can customize the sql for //we do this so each driver can customize the sql for
//DB specific column types. //DB specific column types.
//Oracle needs BLOB types to be handled with a returning clause //Oracle needs BLOB types to be handled with a returning clause
@ -429,9 +434,10 @@ function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq
$discard = false; $discard = false;
// not a good hack, improvements? // not a good hack, improvements?
if ($whereClause) if ($whereClause) {
preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard); if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard));
else else preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard);
} else
$whereClause = array(false,false); $whereClause = array(false,false);
if ($discard) if ($discard)
@ -503,7 +509,7 @@ function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$forcenulls=f
// Loop through all of the fields in the recordset // Loop through all of the fields in the recordset
foreach( $columns as $field ) { foreach( $columns as $field ) {
$upperfname = strtoupper($field->name); $upperfname = strtoupper($field->name);
if (adodb_key_exists($upperfname,$arrFields)) { if (adodb_key_exists($upperfname,$arrFields,$forcenulls)) {
// Set the counter for the number of fields that will be inserted. // Set the counter for the number of fields that will be inserted.
$fieldInsertedCount++; $fieldInsertedCount++;
@ -539,8 +545,10 @@ function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$forcenulls=f
// Get the table name from the existing query. // Get the table name from the existing query.
if (!$tableName) { if (!$tableName) {
preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName); if (preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName))
$tableName = $tableName[1]; $tableName = $tableName[1];
else
return false;
} }
// Strip off the comma and space on the end of both the fields // Strip off the comma and space on the end of both the fields
@ -693,4 +701,105 @@ function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields,
return $sql; return $sql;
} }
function _adodb_debug_execute(&$zthis, $sql, $inputarr)
{
global $HTTP_SERVER_VARS;
$ss = '';
if ($inputarr) {
foreach($inputarr as $kk=>$vv) {
if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...';
$ss .= "($kk=>'$vv') ";
}
$ss = "[ $ss ]";
}
$sqlTxt = str_replace(',',', ',is_array($sql) ? $sql[0] : $sql);
// check if running from browser or command-line
$inBrowser = isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']);
if ($inBrowser) {
$ss = htmlspecialchars($ss);
if ($zthis->debug === -1)
ADOConnection::outp( "<br>\n($zthis->databaseType): ".htmlspecialchars($sqlTxt)." &nbsp; <code>$ss</code>\n<br>\n",false);
else
ADOConnection::outp( "<hr>\n($zthis->databaseType): ".htmlspecialchars($sqlTxt)." &nbsp; <code>$ss</code>\n<hr>\n",false);
} else {
ADOConnection::outp("-----\n($zthis->databaseType): ".$sqlTxt."\n-----\n",false);
}
$qID = $zthis->_query($sql,$inputarr);
/*
Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql
because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion
*/
if ($zthis->databaseType == 'mssql') {
// ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6
if($emsg = $zthis->ErrorMsg()) {
if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg);
}
} else if (!$qID) {
ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg());
}
return $qID;
}
function _adodb_backtrace($printOrArr=true,$levels=9999)
{
if (PHPVERSION() < 4.3) return '';
$html = (isset($_SERVER['HTTP_USER_AGENT']));
$fmt = ($html) ? "</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" : "%% line %4d, file: %s";
$MAXSTRLEN = 64;
$s = ($html) ? '<pre align=left>' : '';
if (is_array($printOrArr)) $traceArr = $printOrArr;
else $traceArr = debug_backtrace();
array_shift($traceArr);
array_shift($traceArr);
$tabs = sizeof($traceArr)-2;
foreach ($traceArr as $arr) {
$levels -= 1;
if ($levels < 0) break;
$args = array();
for ($i=0; $i < $tabs; $i++) $s .= ($html) ? ' &nbsp; ' : "\t";
$tabs -= 1;
if ($html) $s .= '<font face="Courier New,Courier">';
if (isset($arr['class'])) $s .= $arr['class'].'.';
if (isset($arr['args']))
foreach($arr['args'] as $v) {
if (is_null($v)) $args[] = 'null';
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 {
$v = (string) @$v;
$str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
if (strlen($v) > $MAXSTRLEN) $str .= '...';
$args[] = $str;
}
}
$s .= $arr['function'].'('.implode(', ',$args).')';
$s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file']));
$s .= "\n";
}
if ($html) $s .= '</pre>';
if ($printOrArr) print $s;
return $s;
}
?> ?>

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -230,6 +230,7 @@ class ADODB_Pager {
if (!$this->db->pageExecuteCountRows) return ''; if (!$this->db->pageExecuteCountRows) return '';
$lastPage = $this->rs->LastPageNo(); $lastPage = $this->rs->LastPageNo();
if ($lastPage == -1) $lastPage = 1; // check for empty rs. if ($lastPage == -1) $lastPage = 1; // check for empty rs.
if ($this->curr_page > $lastPage) $this->curr_page = 1;
return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>"; return "<font size=-1>$this->page ".$this->curr_page."/".$lastPage."</font>";
} }

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.
@ -622,7 +622,7 @@ Committed_AS: 348732 kB
if (empty($HTTP_GET_VARS['hidem'])) if (empty($HTTP_GET_VARS['hidem']))
echo "<table border=1 width=100% bgcolor=lightyellow><tr><td colspan=2> echo "<table border=1 width=100% bgcolor=lightyellow><tr><td colspan=2>
<b><a href=http://php.weblogs.com/adodb?perf=1>ADOdb</a> Performance Monitor</b> <font size=1>for $app</font></tr><tr><td> <b><a href=http://adodb.sourceforge.net/?perf=1>ADOdb</a> Performance Monitor</b> <font size=1>for $app</font></tr><tr><td>
<a href=?do=stats><b>Performance Stats</b></a> &nbsp; <a href=?do=viewsql><b>View SQL</b></a> <a href=?do=stats><b>Performance Stats</b></a> &nbsp; <a href=?do=viewsql><b>View SQL</b></a>
&nbsp; <a href=?do=tables><b>View Tables</b></a> &nbsp; <a href=?do=poll><b>Poll Stats</b></a>", &nbsp; <a href=?do=tables><b>View Tables</b></a> &nbsp; <a href=?do=poll><b>Poll Stats</b></a>",
$allowsql ? ' &nbsp; <a href=?do=dosql><b>Run SQL</b></a>' : '', $allowsql ? ' &nbsp; <a href=?do=dosql><b>Run SQL</b></a>' : '',

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -141,13 +141,13 @@ current timestamp is used. Unlike the function date(), it supports dates
outside the 1901 to 2038 range. outside the 1901 to 2038 range.
FUNCTION adodb_mktime($hr, $min, $sec, $month, $day, $year) FUNCTION adodb_mktime($hr, $min, $sec [, $month, $day, $year])
Converts a local date to a unix timestamp. Unlike the function mktime(), it supports Converts a local date to a unix timestamp. Unlike the function mktime(), it supports
dates outside the 1901 to 2038 range. Differs from mktime() in that all parameters dates outside the 1901 to 2038 range. Differs from mktime() in that all parameters
are currently compulsory. are currently compulsory.
FUNCTION adodb_gmmktime($hr, $min, $sec, $month, $day, $year) FUNCTION adodb_gmmktime($hr, $min, $sec [, $month, $day, $year])
Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports Converts a gmt date to a unix timestamp. Unlike the function gmmktime(), it supports
dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters dates outside the 1901 to 2038 range. Differs from gmmktime() in that all parameters
@ -174,6 +174,10 @@ c. Implement daylight savings, which looks awfully complicated, see
CHANGELOG CHANGELOG
- 18 July 2004 0.15
All params in adodb_mktime were formerly compulsory. Now only the hour, min, secs is compulsory. This
brings it more in line with mktime (still not identical).
- 23 June 2004 0.14 - 23 June 2004 0.14
Allow you to define your own daylights savings function, adodb_daylight_sv. Allow you to define your own daylights savings function, adodb_daylight_sv.
@ -271,7 +275,7 @@ First implementation.
/* /*
Version Number Version Number
*/ */
define('ADODB_DATE_VERSION',0.14); define('ADODB_DATE_VERSION',0.15);
/* /*
We check for Windows as only +ve ints are accepted as dates on Windows. We check for Windows as only +ve ints are accepted as dates on Windows.
@ -313,6 +317,9 @@ function adodb_date_test()
// This flag disables calling of PHP native functions, so we can properly test the code // This flag disables calling of PHP native functions, so we can properly test the code
if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1); if (!defined('ADODB_TEST_DATES')) define('ADODB_TEST_DATES',1);
$t = adodb_mktime(0,0,0);
if (!(adodb_date('Y-m-d') == date('Y-m-d'))) print 'Error in '.adodb_mktime(0,0,0).'<br>';
$t = adodb_mktime(0,0,0,6,1,2102); $t = adodb_mktime(0,0,0,6,1,2102);
if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>'; if (!(adodb_date('Y-m-d',$t) == '2102-06-01')) print 'Error in '.adodb_date('Y-m-d',$t).'<br>';
@ -428,7 +435,7 @@ function adodb_date_test()
// we generate a timestamp, convert it to a date, and convert it back to a timestamp // we generate a timestamp, convert it to a date, and convert it back to a timestamp
// and check if the roundtrip broke the original timestamp value. // and check if the roundtrip broke the original timestamp value.
print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: "; print "Testing $start to ".($start+$yrs).", or $max seconds, offset=$offset: ";
$cnt = 0;
for ($max += $i; $i < $max; $i += $offset) { for ($max += $i; $i < $max; $i += $offset) {
$ret = adodb_date('m,d,Y,H,i,s',$i); $ret = adodb_date('m,d,Y,H,i,s',$i);
$arr = explode(',',$ret); $arr = explode(',',$ret);
@ -443,8 +450,9 @@ function adodb_date_test()
$fail = true; $fail = true;
break; break;
} }
$cnt += 1;
} }
echo "Tested $cnt dates<br>";
if (!$fail) print "<p>Passed !</p>"; if (!$fail) print "<p>Passed !</p>";
else print "<p><b>Failed</b> :-(</p>"; else print "<p><b>Failed</b> :-(</p>";
} }
@ -717,6 +725,8 @@ function adodb_date2($fmt, $d=false, $is_gmt=false)
*/ */
function adodb_date($fmt,$d=false,$is_gmt=false) function adodb_date($fmt,$d=false,$is_gmt=false)
{ {
static $daylight;
if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt); if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt);
if (!defined('ADODB_TEST_DATES')) { if (!defined('ADODB_TEST_DATES')) {
if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
@ -728,7 +738,8 @@ function adodb_date($fmt,$d=false,$is_gmt=false)
$_day_power = 86400; $_day_power = 86400;
$arr = _adodb_getdate($d,true,$is_gmt); $arr = _adodb_getdate($d,true,$is_gmt);
if (function_exists('adodb_daylight_sv')) adodb_daylight_sv($arr, $is_gmt); if (!isset($daylight)) $daylight = function_exists('adodb_daylight_sv');
if ($daylight) adodb_daylight_sv($arr, $is_gmt);
$year = $arr['year']; $year = $arr['year'];
$month = $arr['mon']; $month = $arr['mon'];
@ -852,7 +863,7 @@ function adodb_date($fmt,$d=false,$is_gmt=false)
Returns a timestamp given a GMT/UTC time. Returns a timestamp given a GMT/UTC time.
Note that $is_dst is not implemented and is ignored. Note that $is_dst is not implemented and is ignored.
*/ */
function adodb_gmmktime($hr,$min,$sec,$mon,$day,$year,$is_dst=false) function adodb_gmmktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false)
{ {
return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true); return adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst,true);
} }
@ -863,13 +874,15 @@ function adodb_gmmktime($hr,$min,$sec,$mon,$day,$year,$is_dst=false)
Not a very fast algorithm - O(n) operation. Could be optimized to O(1). Not a very fast algorithm - O(n) operation. Could be optimized to O(1).
*/ */
function adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst=false,$is_gmt=false) function adodb_mktime($hr,$min,$sec,$mon=false,$day=false,$year=false,$is_dst=false,$is_gmt=false)
{ {
if (!defined('ADODB_TEST_DATES')) { if (!defined('ADODB_TEST_DATES')) {
// for windows, we don't check 1970 because with timezone differences, // for windows, we don't check 1970 because with timezone differences,
// 1 Jan 1970 could generate negative timestamp, which is illegal // 1 Jan 1970 could generate negative timestamp, which is illegal
if (!defined('ADODB_NO_NEGATIVE_TS') || ($year >= 1971)) if (1971 < $year && $year < 2038
if (1901 < $year && $year < 2038) || $mon === false
|| !defined('ADODB_NO_NEGATIVE_TS') && (1901 < $year && $year < 2038)
)
return $is_gmt? return $is_gmt?
@gmmktime($hr,$min,$sec,$mon,$day,$year): @gmmktime($hr,$min,$sec,$mon,$day,$year):
@mktime($hr,$min,$sec,$mon,$day,$year); @mktime($hr,$min,$sec,$mon,$day,$year);

View file

@ -4,31 +4,6 @@
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list
of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this l
ist of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of the ars Cognita, Inc., nor the names of its contributors may be used
to endorse or promote products derived from this software without specific prior
written permission.
DISCLAIMER:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WA
RRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIREC
T, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR P
ROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWI
SE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE P
OSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/ *******************************************************************************/
/** /**
* xmlschema is a class that allows the user to quickly and easily * xmlschema is a class that allows the user to quickly and easily
@ -104,6 +79,7 @@ if( !defined( 'XMLS_DEFAULT_UPGRADE_METHOD' ) ) {
*/ */
if( !defined( '_ADODB_LAYER' ) ) { if( !defined( '_ADODB_LAYER' ) ) {
require( 'adodb.inc.php' ); require( 'adodb.inc.php' );
require( 'adodb-datadict.inc.php' );
} }
/** /**
@ -274,7 +250,14 @@ class dbTable extends dbObject {
switch( $this->currentElement ) { switch( $this->currentElement ) {
case 'INDEX': case 'INDEX':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
xml_set_object( $parser, $this->addIndex( $attributes ) ); xml_set_object( $parser, $this->addIndex( $attributes ) );
}
break;
case 'DATA':
if( !isset( $attributes['PLATFORM'] ) OR $this->supportedPlatform( $attributes['PLATFORM'] ) ) {
xml_set_object( $parser, $this->addData( $attributes ) );
}
break; break;
case 'DROP': case 'DROP':
$this->drop(); $this->drop();
@ -304,6 +287,11 @@ class dbTable extends dbObject {
$this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] ); $this->addFieldOpt( $this->current_field, $this->currentElement, $attributes['VALUE'] );
break; break;
case 'DEFDATE':
case 'DEFTIMESTAMP':
// Add a field option to the table object
$this->addFieldOpt( $this->current_field, $this->currentElement );
break;
default: default:
// print_r( array( $tag, $attributes ) ); // print_r( array( $tag, $attributes ) );
} }
@ -318,6 +306,12 @@ class dbTable extends dbObject {
switch( $this->currentElement ) { switch( $this->currentElement ) {
// Table constraint // Table constraint
case 'CONSTRAINT': case 'CONSTRAINT':
if( isset( $this->current_field ) ) {
$this->addFieldOpt( $this->current_field, $this->currentElement, $cdata );
} else {
$this->addTableOpt( $cdata );
}
break;
// Table option // Table option
case 'OPT': case 'OPT':
$this->addTableOpt( $cdata ); $this->addTableOpt( $cdata );
@ -341,6 +335,10 @@ class dbTable extends dbObject {
xml_set_object( $parser, $this->parent ); xml_set_object( $parser, $this->parent );
$this->destroy(); $this->destroy();
break; break;
case 'FIELD':
unset($this->current_field);
break;
} }
} }
@ -356,6 +354,19 @@ class dbTable extends dbObject {
return $this->indexes[$name]; return $this->indexes[$name];
} }
/**
* Adds data to a table object
*
* @param array $attributes Data attributes
* @return object dbData object
*/
function &addData( $attributes ) {
if( !isset( $this->data ) ) {
$this->data =& new dbData( $this, $attributes );
}
return $this->data;
}
/** /**
* Adds a field to a table object * Adds a field to a table object
* *
@ -404,7 +415,7 @@ class dbTable extends dbObject {
// Set the field options // Set the field options
if( isset( $opts ) ) { if( isset( $opts ) ) {
$this->fields[$field_id]['OPTS'] = $opts; $this->fields[$field_id]['OPTS'][] = $opts;
} }
} }
@ -511,7 +522,7 @@ class dbTable extends dbObject {
if( is_array( $opt ) ) { if( is_array( $opt ) ) {
$key = key( $opt ); $key = key( $opt );
$value = $opt[key( $opt )]; $value = $opt[key( $opt )];
$fldarray[$field_id][$key] = $value; @$fldarray[$field_id][$key] .= $value;
// Option doesn't have arguments // Option doesn't have arguments
} else { } else {
$fldarray[$field_id][$opt] = $opt; $fldarray[$field_id][$opt] = $opt;
@ -548,6 +559,10 @@ class dbTable extends dbObject {
$sql[] = $index->create( $xmls ); $sql[] = $index->create( $xmls );
} }
if( isset( $this->data ) ) {
$sql[] = $this->data->create( $xmls );
}
return $sql; return $sql;
} }
@ -733,6 +748,192 @@ class dbIndex extends dbObject {
} }
} }
/**
* Creates a data object in ADOdb's datadict format
*
* This class stores information about table data.
*
* @package axmls
* @access private
*/
class dbData extends dbObject {
var $data = array();
var $row;
/**
* Initializes the new dbIndex object.
*
* @param object $parent Parent object
* @param array $attributes Attributes
*
* @internal
*/
function dbData( &$parent, $attributes = NULL ) {
$this->parent =& $parent;
}
/**
* XML Callback to process start elements
*
* Processes XML opening tags.
* Elements currently processed are: DROP, CLUSTERED, BITMAP, UNIQUE, FULLTEXT & HASH.
*
* @access private
*/
function _tag_open( &$parser, $tag, $attributes ) {
$this->currentElement = strtoupper( $tag );
switch( $this->currentElement ) {
case 'ROW':
$this->row = count( $this->data );
$this->data[$this->row] = array();
break;
case 'F':
$this->addField($attributes);
default:
// print_r( array( $tag, $attributes ) );
}
}
/**
* XML Callback to process CDATA elements
*
* Processes XML cdata.
*
* @access private
*/
function _tag_cdata( &$parser, $cdata ) {
switch( $this->currentElement ) {
// Index field name
case 'F':
$this->addData( $cdata );
break;
default:
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _tag_close( &$parser, $tag ) {
$this->currentElement = '';
switch( strtoupper( $tag ) ) {
case 'DATA':
xml_set_object( $parser, $this->parent );
break;
}
}
/**
* Adds a field to the index
*
* @param string $name Field name
* @return string Field list
*/
function addField( $attributes ) {
if( isset( $attributes['NAME'] ) ) {
$name = $attributes['NAME'];
} else {
$name = count($this->data[$this->row]);
}
// Set the field index so we know where we are
$this->current_field = $this->FieldID( $name );
}
/**
* Adds options to the index
*
* @param string $opt Comma-separated list of index options.
* @return string Option list
*/
function addData( $cdata ) {
if( !isset( $this->data[$this->row] ) ) {
$this->data[$this->row] = array();
}
if( !isset( $this->data[$this->row][$this->current_field] ) ) {
$this->data[$this->row][$this->current_field] = '';
}
$this->data[$this->row][$this->current_field] .= $cdata;
}
/**
* Generates the SQL that will create the index in the database
*
* @param object $xmls adoSchema object
* @return array Array containing index creation SQL
*/
function create( &$xmls ) {
$table = $xmls->dict->TableName($this->parent->name);
$table_field_count = count($this->parent->fields);
$sql = array();
// eliminate any columns that aren't in the table
foreach( $this->data as $row ) {
$table_fields = $this->parent->fields;
$fields = array();
foreach( $row as $field_id => $field_data ) {
if( !array_key_exists( $field_id, $table_fields ) ) {
if( is_numeric( $field_id ) ) {
$field_id = reset( array_keys( $table_fields ) );
} else {
continue;
}
}
$name = $table_fields[$field_id]['NAME'];
switch( $table_fields[$field_id]['TYPE'] ) {
case 'C':
case 'C2':
case 'X':
case 'X2':
$fields[$name] = $xmls->db->qstr( $field_data );
break;
case 'I':
case 'I1':
case 'I2':
case 'I4':
case 'I8':
$fields[$name] = intval($field_data);
break;
default:
$fields[$name] = $field_data;
}
unset($table_fields[$field_id]);
}
// check that at least 1 column is specified
if( empty( $fields ) ) {
continue;
}
// check that no required columns are missing
if( count( $fields ) < $table_field_count ) {
foreach( $table_fields as $field ) {
if( ( in_array( 'NOTNULL', $field['OPTS'] ) || in_array( 'KEY', $field['OPTS'] ) ) && !in_array( 'AUTOINCREMENT', $field['OPTS'] ) ) {
continue(2);
}
}
}
$sql[] = 'INSERT INTO '. $table .' ('. implode( ',', array_keys( $fields ) ) .') VALUES ('. implode( ',', $fields ) .')';
}
return $sql;
}
}
/** /**
* Creates the SQL to execute a list of provided SQL queries * Creates the SQL to execute a list of provided SQL queries
* *
@ -788,8 +989,6 @@ class dbQuerySet extends dbObject {
case 'NONE': case 'NONE':
$this->prefixMethod = 'NONE'; $this->prefixMethod = 'NONE';
break; break;
default:
$this->prefixMethod = 'AUTO';
} }
} }
@ -884,19 +1083,11 @@ class dbQuerySet extends dbObject {
* @return string SQL query string. * @return string SQL query string.
*/ */
function buildQuery( $sql = NULL ) { function buildQuery( $sql = NULL ) {
if( !isset( $this->query ) ) { if( !isset( $this->query ) OR empty( $sql ) ) {
return FALSE; return FALSE;
} }
if( empty( $sql ) ) { $this->query .= $sql;
return FALSE;
}
if( !empty( $this->query ) ) {
$this->query .= ' ';
}
$this->query .= trim( $sql );
return $this->query; return $this->query;
} }
@ -911,8 +1102,7 @@ class dbQuerySet extends dbObject {
return FALSE; return FALSE;
} }
$this->queries[] = $this->query; $this->queries[] = $return = trim($this->query);
$return = $this->query;
unset( $this->query ); unset( $this->query );
@ -933,9 +1123,9 @@ class dbQuerySet extends dbObject {
// Process object prefix. // Process object prefix.
// Evaluate SQL statements to prepend prefix to objects // Evaluate SQL statements to prepend prefix to objects
$query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query ); $query = $this->prefixQuery( '/^\s*((?is)INSERT\s+(INTO\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
$query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query ); $query = $this->prefixQuery( '/^\s*((?is)UPDATE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
$query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query ); $query = $this->prefixQuery( '/^\s*((?is)DELETE\s+(FROM\s+)?)((\w+\s*,?\s*)+)(\s.*$)/', $query, $xmls->objectPrefix );
// SELECT statements aren't working yet // SELECT statements aren't working yet
#$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data ); #$data = preg_replace( '/(?ias)(^\s*SELECT\s+.*\s+FROM)\s+(\W\s*,?\s*)+((?i)\s+WHERE.*$)/', "\1 $prefix\2 \3", $data );
@ -1099,8 +1289,8 @@ class adoSchema {
$this->mgq = get_magic_quotes_runtime(); $this->mgq = get_magic_quotes_runtime();
set_magic_quotes_runtime(0); set_magic_quotes_runtime(0);
$this->debug = $this->db->debug;
$this->db =& $db; $this->db =& $db;
$this->debug = $this->db->debug;
$this->dict = NewDataDictionary( $this->db ); $this->dict = NewDataDictionary( $this->db );
$this->sqlArray = array(); $this->sqlArray = array();
$this->schemaVersion = XMLS_SCHEMA_VERSION; $this->schemaVersion = XMLS_SCHEMA_VERSION;
@ -1204,10 +1394,11 @@ class adoSchema {
* @see ParseSchemaString() * @see ParseSchemaString()
* *
* @param string $file Name of XML schema file. * @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute * @return array Array of SQL queries, ready to execute
*/ */
function ParseSchema( $filename ) { function ParseSchema( $filename, $returnSchema = FALSE ) {
return $this->ParseSchemaString( $this->ConvertSchemaFile ( $filename ) ); return $this->ParseSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
} }
/** /**
@ -1217,12 +1408,13 @@ class adoSchema {
* and generate the SQL necessary to create the database described by the schema. * and generate the SQL necessary to create the database described by the schema.
* *
* @param string $file Name of XML schema file. * @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute. * @return array Array of SQL queries, ready to execute.
* *
* @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString() * @deprecated Replaced by adoSchema::ParseSchema() and adoSchema::ParseSchemaString()
* @see ParseSchema(), ParseSchemaString() * @see ParseSchema(), ParseSchemaString()
*/ */
function ParseSchemaFile( $filename ) { function ParseSchemaFile( $filename, $returnSchema = FALSE ) {
// Open the file // Open the file
if( !($fp = fopen( $filename, 'r' )) ) { if( !($fp = fopen( $filename, 'r' )) ) {
// die( 'Unable to open file' ); // die( 'Unable to open file' );
@ -1234,6 +1426,13 @@ class adoSchema {
return FALSE; return FALSE;
} }
if ( $returnSchema )
{
return $xmlstring;
}
$this->success = 2;
$xmlParser = $this->create_parser(); $xmlParser = $this->create_parser();
// Process the file // Process the file
@ -1260,9 +1459,10 @@ class adoSchema {
* @see ParseSchema() * @see ParseSchema()
* *
* @param string $xmlstring XML schema string. * @param string $xmlstring XML schema string.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute. * @return array Array of SQL queries, ready to execute.
*/ */
function ParseSchemaString( $xmlstring ) { function ParseSchemaString( $xmlstring, $returnSchema = FALSE ) {
if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) { if( !is_string( $xmlstring ) OR empty( $xmlstring ) ) {
return FALSE; return FALSE;
} }
@ -1272,10 +1472,15 @@ class adoSchema {
return FALSE; return FALSE;
} }
$xmlParser = $this->create_parser(); if ( $returnSchema )
{
return $xmlstring;
}
$this->success = 2; $this->success = 2;
$xmlParser = $this->create_parser();
if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) { if( !xml_parse( $xmlParser, $xmlstring, TRUE ) ) {
die( sprintf( die( sprintf(
"XML error: %s at line %d", "XML error: %s at line %d",
@ -1285,9 +1490,46 @@ class adoSchema {
} }
xml_parser_free( $xmlParser ); xml_parser_free( $xmlParser );
return $this->sqlArray; return $this->sqlArray;
} }
/**
* Loads an XML schema from a file and converts it to uninstallation SQL.
*
* Call this method to load the specified schema (see the DTD for the proper format) from
* the filesystem and generate the SQL necessary to remove the database described.
* @see RemoveSchemaString()
*
* @param string $file Name of XML schema file.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute
*/
function RemoveSchema( $filename, $returnSchema = FALSE ) {
return $this->RemoveSchemaString( $this->ConvertSchemaFile( $filename ), $returnSchema );
}
/**
* Converts an XML schema string to uninstallation SQL.
*
* Call this method to parse a string containing an XML schema (see the DTD for the proper format)
* and generate the SQL necessary to uninstall the database described by the schema.
* @see RemoveSchema()
*
* @param string $schema XML schema string.
* @param bool $returnSchema Return schema rather than parsing.
* @return array Array of SQL queries, ready to execute.
*/
function RemoveSchemaString( $schema, $returnSchema = FALSE ) {
// grab current version
if( !( $version = $this->SchemaStringVersion( $schema ) ) ) {
return FALSE;
}
return $this->ParseSchemaString( $this->TransformSchema( $schema, 'remove-' . $version), $returnSchema );
}
/** /**
* Applies the current XML schema to the database (post execution). * Applies the current XML schema to the database (post execution).
* *
@ -1448,38 +1690,12 @@ class adoSchema {
if( $version == $newVersion ) { if( $version == $newVersion ) {
$result = $schema; $result = $schema;
} else { } else {
// Fail if XSLT extension is not available $result = $this->TransformSchema( $schema, 'convert-' . $version . '-' . $newVersion);
if( ! function_exists( 'xslt_create' ) ) {
return FALSE;
} }
$xsl_file = dirname( __FILE__ ) . '/xsl/convert-' . $version . '-' . $newVersion . '.xsl'; if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite( $fp, $result );
// look for xsl fclose( $fp );
if( !is_readable( $xsl_file ) ) {
return FALSE;
}
$arguments = array (
'/_xml' => $schema,
'/_xsl' => file_get_contents ($xsl_file)
);
// create an XSLT processor
$xh = xslt_create ();
// set error handler
xslt_set_error_handler ($xh, array (&$this, 'xslt_error_handler'));
// process the schema
$result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
xslt_free ($xh);
}
if( is_string ($newFile) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite ($fp, $result);
fclose ($fp);
} }
return $result; return $result;
@ -1520,21 +1736,50 @@ class adoSchema {
$result = substr( $result, 3 ); $result = substr( $result, 3 );
} }
} else { } else {
$result = $this->TransformSchema( $filename, 'convert-' . $version . '-' . $newVersion, 'file' );
}
if( is_string( $result ) AND is_string( $newFile ) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite( $fp, $result );
fclose( $fp );
}
return $result;
}
function TransformSchema( $schema, $xsl, $schematype='string' )
{
// Fail if XSLT extension is not available // Fail if XSLT extension is not available
if( ! function_exists( 'xslt_create' ) ) { if( ! function_exists( 'xslt_create' ) ) {
return FALSE; return FALSE;
} }
$xsl_file = dirname( __FILE__ ) . '/xsl/convert-' . $version . '-' . $newVersion . '.xsl'; $xsl_file = dirname( __FILE__ ) . '/xsl/' . $xsl . '.xsl';
// look for xsl // look for xsl
if( !is_readable( $xsl_file ) ) { if( !is_readable( $xsl_file ) ) {
return FALSE; return FALSE;
} }
switch( $schematype )
{
case 'file':
if( !is_readable( $schema ) ) {
return FALSE;
}
$schema = file_get_contents( $schema );
break;
case 'string':
default:
if( !is_string( $schema ) ) {
return FALSE;
}
}
$arguments = array ( $arguments = array (
'/_xml' => file_get_contents ($filename), '/_xml' => $schema,
'/_xsl' => file_get_contents ($xsl_file) '/_xsl' => file_get_contents( $xsl_file )
); );
// create an XSLT processor // create an XSLT processor
@ -1547,12 +1792,6 @@ class adoSchema {
$result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments); $result = xslt_process ($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
xslt_free ($xh); xslt_free ($xh);
}
if( is_string ($newFile) AND ( $fp = fopen( $newFile, 'w' ) ) ) {
fwrite ($fp, $result);
fclose ($fp);
}
return $result; return $result;
} }
@ -1692,7 +1931,7 @@ class adoSchema {
} }
if( $details->primary_key ) { if( $details->primary_key ) {
$content[] = '<PRIMARY/>'; $content[] = '<KEY/>';
} elseif( $details->not_null ) { } elseif( $details->not_null ) {
$content[] = '<NOTNULL/>'; $content[] = '<NOTNULL/>';
} }
@ -1743,6 +1982,10 @@ class adoSchema {
$schema .= ' <data>' . "\n"; $schema .= ' <data>' . "\n";
while( $row = $rs->FetchRow() ) { while( $row = $rs->FetchRow() ) {
foreach( $row as $key => $val ) {
$row[$key] = htmlentities($row);
}
$schema .= ' <row><f>' . implode( '</f><f>', $row ) . '</f></row>' . "\n"; $schema .= ' <row><f>' . implode( '</f><f>', $row ) . '</f></row>' . "\n";
} }
@ -1780,7 +2023,7 @@ class adoSchema {
// prefix too long // prefix too long
case strlen( $prefix ) > XMLS_PREFIX_MAXLEN: case strlen( $prefix ) > XMLS_PREFIX_MAXLEN:
// prefix contains invalid characters // prefix contains invalid characters
case !preg_match( '/^[a-z][a-z0-9]+$/i', $prefix ): case !preg_match( '/^[a-z][a-z0-9_]+$/i', $prefix ):
logMsg( 'Invalid prefix: ' . $prefix ); logMsg( 'Invalid prefix: ' . $prefix );
return FALSE; return FALSE;
} }
@ -1931,8 +2174,8 @@ class adoSchema {
* *
* @access private * @access private
*/ */
function logMsg( $msg, $title = NULL ) { function logMsg( $msg, $title = NULL, $force = FALSE ) {
if( XMLS_DEBUG ) { if( XMLS_DEBUG or $force ) {
echo '<pre>'; echo '<pre>';
if( isset( $title ) ) { if( isset( $title ) ) {

View file

@ -224,7 +224,7 @@
var $substr = 'substr'; /// substring operator var $substr = 'substr'; /// substring operator
var $length = 'length'; /// string length operator var $length = 'length'; /// string length operator
var $random = 'rand()'; /// random function var $random = 'rand()'; /// random function
var $upperCase = false; /// uppercase function var $upperCase = 'upper'; /// uppercase function
var $fmtDate = "'Y-m-d'"; /// used by DBDate() as the default date format used by the database 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 A'"; /// used by DBTimeStamp as the default timestamp fmt. var $fmtTimeStamp = "'Y-m-d, h:i:s A'"; /// used by DBTimeStamp as the default timestamp fmt.
var $true = '1'; /// string that represents TRUE for a database var $true = '1'; /// string that represents TRUE for a database
@ -348,15 +348,17 @@
if ($newline) $msg .= "<br>\n"; if ($newline) $msg .= "<br>\n";
if (isset($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) echo $msg; if (isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']) || !$newline) echo $msg;
else echo strip_tags($msg); else echo strip_tags($msg);
if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // do not flush if output buffering enabled - useless - thx to Jesse Mullan
} }
function Time() function Time()
{ {
$rs =& $this->Execute("select $this->sysTimeStamp"); $rs =& $this->_Execute("select $this->sysTimeStamp");
if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields)); if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
return false; return false;
@ -617,7 +619,7 @@
For databases that require positioned params, eg $1, $2, $3 for postgresql, For databases that require positioned params, eg $1, $2, $3 for postgresql,
pass in Param(false) before setting the first parameter. pass in Param(false) before setting the first parameter.
*/ */
function Param($name) function Param($name,$type='C')
{ {
return '?'; return '?';
} }
@ -754,7 +756,9 @@
$ret =& $fn($this,$sql,$inputarr); $ret =& $fn($this,$sql,$inputarr);
if (isset($ret)) return $ret; if (isset($ret)) return $ret;
} }
if ($inputarr && is_array($inputarr)) { if ($inputarr) {
if (!is_array($inputarr)) $inputarr = array($inputarr);
$element0 = reset($inputarr); $element0 = reset($inputarr);
# is_object check because oci8 descriptors can be passed in # is_object check because oci8 descriptors can be passed in
$array_2d = is_array($element0) && !is_object(reset($element0)); $array_2d = is_array($element0) && !is_object(reset($element0));
@ -782,7 +786,7 @@
if ($i+1 != sizeof($sqlarr)) if ($i+1 != sizeof($sqlarr))
ADOConnection::outp( "Input Array does not match ?: ".htmlspecialchars($sql)); ADOConnection::outp( "Input Array does not match ?: ".htmlspecialchars($sql));
$ret =& $this->_Execute($sql,false); $ret =& $this->_Execute($sql);
if (!$ret) return $ret; if (!$ret) return $ret;
} }
} else { } else {
@ -803,60 +807,23 @@
return $ret; return $ret;
} }
function& _Execute($sql,$inputarr=false) function& _Execute($sql,$inputarr=false)
{ {
if ($this->debug) { if ($this->debug) {
global $HTTP_SERVER_VARS; global $ADODB_INCLUDED_LIB;
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
$ss = ''; $this->_queryID = _adodb_debug_execute($this, $sql,$inputarr);
if ($inputarr) {
foreach($inputarr as $kk=>$vv) {
if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...';
$ss .= "($kk=>'$vv') ";
}
$ss = "[ $ss ]";
}
$sqlTxt = str_replace(',',', ',is_array($sql) ?$sql[0] : $sql);
// check if running from browser or command-line
$inBrowser = isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']);
if ($inBrowser) {
if ($this->debug === -1)
ADOConnection::outp( "<br>\n($this->databaseType): ".htmlspecialchars($sqlTxt)." &nbsp; <code>$ss</code>\n<br>\n",false);
else
ADOConnection::outp( "<hr>\n($this->databaseType): ".htmlspecialchars($sqlTxt)." &nbsp; <code>$ss</code>\n<hr>\n",false);
} else { } else {
ADOConnection::outp("-----\n($this->databaseType): ".($sqlTxt)." \n-----\n",false); $this->_queryID = @$this->_query($sql,$inputarr);
}
$this->_queryID = $this->_query($sql,$inputarr);
/*
Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql
because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion
*/
if ($this->databaseType == 'mssql') {
// ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6
if($emsg = $this->ErrorMsg()) {
if ($err = $this->ErrorNo()) ADOConnection::outp($err.': '.$emsg);
}
} else if (!$this->_queryID) {
ADOConnection::outp($this->ErrorNo() .': '. $this->ErrorMsg());
}
} else {
//****************************
// non-debug version of query
//****************************
$this->_queryID =@$this->_query($sql,$inputarr);
} }
/************************ /************************
// OK, query executed // OK, query executed
*************************/ *************************/
if ($this->_queryID === false) { if ($this->_queryID === false) { // error handling if query fails
// error handling if query fails
if ($this->debug == 99) adodb_backtrace(true,5); if ($this->debug == 99) adodb_backtrace(true,5);
$fn = $this->raiseErrorFn; $fn = $this->raiseErrorFn;
if ($fn) { if ($fn) {
@ -866,12 +833,8 @@
return false; return false;
} }
if ($this->_queryID === true) { // return simplified recordset for inserts/updates/deletes with lower overhead
if ($this->_queryID === true) {
// return simplified empty recordset for inserts/updates/deletes with lower overhead
$rs =& new ADORecordSet_empty(); $rs =& new ADORecordSet_empty();
#if (is_array($sql)) $rs->sql = $sql[0];
#else $rs->sql = $sql;
return $rs; return $rs;
} }
@ -885,7 +848,7 @@
if ($rs->_numOfRows <= 0) { if ($rs->_numOfRows <= 0) {
global $ADODB_COUNTRECS; global $ADODB_COUNTRECS;
if ($ADODB_COUNTRECS) { if ($ADODB_COUNTRECS) {
if (!$rs->EOF){ if (!$rs->EOF) {
$rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql)); $rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql));
$rs->_queryID = $this->_queryID; $rs->_queryID = $this->_queryID;
} else } else
@ -1481,6 +1444,10 @@
} }
return; return;
} }
global $ADODB_INCLUDED_CSV;
if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
$f = $this->_gencachename($sql.serialize($inputarr),false); $f = $this->_gencachename($sql.serialize($inputarr),false);
adodb_write_file($f,''); // is adodb_write_file needed? adodb_write_file($f,''); // is adodb_write_file needed?
if (!@unlink($f)) { if (!@unlink($f)) {
@ -1631,7 +1598,7 @@
$forcenulls = defined('ADODB_FORCE_NULLS') ? true : false; $forcenulls = defined('ADODB_FORCE_NULLS') ? true : false;
} }
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php'); if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq); return _adodb_getupdatesql($this,$rs,$arrFields,$forceUpdate,$magicq,$forcenulls);
} }
@ -1650,7 +1617,7 @@
$forcenulls = defined('ADODB_FORCE_NULLS') ? true : false; $forcenulls = defined('ADODB_FORCE_NULLS') ? true : false;
} }
if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php'); if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_getinsertsql($this,$rs,$arrFields,$magicq); return _adodb_getinsertsql($this,$rs,$arrFields,$magicq,$forcenulls);
} }
@ -2505,7 +2472,10 @@
* @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. * or false if the data has less than 2 cols.
*/ */
function &GetAssoc($force_array = false, $first2cols = false) { function &GetAssoc($force_array = false, $first2cols = false)
{
global $ADODB_EXTENSION;
$cols = $this->_numOfFields; $cols = $this->_numOfFields;
if ($cols < 2) { if ($cols < 2) {
return false; return false;
@ -2514,6 +2484,19 @@
$results = array(); $results = array();
if (!$first2cols && ($cols > 2 || $force_array)) { if (!$first2cols && ($cols > 2 || $force_array)) {
if ($ADODB_EXTENSION) {
if ($numIndex) {
while (!$this->EOF) {
$results[trim($this->fields[0])] = array_slice($this->fields, 1);
adodb_movenext($this);
}
} else {
while (!$this->EOF) {
$results[trim(reset($this->fields))] = array_slice($this->fields, 1);
adodb_movenext($this);
}
}
} else {
if ($numIndex) { if ($numIndex) {
while (!$this->EOF) { while (!$this->EOF) {
$results[trim($this->fields[0])] = array_slice($this->fields, 1); $results[trim($this->fields[0])] = array_slice($this->fields, 1);
@ -2525,8 +2508,26 @@
$this->MoveNext(); $this->MoveNext();
} }
} }
}
} else { } else {
if ($ADODB_EXTENSION) {
// return scalar values // return scalar values
if ($numIndex) {
while (!$this->EOF) {
// some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
$results[trim(($this->fields[0]))] = $this->fields[1];
adodb_movenext($this);
}
} else {
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);
$results[$v1] = $v2;
adodb_movenext($this);
}
}
} else {
if ($numIndex) { if ($numIndex) {
while (!$this->EOF) { while (!$this->EOF) {
// some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string // some bug in mssql PHP 4.02 -- doesn't handle references properly so we FORCE creating a new string
@ -2543,6 +2544,7 @@
} }
} }
} }
}
return $results; return $results;
} }
@ -2730,6 +2732,7 @@
return false; return false;
} }
/** /**
* Random access to a specific row in the recordset. Some databases do not support * Random access to a specific row in the recordset. Some databases do not support
* access to previous rows in the databases (no scrolling backwards). * access to previous rows in the databases (no scrolling backwards).
@ -2989,7 +2992,8 @@
*/ */
function &FetchNextObj() function &FetchNextObj()
{ {
return $this->FetchNextObject(false); $o = $this->FetchNextObject(false);
return $o;
} }
@ -3415,6 +3419,7 @@
if (!$dbType) return false; if (!$dbType) return false;
$db = strtolower($dbType); $db = strtolower($dbType);
switch ($db) { switch ($db) {
case 'ifx':
case 'maxsql': $db = 'mysqlt'; break; case 'maxsql': $db = 'mysqlt'; break;
case 'postgres': case 'postgres':
case 'pgsql': $db = 'postgres7'; break; case 'pgsql': $db = 'postgres7'; break;
@ -3456,13 +3461,45 @@
if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2); if (!defined('ADODB_ASSOC_CASE')) define('ADODB_ASSOC_CASE',2);
$errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false; $errorfn = (defined('ADODB_ERROR_HANDLER')) ? ADODB_ERROR_HANDLER : false;
if (strpos($db,'://')) {
$origdsn = $db;
$dsna = @parse_url($db);
if (!$dsna) {
// special handling of oracle, which might not have host
$db = str_replace('@/','@adodb-fakehost/',$db);
$dsna = parse_url($db);
if (!$dsna) return false;
$dsna['host'] = '';
}
$db = @$dsna['scheme'];
if (!$db) return false;
$dsna['host'] = isset($dsna['host']) ? rawurldecode($dsna['host']) : '';
$dsna['user'] = isset($dsna['user']) ? rawurldecode($dsna['user']) : '';
$dsna['pass'] = isset($dsna['pass']) ? rawurldecode($dsna['pass']) : '';
$dsna['path'] = isset($dsna['path']) ? rawurldecode(substr($dsna['path'],1)) : '';
if (isset($dsna['query'])) {
$opt1 = explode('&',$dsna['query']);
foreach($opt1 as $k => $v) {
$arr = explode('=',$v);
$opt[$arr[0]] = isset($arr[1]) ? rawurldecode($arr[1]) : 1;
}
} else $opt = array();
}
/*
* phptype: Database backend used in PHP (mysql, odbc etc.)
* dbsyntax: Database used with regards to SQL syntax etc.
* protocol: Communication protocol to use (tcp, unix etc.)
* hostspec: Host specification (hostname[:port])
* database: Database to use on the DBMS server
* username: User name for login
* password: Password for login
*/
if (!empty($ADODB_NEWCONNECTION)) { if (!empty($ADODB_NEWCONNECTION)) {
$obj = $ADODB_NEWCONNECTION($db); $obj = $ADODB_NEWCONNECTION($db);
if ($obj) {
if ($errorfn) $obj->raiseErrorFn = $errorfn; } else {
return $obj;
}
}
if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = ''; if (!isset($ADODB_LASTDB)) $ADODB_LASTDB = '';
if (empty($db)) $db = $ADODB_LASTDB; if (empty($db)) $db = $ADODB_LASTDB;
@ -3470,11 +3507,12 @@
if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db); if ($db != $ADODB_LASTDB) $db = ADOLoadCode($db);
if (!$db) { if (!$db) {
if (isset($origdsn)) $db = $origdsn;
if ($errorfn) { if ($errorfn) {
// raise an error // raise an error
$ignore = false; $ignore = false;
$errorfn('ADONewConnection', 'ADONewConnection', -998, $errorfn('ADONewConnection', 'ADONewConnection', -998,
"could not load the database driver for '$db", "could not load the database driver for '$db'",
$db,false,$ignore); $db,false,$ignore);
} else } else
ADOConnection::outp( "<p>ADONewConnection: Unable to load database driver '$db'</p>",false); ADOConnection::outp( "<p>ADONewConnection: Unable to load database driver '$db'</p>",false);
@ -3489,11 +3527,45 @@
} }
$obj =& new $cls(); $obj =& new $cls();
if ($errorfn) $obj->raiseErrorFn = $errorfn; }
# constructor should not fail
if ($obj) {
if ($errorfn) $obj->raiseErrorFn = $errorfn;
if (isset($dsna)) {
foreach($opt as $k => $v) {
switch(strtolower($k)) {
case 'persist':
case 'persistent': $persist = $v; break;
case 'debug': $obj->debug = (integer) $v; break;
#ibase
case 'dialect': $obj->dialect = (integer) $v; break;
case 'charset': $obj->charset = $v; break;
case 'buffers': $obj->buffers = $v; break;
case 'fetchmode': $obj->SetFetchMode($v); break;
#ado
case 'charpage': $obj->charPage = $v; break;
#mysql, mysqli
case 'clientflags': $obj->clientFlags = $v; break;
#mysqli
case 'port': $obj->port = $v; break;
case 'socket': $obj->socket = $v; break;
}
}
if (empty($persist))
$ok = $obj->Connect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
else
$ok = $obj->PConnect($dsna['host'], $dsna['user'], $dsna['pass'], $dsna['path']);
if (!$ok) return false;
}
}
return $obj; return $obj;
} }
// $perf == true means called by NewPerfMonitor() // $perf == true means called by NewPerfMonitor()
function _adodb_getdriver($provider,$drivername,$perf=false) function _adodb_getdriver($provider,$drivername,$perf=false)
{ {
@ -3559,56 +3631,6 @@
} }
/**
* 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
# modified the file exclusively.
# What a stupid need - having to simulate locking.
# Risks:
# 1. $tempfile name is not unique -- very very low
# 2. unlink($filename) fails -- ok, rename will fail
# 3. adodb reads stale file because unlink fails -- ok, $rs timeout occurs
# 4. another process creates $filename between unlink() and rename() -- ok, rename() fails and cache updated
if (strncmp(PHP_OS,'WIN',3) === 0) {
// skip the decimal place
$mtime = substr(str_replace(' ','_',microtime()),2);
// getmypid() actually returns 0 on Win98 - never mind!
$tmpname = $filename.uniqid($mtime).getmypid();
if (!($fd = fopen($tmpname,'a'))) return false;
$ok = ftruncate($fd,0);
if (!fwrite($fd,$contents)) $ok = false;
fclose($fd);
chmod($tmpname,0644);
// the tricky moment
@unlink($filename);
if (!@rename($tmpname,$filename)) {
unlink($tmpname);
$ok = false;
}
if (!$ok) {
if ($debug) ADOConnection::outp( " Rename $tmpname ".($ok? 'ok' : 'failed'));
}
return $ok;
}
if (!($fd = fopen($filename, 'a'))) return false;
if (flock($fd, LOCK_EX) && ftruncate($fd, 0)) {
$ok = fwrite( $fd, $contents );
fclose($fd);
chmod($filename,0644);
}else {
fclose($fd);
if ($debug)ADOConnection::outp( " Failed acquiring lock for $filename<br>\n");
$ok = false;
}
return $ok;
}
/* /*
Perform a print_r, with pre tags for better formatting. Perform a print_r, with pre tags for better formatting.
@ -3629,54 +3651,9 @@
*/ */
function adodb_backtrace($printOrArr=true,$levels=9999) function adodb_backtrace($printOrArr=true,$levels=9999)
{ {
$s = ''; global $ADODB_INCLUDED_LIB;
if (PHPVERSION() < 4.3) return; if (empty($ADODB_INCLUDED_LIB)) include_once(ADODB_DIR.'/adodb-lib.inc.php');
return _adodb_backtrace($printOrArr,$levels);
$html = (isset($_SERVER['HTTP_USER_AGENT']));
$fmt = ($html) ? "</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" : "%% line %4d, file: %s";
$MAXSTRLEN = 64;
$s = ($html) ? '<pre align=left>' : '';
if (is_array($printOrArr)) $traceArr = $printOrArr;
else $traceArr = debug_backtrace();
array_shift($traceArr);
$tabs = sizeof($traceArr)-1;
foreach ($traceArr as $arr) {
$levels -= 1;
if ($levels < 0) break;
$args = array();
for ($i=0; $i < $tabs; $i++) $s .= ($html) ? ' &nbsp; ' : "\t";
$tabs -= 1;
if ($html) $s .= '<font face="Courier New,Courier">';
if (isset($arr['class'])) $s .= $arr['class'].'.';
if (isset($arr['args']))
foreach($arr['args'] as $v) {
if (is_null($v)) $args[] = 'null';
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 {
$v = (string) @$v;
$str = htmlspecialchars(substr($v,0,$MAXSTRLEN));
if (strlen($v) > $MAXSTRLEN) $str .= '...';
$args[] = $str;
}
}
$s .= $arr['function'].'('.implode(', ',$args).')';
$s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file']));
$s .= "\n";
}
if ($html) $s .= '</pre>';
if ($printOrArr) print $s;
return $s;
} }
} // defined } // defined

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/** /**
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -550,11 +550,15 @@ class ADORecordSet_ado extends ADORecordSet {
if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) { for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';
switch($t) { switch($t) {
case 135: // timestamp case 135: // timestamp
if (!strlen((string)$f->value)) $this->fields[] = false; if (!strlen((string)$f->value)) $this->fields[] = false;
else $this->fields[] = adodb_date('Y-m-d H:i:s',(float)$f->value); else {
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
else $val = $f->value;
$this->fields[] = adodb_date('Y-m-d H:i:s',$val);
}
break; break;
case 133:// A date value (yyyymmdd) case 133:// A date value (yyyymmdd)
if ($val = $f->value) { if ($val = $f->value) {
@ -564,7 +568,13 @@ class ADORecordSet_ado extends ADORecordSet {
break; break;
case 7: // adDate case 7: // adDate
if (!strlen((string)$f->value)) $this->fields[] = false; if (!strlen((string)$f->value)) $this->fields[] = false;
else $this->fields[] = adodb_date('Y-m-d',(float)$f->value); else {
if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);
else $val = $f->value;
if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);
else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);
}
break; break;
case 1: // null case 1: // null
$this->fields[] = false; $this->fields[] = false;

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -34,7 +34,6 @@ class ADODB_ado_mssql extends ADODB_ado {
var $ansiOuter = true; // for mssql7 or later var $ansiOuter = true; // for mssql7 or later
var $substr = "substring"; var $substr = "substring";
var $length = 'len'; var $length = 'len';
var $upperCase = 'upper';
//var $_inTransaction = 1; // always open recordsets, so no transaction problems. //var $_inTransaction = 1; // always open recordsets, so no transaction problems.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -101,9 +101,8 @@ class ADODB_DB2 extends ADODB_odbc {
var $fmtTimeStamp = "'Y-m-d-H.i.s'"; var $fmtTimeStamp = "'Y-m-d-H.i.s'";
var $ansiOuter = true; var $ansiOuter = true;
var $identitySQL = 'values IDENTITY_VAL_LOCAL()'; var $identitySQL = 'values IDENTITY_VAL_LOCAL()';
var $_bindInputArray = false; var $_bindInputArray = true;
var $upperCase = 'upper'; var $hasInsertID = true;
function ADODB_DB2() function ADODB_DB2()
{ {
@ -135,13 +134,13 @@ class ADODB_DB2 extends ADODB_odbc {
return $this->GetOne("select 1 as ignore from $tables where $where for update"); return $this->GetOne("select 1 as ignore from $tables where $where for update");
} }
function &MetaTables($ttype=false,$showSchema=false) function &MetaTables($ttype=false,$showSchema=false, $qtable="%", $qschema="%")
{ {
global $ADODB_FETCH_MODE; global $ADODB_FETCH_MODE;
$savem = $ADODB_FETCH_MODE; $savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = odbc_tables($this->_connectionID); $qid = odbc_tables($this->_connectionID, "", $qschema, $qtable, "");
$rs = new ADORecordSet_odbc($qid); $rs = new ADORecordSet_odbc($qid);
@ -177,6 +176,7 @@ class ADODB_DB2 extends ADODB_odbc {
return $arr2; return $arr2;
} }
// Format date column in sql string given an input format that understands Y M D // Format date column in sql string given an input format that understands Y M D
function SQLDate($fmt, $col=false) function SQLDate($fmt, $col=false)
{ {

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -58,6 +58,45 @@ class ADODB_ibase extends ADOConnection {
if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT; if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT;
} }
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false)
{
if (!function_exists('ibase_pconnect')) return null;
if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
$fn = ($persist) ? 'ibase_pconnect':'ibase_connect';
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
$this->charSet,$this->buffers,$this->dialect);
if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html
$this->replaceQuote = "''";
}
if ($this->_connectionID === false) {
$this->_handleerror();
return false;
}
// PHP5 change.
if (function_exists('ibase_timefmt')) {
ibase_timefmt($this->ibase_datefmt,IBASE_DATE );
if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP );
else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP );
ibase_timefmt($this->ibase_timefmt,IBASE_TIME );
} else {
ini_set("ibase.timestampformat", $this->ibase_timestampfmt);
ini_set("ibase.dateformat", $this->ibase_datefmt);
ini_set("ibase.timeformat", $this->ibase_timefmt);
}
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true);
}
function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false) function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false)
{ {
if ($internalKey) return array('RDB$DB_KEY'); if ($internalKey) return array('RDB$DB_KEY');
@ -257,48 +296,6 @@ class ADODB_ibase extends ADOConnection {
return $this->_errorMsg; return $this->_errorMsg;
} }
// returns true or false
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$persist=false)
{
if (!function_exists('ibase_pconnect')) return null;
if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
$fn = ($persist) ? 'ibase_pconnect':'ibase_connect';
$this->_connectionID = $fn($argHostname,$argUsername,$argPassword,
$this->charSet,$this->buffers,$this->dialect);
if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html
$this->replaceQuote = "''";
}
if ($this->_connectionID === false) {
$this->_handleerror();
return false;
}
// PHP5 change.
if (function_exists('ibase_timefmt')) {
ibase_timefmt($this->ibase_datefmt,IBASE_DATE );
if ($this->dialect == 1) ibase_timefmt($this->ibase_datefmt,IBASE_TIMESTAMP );
else ibase_timefmt($this->ibase_timestampfmt,IBASE_TIMESTAMP );
ibase_timefmt($this->ibase_timefmt,IBASE_TIME );
} else {
ini_set("ibase.timestampformat", $this->base_timestampfmt);
ini_set("ibase.dateformat", $this->ibase_datefmt);
ini_set("ibase.timeformat", $this->ibase_timefmt);
}
//you can use
/*
ini_set("ibase.timestampformat", $this->ibase_timestampfmt);
ini_set("ibase.dateformat", $this->ibase_datefmt);
ini_set("ibase.timeformat", $this->ibase_timefmt);
*/
return true;
}
// returns true or false
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,true);
}
function Prepare($sql) function Prepare($sql)
{ {
$stmt = ibase_prepare($this->_connectionID,$sql); $stmt = ibase_prepare($this->_connectionID,$sql);

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim. All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim. All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -27,7 +27,6 @@ class ADODB_informix72 extends ADOConnection {
var $fmtTimeStamp = "'Y-m-d H:i:s'"; var $fmtTimeStamp = "'Y-m-d H:i:s'";
var $hasInsertID = true; var $hasInsertID = true;
var $hasAffectedRows = true; var $hasAffectedRows = true;
var $upperCase = 'upper';
var $substr = 'substr'; var $substr = 'substr';
var $metaTablesSQL="select tabname from systables where tabtype!=' ' and owner!='informix'"; //Don't get informix tables and pseudo-tables var $metaTablesSQL="select tabname from systables where tabtype!=' ' and owner!='informix'"; //Don't get informix tables and pseudo-tables

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -79,7 +79,6 @@ class ADODB_mssql extends ADOConnection {
var $hasInsertID = true; var $hasInsertID = true;
var $substr = "substring"; var $substr = "substring";
var $length = 'len'; var $length = 'len';
var $upperCase = 'upper';
var $hasAffectedRows = true; var $hasAffectedRows = true;
var $metaDatabasesSQL = "select name from sysdatabases where name <> 'master'"; var $metaDatabasesSQL = "select name from sysdatabases where name <> 'master'";
var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))"; var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))";
@ -376,14 +375,25 @@ order by constraint_name, referenced_table_name, keyno";
// "Stein-Aksel Basma" <basma@accelero.no> // "Stein-Aksel Basma" <basma@accelero.no>
// tested with MSSQL 2000 // tested with MSSQL 2000
function MetaPrimaryKeys($table) function &MetaPrimaryKeys($table)
{ {
$sql = "select k.column_name from information_schema.key_column_usage k, global $ADODB_FETCH_MODE;
$schema = '';
$this->_findschema($table,$schema);
if (!$schema) $schema = $this->database;
if ($schema) $schema = "and k.table_catalog like '$schema%'";
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
information_schema.table_constraints tc information_schema.table_constraints tc
where tc.constraint_name = k.constraint_name and tc.constraint_type = where tc.constraint_name = k.constraint_name and tc.constraint_type =
'PRIMARY KEY' and k.table_name = '$table'"; 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$a = $this->GetCol($sql); $a = $this->GetCol($sql);
$ADODB_FETCH_MODE = $savem;
if ($a && sizeof($a)>0) return $a; if ($a && sizeof($a)>0) return $a;
return false; return false;
} }
@ -552,6 +562,11 @@ order by constraint_name, referenced_table_name, keyno";
*/ */
function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB') function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
{ {
if (strtoupper($blobtype) == 'CLOB') {
$sql = "UPDATE $table SET $column='" . $val . "' WHERE $where";
return $this->Execute($sql) != false;
}
$sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where"; $sql = "UPDATE $table SET $column=0x".bin2hex($val)." WHERE $where";
return $this->Execute($sql) != false; return $this->Execute($sql) != false;
} }
@ -589,9 +604,15 @@ order by constraint_name, referenced_table_name, keyno";
} else if (is_integer($v)) { } else if (is_integer($v)) {
$decl .= "@P$i INT"; $decl .= "@P$i INT";
$params .= "@P$i=".$v; $params .= "@P$i=".$v;
} else { } else if (is_float($v)) {
$decl .= "@P$i FLOAT"; $decl .= "@P$i FLOAT";
$params .= "@P$i=".$v; $params .= "@P$i=".$v;
} else if (is_bool($v)) {
$decl .= "@P$i INT"; # Used INT just in case BIT in not supported on the user's MSSQL version. It will cast appropriately.
$params .= "@P$i=".(($v)?'1':'0'); # True == 1 in MSSQL BIT fields and acceptable for storing logical true in an int field
} else {
$decl .= "@P$i CHAR"; # Used char because a type is required even when the value is to be NULL.
$params .= "@P$i=NULL";
} }
$i += 1; $i += 1;
} }

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -29,7 +29,6 @@ class ADODB_mysql extends ADOConnection {
var $hasLimit = true; var $hasLimit = true;
var $hasMoveFirst = true; var $hasMoveFirst = true;
var $hasGenID = true; var $hasGenID = true;
var $upperCase = 'upper';
var $isoDates = true; // accepts dates in ISO format var $isoDates = true; // accepts dates in ISO format
var $sysDate = 'CURDATE()'; var $sysDate = 'CURDATE()';
var $sysTimeStamp = 'NOW()'; var $sysTimeStamp = 'NOW()';
@ -42,6 +41,7 @@ class ADODB_mysql extends ADOConnection {
function ADODB_mysql() function ADODB_mysql()
{ {
if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
} }
function ServerInfo() function ServerInfo()
@ -166,6 +166,11 @@ class ADODB_mysql extends ADOConnection {
return false; return false;
} }
function BeginTrans()
{
if ($this->debug) ADOConnection::outp("Transactions not supported in 'mysql' driver. Use 'mysqlt' or 'mysqli' driver");
}
function _affectedrows() function _affectedrows()
{ {
return mysql_affected_rows($this->_connectionID); return mysql_affected_rows($this->_connectionID);
@ -239,18 +244,22 @@ class ADODB_mysql extends ADOConnection {
for ($i=0; $i < $len; $i++) { for ($i=0; $i < $len; $i++) {
$ch = $fmt[$i]; $ch = $fmt[$i];
switch($ch) { switch($ch) {
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
/** FALL THROUGH */
case '-':
case '/':
$s .= $ch;
break;
case 'Y': case 'Y':
case 'y': case 'y':
$s .= '%Y'; $s .= '%Y';
break; break;
case 'Q':
case 'q':
$s .= "'),Quarter($col)";
if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
else $s .= ",('";
$concat = true;
break;
case 'M': case 'M':
$s .= '%b'; $s .= '%b';
break; break;
@ -263,6 +272,15 @@ class ADODB_mysql extends ADOConnection {
$s .= '%d'; $s .= '%d';
break; break;
case 'Q':
case 'q':
$s .= "'),Quarter($col)";
if ($len > $i+1) $s .= ",DATE_FORMAT($col,'";
else $s .= ",('";
$concat = true;
break;
case 'H': case 'H':
$s .= '%H'; $s .= '%H';
break; break;
@ -284,14 +302,7 @@ class ADODB_mysql extends ADOConnection {
$s .= '%p'; $s .= '%p';
break; break;
default:
if ($ch == '\\') {
$i++;
$ch = substr($fmt,$i,1);
}
$s .= $ch;
break;
} }
} }
$s.="')"; $s.="')";
@ -449,7 +460,6 @@ class ADODB_mysql extends ADOConnection {
return $rs; return $rs;
} }
// returns queryID or false // returns queryID or false
function _query($sql,$inputarr) function _query($sql,$inputarr)
{ {
@ -477,8 +487,6 @@ class ADODB_mysql extends ADOConnection {
else return @mysql_errno($this->_connectionID); else return @mysql_errno($this->_connectionID);
} }
// returns true or false // returns true or false
function _close() function _close()
{ {
@ -509,6 +517,7 @@ class ADODB_mysql extends ADOConnection {
Class Name: Recordset Class Name: Recordset
--------------------------------------------------------------------------------------*/ --------------------------------------------------------------------------------------*/
class ADORecordSet_mysql extends ADORecordSet{ class ADORecordSet_mysql extends ADORecordSet{
var $databaseType = "mysql"; var $databaseType = "mysql";
@ -587,27 +596,18 @@ class ADORecordSet_mysql extends ADORecordSet{
return @mysql_data_seek($this->_queryID,$row); return @mysql_data_seek($this->_queryID,$row);
} }
// 10% speedup to move MoveNext to child class
function MoveNext() function MoveNext()
{ {
//global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return adodb_movenext($this); //return adodb_movenext($this);
//if (defined('ADODB_EXTENSION')) return adodb_movenext($this);
if ($this->EOF) return false; if (@$this->fields =& mysql_fetch_array($this->_queryID,$this->fetchMode)) {
$this->_currentRow += 1;
$this->_currentRow++; return true;
$this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode); }
if (is_array($this->fields)) return true; if (!$this->EOF) {
$this->_currentRow += 1;
$this->EOF = true; $this->EOF = true;
/* -- tested raising an error -- appears pointless
$conn = $this->connection;
if ($conn && $conn->raiseErrorFn && ($errno = $conn->ErrorNo())) {
$fn = $conn->raiseErrorFn;
$fn($conn->databaseType,'MOVENEXT',$errno,$conn->ErrorMsg().' ('.$this->sql.')',$conn->host,$conn->database);
} }
*/
return false; return false;
} }
@ -676,5 +676,32 @@ class ADORecordSet_mysql extends ADORecordSet{
} }
} }
class ADORecordSet_ext_mysql extends ADORecordSet_mysql {
function ADORecordSet_ext_mysql($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
default:
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:$this->fetchMode = MYSQL_BOTH; break;
}
$this->ADORecordSet($queryID);
}
function MoveNext()
{
return adodb_movenext($this);
}
}
} }
?> ?>

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -30,7 +30,6 @@ class ADODB_mysqli extends ADOConnection {
var $hasLimit = true; var $hasLimit = true;
var $hasMoveFirst = true; var $hasMoveFirst = true;
var $hasGenID = true; var $hasGenID = true;
var $upperCase = 'upper';
var $isoDates = true; // accepts dates in ISO format var $isoDates = true; // accepts dates in ISO format
var $sysDate = 'CURDATE()'; var $sysDate = 'CURDATE()';
var $sysTimeStamp = 'NOW()'; var $sysTimeStamp = 'NOW()';
@ -39,16 +38,73 @@ class ADODB_mysqli extends ADOConnection {
var $poorAffectedRows = true; var $poorAffectedRows = true;
var $clientFlags = 0; var $clientFlags = 0;
var $substr = "substring"; var $substr = "substring";
//var $poorAffectedRows = true; var $port = false;
var $socket = false;
var $_bindInputArray = false;
var $nameQuote = '`'; /// string to use to quote identifiers and names var $nameQuote = '`'; /// string to use to quote identifiers and names
//var $_bindInputArray = true;
function ADODB_mysqli() function ADODB_mysqli()
{ {
if(!extension_loaded("mysqli")) if(!extension_loaded("mysqli"))
{
trigger_error("You must have the MySQLi extension.", E_USER_ERROR); trigger_error("You must have the MySQLi extension.", E_USER_ERROR);
} }
// returns true or false
// To add: parameter int $port,
// parameter string $socket
function _connect($argHostname = NULL,
$argUsername = NULL,
$argPassword = NULL,
$argDatabasename = NULL, $persist=false)
{
$this->_connectionID = @mysqli_init();
if (is_null($this->_connectionID)) {
// mysqli_init only fails if insufficient memory
if ($this->debug)
ADOConnection::outp("mysqli_init() failed : " . $this->ErrorMsg());
return false;
}
// Set connection options
// Not implemented now
// mysqli_options($this->_connection,,);
if (mysqli_real_connect($this->_connectionID,
$argHostname,
$argUsername,
$argPassword,
$argDatabasename,
$this->port,
$this->socket,
$this->clientFlags))
{
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
else {
if ($this->debug)
ADOConnection::outp("Could't connect : " . $this->ErrorMsg());
return false;
}
}
// returns true or false
// How to force a persistent connection
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename, true);
}
// When is this used? Close old connection first?
// In _connect(), check $this->forceNewConnect?
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
$this->forceNewConnect = true;
$this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
} }
function IfNull( $field, $ifNull ) function IfNull( $field, $ifNull )
@ -329,70 +385,6 @@ class ADODB_mysqli extends ADOConnection {
return "from_unixtime(unix_timestamp($date)+($dayFraction)*24*3600)"; return "from_unixtime(unix_timestamp($date)+($dayFraction)*24*3600)";
} }
// returns true or false
// To add: parameter int $port,
// parameter string $socket
function _connect($argHostname = NULL,
$argUsername = NULL,
$argPassword = NULL,
$argDatabasename = NULL)
{
// @ means: error surpression on
$this->_connectionID = @mysqli_init();
if (is_null($this->_connectionID))
{
// mysqli_init only fails if insufficient memory
if ($this->debug)
ADOConnection::outp("mysqli_init() failed : " . $this->ErrorMsg());
return false;
}
// Set connection options
// Not implemented now
// mysqli_options($this->_connection,,);
if (mysqli_real_connect($this->_connectionID,
$argHostname,
$argUsername,
$argPassword,
$argDatabasename))
{
if ($argDatabasename)
{
return $this->SelectDB($argDatabasename);
}
return true;
}
else
{
if ($this->debug)
ADOConnection::outp("Could't connect : " . $this->ErrorMsg());
return false;
}
}
// returns true or false
// How to force a persistent connection
function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
// not implemented in mysqli (yet)?
$this->_connectionID = mysqli_connect($argHostname,
$argUsername,
$argPassword,
$argDatabasename);
if ($this->_connectionID === false) return false;
// if ($this->autoRollback) $this->RollbackTrans();
if ($argDatabasename) return $this->SelectDB($argDatabasename);
return true;
}
// When is this used? Close old connection first?
// In _connect(), check $this->forceNewConnect?
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
$this->forceNewConnect = true;
$this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename);
}
function &MetaColumns($table) function &MetaColumns($table)
{ {
@ -539,8 +531,11 @@ class ADODB_mysqli extends ADOConnection {
{ {
return $sql; return $sql;
$stmt = mysqli_prepare($this->_connectionID,$sql); $stmt = $this->_connectionID->prepare($sql);
if (!$stmt) return false; if (!$stmt) {
echo $this->ErrorMsg();
return $sql;
}
return array($sql,$stmt); return array($sql,$stmt);
} }
@ -552,15 +547,17 @@ class ADODB_mysqli extends ADOConnection {
if (is_array($sql)) { if (is_array($sql)) {
$stmt = $sql[1]; $stmt = $sql[1];
$a = '';
foreach($inputarr as $k => $v) { foreach($inputarr as $k => $v) {
if (is_string($v)) $a[] = MYSQLI_BIND_STRING; if (is_string($v)) $a .= 's';
else if (is_integer($v)) $a[] = MYSQLI_BIND_INT; else if (is_integer($v)) $a .= 'i';
else $a[] = MYSQLI_BIND_DOUBLE; else $a .= 'd';
}
$fnarr =& array_merge( array($stmt,$a) , $inputarr); $fnarr =& array_merge( array($stmt,$a) , $inputarr);
$ret = call_user_func_array('mysqli_bind_param',$fnarr); $ret = call_user_func_array('mysqli_stmt_bind_param',$fnarr);
}
$ret = mysqli_execute($stmt); $ret = mysqli_stmt_execute($stmt);
return $ret; return $ret;
} }
if (!$mysql_res = mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) { if (!$mysql_res = mysqli_query($this->_connectionID, $sql, ($ADODB_COUNTRECS) ? MYSQLI_STORE_RESULT : MYSQLI_USE_RESULT)) {

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -25,6 +25,11 @@ class ADODB_mysqlt extends ADODB_mysql {
var $hasTransactions = true; var $hasTransactions = true;
var $autoRollback = true; // apparently mysql does not autorollback properly var $autoRollback = true; // apparently mysql does not autorollback properly
function ADODB_mysqlt()
{
global $ADODB_EXTENSION; if ($ADODB_EXTENSION) $this->rsPrefix .= 'ext_';
}
function BeginTrans() function BeginTrans()
{ {
if ($this->transOff) return true; if ($this->transOff) return true;
@ -59,21 +64,62 @@ class ADODB_mysqlt extends ADODB_mysql {
class ADORecordSet_mysqlt extends ADORecordSet_mysql{ class ADORecordSet_mysqlt extends ADORecordSet_mysql{
var $databaseType = "mysqlt"; var $databaseType = "mysqlt";
function ADORecordSet_mysqlt($queryID,$mode=false) { function ADORecordSet_mysqlt($queryID,$mode=false)
return $this->ADORecordSet_mysql($queryID,$mode); {
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
default:
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:$this->fetchMode = MYSQL_BOTH; break;
}
$this->ADORecordSet($queryID);
} }
function MoveNext() function MoveNext()
{ {
if ($this->EOF) return false; if (@$this->fields =& mysql_fetch_array($this->_queryID,$this->fetchMode)) {
$this->_currentRow += 1;
$this->_currentRow++; return true;
// using & below slows things down by 20%! }
$this->fields = @mysql_fetch_array($this->_queryID,$this->fetchMode); if (!$this->EOF) {
if ($this->fields) return true; $this->_currentRow += 1;
$this->EOF = true; $this->EOF = true;
}
return false; return false;
} }
} }
class ADORecordSet_ext_mysqlt extends ADORecordSet_mysqlt {
function ADORecordSet_ext_mysqli($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
case ADODB_FETCH_NUM: $this->fetchMode = MYSQL_NUM; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = MYSQL_ASSOC; break;
default:
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:$this->fetchMode = MYSQL_BOTH; break;
}
$this->ADORecordSet($queryID);
}
function MoveNext()
{
return adodb_movenext($this);
}
}
?> ?>

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved.
First cut at the Netezza Driver by Josh Eldridge joshuae74#hotmail.com First cut at the Netezza Driver by Josh Eldridge joshuae74#hotmail.com
Based on the previous postgres drivers. Based on the previous postgres drivers.
@ -26,7 +26,6 @@ class ADODB_netezza extends ADODB_postgres64 {
var $_resultid = false; var $_resultid = false;
var $concat_operator='||'; var $concat_operator='||';
var $random = 'random'; var $random = 'random';
var $upperCase = 'upper';
var $metaDatabasesSQL = "select objname from _v_object_data where objtype='database' order by 1"; var $metaDatabasesSQL = "select objname from _v_object_data where objtype='database' order by 1";
var $metaTablesSQL = "select objname from _v_object_data where objtype='table' order by 1"; var $metaTablesSQL = "select objname from _v_object_data where objtype='table' order by 1";
var $isoDates = true; // accepts dates in ISO format var $isoDates = true; // accepts dates in ISO format

View file

@ -91,6 +91,7 @@ class ADODB_oci8 extends ADOConnection {
function ADODB_oci8() function ADODB_oci8()
{ {
$this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200; $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
if (defined('ADODB_EXTENSION')) $this->rsPrefix .= 'ext_';
} }
/* Function &MetaColumns($table) added by smondino@users.sourceforge.net*/ /* Function &MetaColumns($table) added by smondino@users.sourceforge.net*/
@ -234,8 +235,6 @@ NATSOFT.DOMAIN =
return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1); return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabasename,1);
} }
// returns true or false // returns true or false
function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename) function _nconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
{ {
@ -576,7 +575,7 @@ NATSOFT.DOMAIN =
if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT'); if ($this->session_sharing_force_blob) $this->Execute('ALTER SESSION SET CURSOR_SHARING=EXACT');
$commit = $this->autoCommit; $commit = $this->autoCommit;
if ($commit) $this->BeginTrans(); if ($commit) $this->BeginTrans();
$rs = ADODB_oci8::Execute($sql,$arr); $rs = $this->_Execute($sql,$arr);
if ($rez = !empty($rs)) $desc->save($val); if ($rez = !empty($rs)) $desc->save($val);
$desc->free(); $desc->free();
if ($commit) $this->CommitTrans(); if ($commit) $this->CommitTrans();
@ -748,7 +747,7 @@ NATSOFT.DOMAIN =
return $rez; return $rez;
} }
function Param($name) function Param($name,$type=false)
{ {
return ':'.$name; return ':'.$name;
} }
@ -898,6 +897,8 @@ NATSOFT.DOMAIN =
// returns true or false // returns true or false
function _close() function _close()
{ {
if (!$this->_connectionID) return;
if (!$this->autoCommit) OCIRollback($this->_connectionID); if (!$this->autoCommit) OCIRollback($this->_connectionID);
if (count($this -> _refLOBs) > 0) { if (count($this -> _refLOBs) > 0) {
foreach ($this -> _refLOBs as $key => $value) { foreach ($this -> _refLOBs as $key => $value) {
@ -906,6 +907,7 @@ NATSOFT.DOMAIN =
} }
} }
OCILogoff($this->_connectionID); OCILogoff($this->_connectionID);
$this->_stmt = false; $this->_stmt = false;
$this->_connectionID = false; $this->_connectionID = false;
} }
@ -1126,8 +1128,9 @@ class ADORecordset_oci8 extends ADORecordSet {
} }
/*
// 10% speedup to move MoveNext to child class // 10% speedup to move MoveNext to child class
function MoveNext() function _MoveNext()
{ {
//global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this); //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this);
@ -1139,7 +1142,22 @@ class ADORecordset_oci8 extends ADORecordSet {
$this->EOF = true; $this->EOF = true;
return false; return false;
} */
function MoveNext()
{
if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
$this->_currentRow += 1;
return true;
} }
if (!$this->EOF) {
$this->_currentRow += 1;
$this->EOF = true;
}
return false;
}
/* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */ /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
function &GetArrayLimit($nrows,$offset=-1) function &GetArrayLimit($nrows,$offset=-1)
@ -1244,4 +1262,29 @@ class ADORecordset_oci8 extends ADORecordSet {
} }
} }
} }
class ADORecordSet_ext_oci8 extends ADORecordSet_oci8 {
function ADORecordSet_ext_oci8($queryID,$mode=false)
{
if ($mode === false) {
global $ADODB_FETCH_MODE;
$mode = $ADODB_FETCH_MODE;
}
switch ($mode)
{
default:
case ADODB_FETCH_NUM: $this->fetchMode = OCI_NUM+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
case ADODB_FETCH_ASSOC:$this->fetchMode = OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
case ADODB_FETCH_DEFAULT:
case ADODB_FETCH_BOTH:$this->fetchMode = OCI_NUM+OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS; break;
}
$this->_queryID = $queryID;
}
function MoveNext()
{
return adodb_movenext($this);
}
}
?> ?>

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim. All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim. All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -30,7 +30,8 @@ class ADODB_oci8po extends ADODB_oci8 {
function ADODB_oci8po() function ADODB_oci8po()
{ {
$this->ADODB_oci8(); $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
# oci8po does not support adodb extension: adodb_movenext()
} }
function Param($name) function Param($name)
@ -111,15 +112,26 @@ class ADORecordset_oci8po extends ADORecordset_oci8 {
} }
return $fld; return $fld;
} }
/*
function MoveNext()
{
if (@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
$this->_currentRow += 1;
return true;
}
if (!$this->EOF) {
$this->_currentRow += 1;
$this->EOF = true;
}
return false;
}*/
// 10% speedup to move MoveNext to child class // 10% speedup to move MoveNext to child class
function MoveNext() function MoveNext()
{ {
if (!$this->EOF) {
$this->_currentRow++;
if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) { if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
global $ADODB_ANSI_PADDING_OFF; global $ADODB_ANSI_PADDING_OFF;
$this->_currentRow++;
if ($this->fetchMode & OCI_ASSOC) $this->_updatefields(); if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
if (!empty($ADODB_ANSI_PADDING_OFF)) { if (!empty($ADODB_ANSI_PADDING_OFF)) {
@ -129,7 +141,9 @@ class ADORecordset_oci8po extends ADORecordset_oci8 {
} }
return true; return true;
} }
if (!$this->EOF) {
$this->EOF = true; $this->EOF = true;
$this->_currentRow++;
} }
return false; return false;
} }
@ -190,4 +204,6 @@ class ADORecordset_oci8po extends ADORecordset_oci8 {
} }
} }
?> ?>

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -37,6 +37,7 @@ class ADODB_odbc extends ADOConnection {
var $_haserrorfunctions = true; var $_haserrorfunctions = true;
var $_has_stupid_odbc_fetch_api_change = true; var $_has_stupid_odbc_fetch_api_change = true;
var $_lastAffectedRows = 0; var $_lastAffectedRows = 0;
var $uCaseTables = true; // for meta* functions, uppercase table names
function ADODB_odbc() function ADODB_odbc()
{ {
@ -56,7 +57,7 @@ class ADODB_odbc extends ADOConnection {
while(true) { while(true) {
$rez = odbc_data_source($this->_connectionID, $rez = @odbc_data_source($this->_connectionID,
$first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT); $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
$first = false; $first = false;
if (!is_array($rez)) break; if (!is_array($rez)) break;
@ -232,9 +233,13 @@ class ADODB_odbc extends ADOConnection {
{ {
global $ADODB_FETCH_MODE; global $ADODB_FETCH_MODE;
if ($this->uCaseTables) $table = strtoupper($table);
$schema = '';
$this->_findschema($table,$schema);
$savem = $ADODB_FETCH_MODE; $savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$qid = @odbc_primarykeys($this->_connectionID,'','',$table); $qid = @odbc_primarykeys($this->_connectionID,'',$schema,$table);
if (!$qid) { if (!$qid) {
$ADODB_FETCH_MODE = $savem; $ADODB_FETCH_MODE = $savem;
@ -361,14 +366,14 @@ class ADODB_odbc extends ADOConnection {
{ {
global $ADODB_FETCH_MODE; global $ADODB_FETCH_MODE;
$table = strtoupper($table); if ($this->uCaseTables) $table = strtoupper($table);
$schema = false; $schema = '';
$this->_findschema($table,$schema); $this->_findschema($table,$schema);
$savem = $ADODB_FETCH_MODE; $savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
if (false) { // after testing, confirmed that the following does not work becoz of a bug /*if (false) { // after testing, confirmed that the following does not work becoz of a bug
$qid2 = odbc_tables($this->_connectionID); $qid2 = odbc_tables($this->_connectionID);
$rs = new ADORecordSet_odbc($qid2); $rs = new ADORecordSet_odbc($qid2);
$ADODB_FETCH_MODE = $savem; $ADODB_FETCH_MODE = $savem;
@ -387,11 +392,18 @@ class ADODB_odbc extends ADOConnection {
$rs->Close(); $rs->Close();
$qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%'); $qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%');
} else switch ($this->databaseType) { } */
switch ($this->databaseType) {
case 'access': case 'access':
case 'vfp': case 'vfp':
$qid = odbc_columns($this->_connectionID);#,'%','',strtoupper($table),'%');
break;
case 'db2': case 'db2':
$qid = odbc_columns($this->_connectionID); $colname = "%";
$qid = odbc_columns($this->_connectionID, "", $schema, $table, $colname);
break; break;
default: default:

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -32,7 +32,6 @@ class ADODB_odbc_mssql extends ADODB_odbc {
var $sysTimeStamp = 'GetDate()'; var $sysTimeStamp = 'GetDate()';
var $leftOuter = '*='; var $leftOuter = '*=';
var $rightOuter = '=*'; var $rightOuter = '=*';
var $upperCase = 'upper';
var $substr = 'substring'; var $substr = 'substring';
var $length = 'len'; var $length = 'len';
var $ansiOuter = true; // for mssql7 or later var $ansiOuter = true; // for mssql7 or later
@ -146,12 +145,23 @@ order by constraint_name, referenced_table_name, keyno";
// tested with MSSQL 2000 // tested with MSSQL 2000
function &MetaPrimaryKeys($table) function &MetaPrimaryKeys($table)
{ {
$sql = "select k.column_name from information_schema.key_column_usage k, global $ADODB_FETCH_MODE;
$schema = '';
$this->_findschema($table,$schema);
//if (!$schema) $schema = $this->database;
if ($schema) $schema = "and k.table_catalog like '$schema%'";
$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,
information_schema.table_constraints tc information_schema.table_constraints tc
where tc.constraint_name = k.constraint_name and tc.constraint_type = where tc.constraint_name = k.constraint_name and tc.constraint_type =
'PRIMARY KEY' and k.table_name = '$table'"; 'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";
$savem = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$a = $this->GetCol($sql); $a = $this->GetCol($sql);
$ADODB_FETCH_MODE = $savem;
if ($a && sizeof($a)>0) return $a; if ($a && sizeof($a)>0) return $a;
return false; return false;
} }

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.
@ -174,7 +174,6 @@ class ADODB_odbtp extends ADOConnection{
$this->_canSelectDb = true; $this->_canSelectDb = true;
$this->substr = "substring"; $this->substr = "substring";
$this->length = 'len'; $this->length = 'len';
$this->upperCase = 'upper';
$this->identitySQL = 'select @@IDENTITY'; $this->identitySQL = 'select @@IDENTITY';
$this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'"; $this->metaDatabasesSQL = "select name from master..sysdatabases where name <> 'master'";
break; break;
@ -202,7 +201,6 @@ class ADODB_odbtp extends ADOConnection{
$this->replaceQuote = "'+chr(39)+'"; $this->replaceQuote = "'+chr(39)+'";
$this->true = '.T.'; $this->true = '.T.';
$this->false = '.F.'; $this->false = '.F.';
$this->upperCase = 'upper';
break; break;
case ODB_DRIVER_ORACLE: case ODB_DRIVER_ORACLE:
$this->fmtDate = "'Y-m-d 00:00:00'"; $this->fmtDate = "'Y-m-d 00:00:00'";
@ -222,7 +220,6 @@ class ADODB_odbtp extends ADOConnection{
$this->rightOuter = '=*'; $this->rightOuter = '=*';
$this->hasInsertID = true; $this->hasInsertID = true;
$this->hasTransactions = true; $this->hasTransactions = true;
$this->upperCase = 'upper';
$this->identitySQL = 'select @@IDENTITY'; $this->identitySQL = 'select @@IDENTITY';
break; break;
default: default:
@ -629,5 +626,3 @@ class ADORecordSet_odbtp extends ADORecordSet {
} }
?> ?>

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.
@ -60,4 +60,3 @@ class ADORecordSet_odbtp_unicode extends ADORecordSet_odbtp {
} }
} }
?> ?>

View file

@ -1,15 +1,15 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
Latest version is available at http://adodb.sourceforge.net Latest version is available at http://adodb.sourceforge.net
Oracle data driver. Requires Oracle client. Works on Windows and Unix and Oracle 7 and 8. Oracle data driver. Requires Oracle client. Works on Windows and Unix and Oracle 7.
If you are using Oracle 8, use the oci8 driver which is much better and more reliable. If you are using Oracle 8 or later, use the oci8 driver which is much better and more reliable.
*/ */
// security - hide paths // security - hide paths

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -390,14 +390,14 @@ select viewname,'V' from pg_views where viewname like $mask";
// for schema support, pass in the $table param "$schema.$tabname". // for schema support, pass in the $table param "$schema.$tabname".
// converts field names to lowercase, $upper is ignored // converts field names to lowercase, $upper is ignored
function &MetaColumns($table,$upper=true) function &MetaColumns($table,$normalize=true)
{ {
global $ADODB_FETCH_MODE; global $ADODB_FETCH_MODE;
$schema = false; $schema = false;
$this->_findschema($table,$schema); $this->_findschema($table,$schema);
$table = strtolower($table); if ($normalize) $table = strtolower($table);
$save = $ADODB_FETCH_MODE; $save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM; $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
@ -486,7 +486,7 @@ select viewname,'V' from pg_views where viewname like $mask";
} }
if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld; if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
else $retarr[($upper) ? strtoupper($fld->name) : $fld->name] = $fld; else $retarr[($normalize) ? strtoupper($fld->name) : $fld->name] = $fld;
$rs->MoveNext(); $rs->MoveNext();
} }
@ -803,7 +803,7 @@ class ADORecordSet_postgres64 extends ADORecordSet{
// cache types for blob decode check // cache types for blob decode check
for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) { for ($i=0, $max = $this->_numOfFields; $i < $max; $i++) {
if (pg_fieldtype($qid,$i) == 'bytea') { if (pg_fieldtype($qid,$i) == 'bytea') {
$this->_blobArr[$i] = pg_fieldname($qid,$off); $this->_blobArr[$i] = pg_fieldname($qid,$i);
} }
} }
} }
@ -867,7 +867,7 @@ class ADORecordSet_postgres64 extends ADORecordSet{
if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) { if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
$this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode); $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
if (is_array($this->fields) && $this->fields) { if (is_array($this->fields) && $this->fields) {
if ($this->fields && isset($this->_blobArr)) $this->_fixblobs(); if (isset($this->_blobArr)) $this->_fixblobs();
return true; return true;
} }
} }

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim. All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim. All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -155,7 +155,7 @@ class ADODB_sybase extends ADOConnection {
if ($offset > 0 && $cnt) $cnt += $offset; if ($offset > 0 && $cnt) $cnt += $offset;
$this->Execute("set rowcount $cnt"); $this->Execute("set rowcount $cnt");
$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache); $rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0);
$this->Execute("set rowcount 0"); $this->Execute("set rowcount 0");
return $rs; return $rs;

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -27,7 +27,6 @@ class ADODB_vfp extends ADODB_odbc {
var $true = '.T.'; var $true = '.T.';
var $false = '.F.'; var $false = '.F.';
var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE var $hasTop = 'top'; // support mssql SELECT TOP 10 * FROM TABLE
var $upperCase = 'upper';
var $_bindInputArray = false; // strangely enough, setting to true does not work reliably var $_bindInputArray = false; // strangely enough, setting to true does not work reliably
var $sysTimeStamp = 'datetime()'; var $sysTimeStamp = 'datetime()';
var $sysDate = 'date()'; var $sysDate = 'date()';
@ -45,7 +44,6 @@ class ADODB_vfp extends ADODB_odbc {
return time(); return time();
} }
function BeginTrans() { return false;} function BeginTrans() { return false;}
// quote string to be sent back to database // quote string to be sent back to database

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.
@ -152,12 +152,10 @@ AND b.name = 'sorts (memory)'",
having count(*) > 100)",'These are sql statements that should be using bind variables'),*/ having count(*) > 100)",'These are sql statements that should be using bind variables'),*/
'index cache cost' => array('COST', 'index cache cost' => array('COST',
"select value from v\$parameter where name = 'optimizer_index_caching'", "select value from v\$parameter where name = 'optimizer_index_caching'",
'% of indexed data blocks expected in the cache. '=WarnIndexCost'),
Recommended is 20-80. Default is 0. See <a href=http://www.dba-oracle.com/oracle_tips_cbo_part1.htm>optimizer_index_caching</a>.'),
'random page cost' => array('COST', 'random page cost' => array('COST',
"select value from v\$parameter where name = 'optimizer_index_cost_adj'", "select value from v\$parameter where name = 'optimizer_index_cost_adj'",
'Recommended is 10-50 for TP, and 50 for data warehouses. Default is 100. See <a href=http://www.dba-oracle.com/oracle_tips_cost_adj.htm>optimizer_index_cost_adj</a>. '), '=WarnPageCost'),
false false
@ -172,6 +170,23 @@ having count(*) > 100)",'These are sql statements that should be using bind vari
$this->conn =& $conn; $this->conn =& $conn;
} }
function WarnPageCost($val)
{
if ($val == 100) $s = '<font color=red><b>Too High</b>. </font>';
else $s = '';
return $s.'Recommended is 20-50 for TP, and 50 for data warehouses. Default is 100. See <a href=http://www.dba-oracle.com/oracle_tips_cost_adj.htm>optimizer_index_cost_adj</a>. ';
}
function WarnIndexCost($val)
{
if ($val == 0) $s = '<font color=red><b>Too Low</b>. </font>';
else $s = '';
return $s.'Percentage of indexed data blocks expected in the cache.
Recommended is 20 (fast disk array) to 50 (slower hard disks). Default is 0.
See <a href=http://www.dba-oracle.com/oracle_tips_cbo_part1.htm>optimizer_index_caching</a>.';
}
function PGA() function PGA()
{ {

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. See License.txt. the BSD license will take precedence. See License.txt.

View file

@ -1,7 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com). Contributed by Ross Smith (adodb@netebb.com).

View file

@ -1,6 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.

View file

@ -1,6 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.

View file

@ -1,6 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.

View file

@ -1,7 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com). Contributed by Ross Smith (adodb@netebb.com).

View file

@ -1,7 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Contributed by Ross Smith (adodb@netebb.com). Contributed by Ross Smith (adodb@netebb.com).

View file

@ -1,6 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.

View file

@ -1,6 +1,5 @@
<?php <?php
// $CVSHeader$
/* /*
V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.

View file

@ -8,7 +8,7 @@
<body> <body>
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -18,11 +18,11 @@ include("$path/../adodb.inc.php");
echo "<h3>PHP ".PHP_VERSION."</h3>\n"; echo "<h3>PHP ".PHP_VERSION."</h3>\n";
try { try {
$dbt = 'mysqli'; $dbt = 'oci8po';
switch($dbt) { switch($dbt) {
case 'oci8': case 'oci8po':
$db = NewADOConnection("oci8"); $db = NewADOConnection("oci8po");
$db->Connect('','scott','natsoft'); $db->Connect('','scott','natsoft');
break; break;
default: default:
@ -32,23 +32,26 @@ case 'mysql':
break; break;
case 'mysqli': case 'mysqli':
$db = NewADOConnection("mysqli"); $db = NewADOConnection("mysqli://root:@localhost/test");
$db->Connect('localhost','root','','test'); //$db->Connect('localhost','root','','test');
break; break;
} }
$db->debug=1; $db->debug=1;
$cnt = $db->GetOne("select count(*) from adoxyz"); $cnt = $db->GetOne("select count(*) from adoxyz where ?<id and id<?",array(10,20));
$rs = $db->Execute("select * from adoxyz order by id"); $stmt = $db->Prepare("select * from adoxyz where ?<id and id<?");
if (!$stmt) echo $db->ErrorMsg(),"\n";
$rs = $db->Execute($stmt,array(10,20));
$i = 0; $i = 0;
foreach($rs as $v) { foreach($rs as $v) {
$i += 1; $i += 1;
echo "$i: "; adodb_pr($v); adodb_pr($rs->fields); echo "rec $i: "; adodb_pr($v); adodb_pr($rs->fields);
flush(); flush();
} }
if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n"); if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n");
@ -60,4 +63,6 @@ $rs = $db->Execute("select bad from badder");
$e = adodb_backtrace($e->gettrace()); $e = adodb_backtrace($e->gettrace());
} }
$rs = $db->Execute("select distinct id, firstname,lastname from adoxyz order by id");
echo "Result=\n",$rs;
?> ?>

View file

@ -18,10 +18,10 @@ $schema = new adoSchema( $db );
// uncomment the following line: // uncomment the following line:
#$schema->upgradeSchema(); #$schema->upgradeSchema();
print "<b>SQL to build xmlschema.xml</b>:\n<pre>";
// Build the SQL array // Build the SQL array
$sql = $schema->ParseSchema( "xmlschema.xml" ); $sql = $schema->ParseSchema( "xmlschema.xml" );
print "Here's the SQL to do the build:\n<pre>";
print_r( $sql ); print_r( $sql );
print "</pre>\n"; print "</pre>\n";
@ -38,10 +38,12 @@ $db2->Connect('localhost','sa','natsoft','northwind') || die("Fail 2");
$db2->Execute("drop table simple_table"); $db2->Execute("drop table simple_table");
print "<b>SQL to build xmlschema-mssql.xml</b>:\n<pre>";
$schema = new adoSchema( $db2 ); $schema = new adoSchema( $db2 );
$sql = $schema->ParseSchema( "xmlschema-mssql.xml" ); $sql = $schema->ParseSchema( "xmlschema-mssql.xml" );
print "Here's the SQL to do the build:\n<pre>";
print_r( $sql ); print_r( $sql );
print "</pre>\n"; print "</pre>\n";

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -138,7 +138,7 @@ FROM `nuke_stories` `t1`, `nuke_authors` `t2`, `nuke_stories_cat` `t3`, `nuke_to
print "<br><i>ts4</i> =".($db->UnixTimeStamp("19700101000101")+8*3600); print "<br><i>ts4</i> =".($db->UnixTimeStamp("19700101000101")+8*3600);
print "<br><i>ts5</i> =".$db->DBTimeStamp($db->UnixTimeStamp("20040110092123")); print "<br><i>ts5</i> =".$db->DBTimeStamp($db->UnixTimeStamp("20040110092123"));
print "<br><i>ts6</i> =".$db->UserTimeStamp("20040110092123"); print "<br><i>ts6</i> =".$db->UserTimeStamp("20040110092123");
print "<br><i>ts6</i> =".$db->DBTimeStamp("20040110092123"); print "<br><i>ts7</i> =".$db->DBTimeStamp("20040110092123");
flush(); flush();
// mssql too slow in failing bad connection // mssql too slow in failing bad connection
if (false && $db->databaseType != 'mssql') { if (false && $db->databaseType != 'mssql') {
@ -410,6 +410,43 @@ GO
$saved = $db->debug; $saved = $db->debug;
$db->debug=true; $db->debug=true;
/*
CREATE TABLE PHOTOS
(
ID NUMBER(16),
PHOTO BLOB,
DESCRIPTION VARCHAR2(4000 BYTE),
DESCCLOB CLOB
);
INSERT INTO PHOTOS (ID) VALUES(1);
*/
$s = '';
for ($i = 0; $i <= 500; $i++) {
$s .= '1234567890';
}
print "<h4>Testing Blob: size=".strlen($s)."</h4>";
$ok = $db->Updateblob('photos','photo',$s,'id=1');
if (!$ok) Err("Blob failed 1");
else {
$s2= $db->GetOne("select photo from photos where id=1");
if ($s !== $s2) Err("updateblob does not match");
}
print "<h4>Testing Clob: size=".strlen($s)."</h4>";
$ok = $db->UpdateClob('photos','descclob',$s,'id=1');
if (!$ok) Err("Clob failed 1");
else {
$s2= $db->GetOne("select descclob from photos where id=1");
if ($s !== $s2) Err("updateclob does not match");
}
$s = '';
$s2 = '';
print "<h4>Testing Foreign Keys</h4>"; print "<h4>Testing Foreign Keys</h4>";
$arr = $db->MetaForeignKeys('emp'); $arr = $db->MetaForeignKeys('emp');
print_r($arr); print_r($arr);
@ -417,30 +454,50 @@ GO
print "<h4>Testing Cursor Variables</h4>"; print "<h4>Testing Cursor Variables</h4>";
/* /*
-- TEST PACKAGE -- TEST PACKAGE
CREATE OR REPLACE PACKAGE adodb AS
TYPE TabType IS REF CURSOR RETURN tab%ROWTYPE; CREATE OR REPLACE PACKAGE Adodb AS
PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames in varchar); TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
PROCEDURE data_out(input IN varchar, output OUT varchar); PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR);
END adodb; PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) ;
PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR);
PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER);
END Adodb;
/ /
CREATE OR REPLACE PACKAGE BODY adodb AS
PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames in varchar) IS CREATE OR REPLACE PACKAGE BODY Adodb AS
PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS
BEGIN BEGIN
OPEN tabcursor FOR SELECT * FROM tab where tname like tablenames; OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
END open_tab; END open_tab;
PROCEDURE data_out(input IN varchar, output OUT varchar) IS PROCEDURE open_tab2 (tabcursor IN OUT TabType,tablenames IN OUT VARCHAR) IS
BEGIN
OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
tablenames := 'TEST';
END open_tab2;
PROCEDURE data_out(input IN VARCHAR, output OUT VARCHAR) IS
BEGIN BEGIN
output := 'Cinta Hati '||input; output := 'Cinta Hati '||input;
END; END;
END adodb;
PROCEDURE myproc (p1 IN NUMBER, p2 OUT NUMBER) AS
BEGIN
p2 := p1;
END;
END Adodb;
/ /
*/ */
$rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS,'A%'); END;"); $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:zz,'A%'); END;",'zz');
if ($rs && !$rs->EOF) { if ($rs && !$rs->EOF) {
print "Test 1 RowCount: ".$rs->RecordCount()."<p>"; $v = $db->GetOne("SELECT count(*) FROM tab where tname like 'A%'");
if ($v == $rs->RecordCount()) print "Test 1 RowCount: OK<p>";
else Err("Test 1 RowCount ".$rs->RecordCount().", actual = $v");
} else { } else {
print "<b>Error in using Cursor Variables 1</b><p>"; print "<b>Error in using Cursor Variables 1</b><p>";
} }
@ -488,6 +545,7 @@ END adodb;
$db->CompleteTrans(); $db->CompleteTrans();
$rs = $db->Execute('select * from ADOXYZ order by id'); $rs = $db->Execute('select * from ADOXYZ order by id');
if ($rs->RecordCount() != 3) Err("Bad bulk insert"); if ($rs->RecordCount() != 3) Err("Bad bulk insert");
rs2html($rs); rs2html($rs);
$db->Execute('delete from ADOXYZ'); $db->Execute('delete from ADOXYZ');
@ -749,6 +807,18 @@ END adodb;
$db->debug = true; $db->debug = true;
print "<p>SelectLimit Distinct Test 1: Should see Caroline, John and Mary</p>"; print "<p>SelectLimit Distinct Test 1: Should see Caroline, John and Mary</p>";
$rs = &$db->SelectLimit('select distinct * from ADOXYZ order by id',3); $rs = &$db->SelectLimit('select distinct * from ADOXYZ order by id',3);
echo "<p>Date Update Test</p>";
$zdate = date('Y-m-d',time()+3600*24);
$zdate = $db->DBDate($zdate);
$db->Execute("update ADOXYZ set created=$zdate where id=1");
$row = $db->GetRow("select created,firstname from ADOXYZ where id=1");
print_r($row); echo "<br>";
//$zdate = date('Y-m-d',time()+3600*24);
//$db->Execute("update ADOXYZ set created=? where id=2",$zdate);
//$zdate = $db->GetOne("select created from ADOXYZ where id=2");
//echo "tomorrow=",$zdate,"<br>";
$db->debug=false; $db->debug=false;
if ($rs && !$rs->EOF) { if ($rs && !$rs->EOF) {
@ -854,10 +924,10 @@ END adodb;
$save = $ADODB_FETCH_MODE; $save = $ADODB_FETCH_MODE;
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
if ($db->dataProvider == 'postgres') { if ($db->dataProvider == 'postgres') {
$sql = "select ".$db->Concat('cast(firstname as varchar)',$db->qstr(' '),'lastname')." as fullname,id from ADOXYZ"; $sql = "select ".$db->Concat('cast(firstname as varchar)',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ";
$rs = &$db->Execute($sql); $rs = &$db->Execute($sql);
} else { } else {
$sql = "select distinct ".$db->Concat('firstname',$db->qstr(' '),'lastname')." as fullname,id from ADOXYZ"; $sql = "select distinct ".$db->Concat('firstname',$db->qstr(' '),'lastname')." as fullname,id,".$db->sysTimeStamp." as d from ADOXYZ";
$rs = &$db->Execute($sql); $rs = &$db->Execute($sql);
} }
if ($rs) { if ($rs) {
@ -904,12 +974,12 @@ END adodb;
//$arr = $db->GetArray("select lastname,firstname from ADOXYZ"); //$arr = $db->GetArray("select lastname,firstname from ADOXYZ");
//print_r($arr); //print_r($arr);
print "<hr>"; print "<hr>";
$rs =& $db->Execute("select distinct lastname,firstname from ADOXYZ"); $rs =& $db->Execute("select distinct lastname,firstname,created from ADOXYZ");
if ($rs) { if ($rs) {
$arr = $rs->GetAssoc(); $arr = $rs->GetAssoc();
//print_r($arr); //print_r($arr);
if (empty($arr['See']) || trim($arr['See']) != 'Wai Hun') print $arr['See']." &nbsp; <b>ERROR</b><br>"; if (empty($arr['See']) || trim(reset($arr['See'])) != 'Wai Hun') print $arr['See']." &nbsp; <b>ERROR</b><br>";
else print " OK 1"; else print " OK 1";
} }
@ -1433,7 +1503,7 @@ if (isset($_SERVER['argv'][1])) {
$HTTP_GET_VARS[$_SERVER['argv'][1]] = 1; $HTTP_GET_VARS[$_SERVER['argv'][1]] = 1;
} }
if ( @$HTTP_SERVER_VARS['COMPUTERNAME'] == 'TIGRESS') { if (@$HTTP_SERVER_VARS['COMPUTERNAME'] == 'TIGRESS') {
CheckWS('mysqlt'); CheckWS('mysqlt');
CheckWS('postgres'); CheckWS('postgres');
CheckWS('oci8po'); CheckWS('oci8po');
@ -1478,7 +1548,7 @@ if (strpos(PHP_VERSION,'5') === 0) {
This script tests the following databases: Interbase, Oracle, Visual FoxPro, Microsoft Access (ODBC and ADO), MySQL, MSSQL (ODBC, native, ADO). This script tests the following databases: Interbase, Oracle, Visual FoxPro, Microsoft Access (ODBC and ADO), MySQL, MSSQL (ODBC, native, ADO).
There is also support for Sybase, PostgreSQL.</p> There is also support for Sybase, PostgreSQL.</p>
For the latest version of ADODB, visit <a href=http://php.weblogs.com/ADODB>php.weblogs.com</a>.</p> For the latest version of ADODB, visit <a href=http://adodb.sourceforge.net/>adodb.sourceforge.net</a>.</p>
Test <a href=test4.php>GetInsertSQL/GetUpdateSQL</a> &nbsp; Test <a href=test4.php>GetInsertSQL/GetUpdateSQL</a> &nbsp;
<a href=testsessions.php>Sessions</a> &nbsp; <a href=testsessions.php>Sessions</a> &nbsp;
@ -1489,8 +1559,9 @@ include('./testdatabases.inc.php');
echo "<br>vers=",ADOConnection::Version(); echo "<br>vers=",ADOConnection::Version();
include_once('../adodb-time.inc.php'); include_once('../adodb-time.inc.php');
adodb_date_test(); if (!isset($_GET['nd'])) adodb_date_test();
?> ?>
<p><i>ADODB Database Library (c) 2000-2004 John Lim. All rights reserved. Released under BSD and LGPL.</i></p> <p><i>ADODB Database Library (c) 2000-2004 John Lim. All rights reserved. Released under BSD and LGPL.</i></p>
</body> </body>

View file

@ -8,7 +8,7 @@
<body> <body>
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -63,7 +63,7 @@ if ($insertSQL != $insertSQL2) echo "<p><b>Walt's new stuff failed</b>: $insertS
$sql = " $sql = "
SELECT * SELECT *
FROM ADOXYZ WHERE lastname=".$conn->qstr($record['lastname']); FROM ADOXYZ WHERE lastname=".$conn->qstr($record['lastname']). " ORDER BY 1";
// Select a record to update // Select a record to update
$rs = $conn->Execute($sql); // Execute the query and get the existing record to update $rs = $conn->Execute($sql); // Execute the query and get the existing record to update

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -2,7 +2,7 @@
<body> <body>
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -57,7 +57,7 @@ if (!empty($testpostgres)) {
$db = &ADONewConnection('postgres'); $db = &ADONewConnection('postgres');
print "<h1>Connecting $db->databaseType...</h1>"; print "<h1>Connecting $db->databaseType...</h1>";
if (@$db->Connect("localhost","tester","test","test")) { if ($db->Connect("localhost","tester","test","test")) {
testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname varchar,created date)"); testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname varchar,created date)");
}else }else
print "ERROR: PostgreSQL requires a database called test on server, user tester, password test.<BR>".$db->ErrorMsg(); print "ERROR: PostgreSQL requires a database called test on server, user tester, password test.<BR>".$db->ErrorMsg();
@ -80,7 +80,7 @@ if (!empty($testibase)) {
//$_GET['nolog'] = true; //$_GET['nolog'] = true;
$db = &ADONewConnection('firebird'); $db = &ADONewConnection('firebird');
print "<h1>Connecting $db->databaseType...</h1>"; print "<h1>Connecting $db->databaseType...</h1>";
if (@$db->PConnect("localhost:d:\\firebird\\10\\examples\\employee.gdb", "sysdba", "masterkey", "")) if ($db->PConnect("localhost:d:\\firebird\\10\\examples\\employee.gdb", "sysdba", "masterkey", ""))
testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname char(24),price numeric(12,2),created date)"); testdb($db,"create table ADOXYZ (id integer, firstname char(24), lastname char(24),price numeric(12,2),created date)");
else print "ERROR: Interbase test requires a database called employee.gdb".'<BR>'.$db->ErrorMsg(); else print "ERROR: Interbase test requires a database called employee.gdb".'<BR>'.$db->ErrorMsg();
@ -91,7 +91,7 @@ if (!empty($testsqlite)) {
$db = &ADONewConnection('sqlite'); $db = &ADONewConnection('sqlite');
print "<h1>Connecting $db->databaseType...</h1>"; print "<h1>Connecting $db->databaseType...</h1>";
if (@$db->PConnect("d:\\inetpub\\adodb\\sqlite.db", "", "", "")) if ($db->PConnect("d:\\inetpub\\adodb\\sqlite.db", "", "", ""))
testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)");
else print "ERROR: SQLite"; else print "ERROR: SQLite";
@ -101,10 +101,12 @@ if (!empty($testsqlite)) {
if (!empty($testaccess)) { if (!empty($testaccess)) {
$db = &ADONewConnection('access'); $db = &ADONewConnection('access');
print "<h1>Connecting $db->databaseType...</h1>"; print "<h1>Connecting $db->databaseType...</h1>";
$access = 'd:\inetpub\wwwroot\php\NWIND.MDB';
$dsn = "nwind"; $dsn = "nwind";
$driver = "Driver={Microsoft Access Driver (*.mdb)};Dbq=d:\inetpub\adodb\northwind.mdb;Uid=Admin;Pwd=;"; $dsn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=$access;Uid=Admin;Pwd=;";
if (@$db->PConnect($dsn, "", "", ""))
//$dsn = 'Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=' . $access . ';';
if ($db->PConnect($dsn, "", "", ""))
testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)");
else print "ERROR: Access test requires a Windows ODBC DSN=nwind, Access driver"; else print "ERROR: Access test requires a Windows ODBC DSN=nwind, Access driver";
@ -120,7 +122,7 @@ if (!empty($testaccess) && !empty($testado)) { // ADO ACCESS
. 'DATA SOURCE=' . $access . ';'; . 'DATA SOURCE=' . $access . ';';
//. 'USER ID=;PASSWORD=;'; //. 'USER ID=;PASSWORD=;';
if (@$db->PConnect($myDSN, "", "", "")) { if ($db->PConnect($myDSN, "", "", "")) {
print "ADO version=".$db->_connectionID->version."<br>"; print "ADO version=".$db->_connectionID->version."<br>";
testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)");
} else print "ERROR: Access test requires a Access database $access".'<BR>'.$db->ErrorMsg(); } else print "ERROR: Access test requires a Access database $access".'<BR>'.$db->ErrorMsg();
@ -141,11 +143,14 @@ if (!empty($testvfp)) { // ODBC
// REQUIRES MySQL server at localhost with database 'test' // REQUIRES MySQL server at localhost with database 'test'
if (!empty($testmysql)) { // MYSQL if (!empty($testmysql)) { // MYSQL
$db = &ADONewConnection('mysql');
print "<h1>Connecting $db->databaseType...</h1>";
if (PHP_VERSION >= 5 || $HTTP_SERVER_VARS['HTTP_HOST'] == 'localhost') $server = 'localhost'; if (PHP_VERSION >= 5 || $HTTP_SERVER_VARS['HTTP_HOST'] == 'localhost') $server = 'localhost';
else $server = "mangrove"; else $server = "mangrove";
if ($db->PConnect($server, "root", "", "northwind")) { $user = 'root'; $password = ''; $database = 'northwind';
$db = &ADONewConnection("mysql://$user:$password@$server/$database?persist");
print "<h1>Connecting $db->databaseType...</h1>";
if (true || $db->PConnect($server, "root", "", "northwind")) {
//$db->debug=1;$db->Execute('drop table ADOXYZ'); //$db->debug=1;$db->Execute('drop table ADOXYZ');
testdb($db, testdb($db,
"create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)"); "create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)");
@ -196,11 +201,10 @@ if (!empty($testproxy)){
ADOLoadCode('oci805'); ADOLoadCode('oci805');
ADOLoadCode("oci8po"); ADOLoadCode("oci8po");
if (!empty($testoracle)) { if (!empty($testoracle)) {
$dsn = "oci8po://scott:natsoft@panther?persist";
$db = ADONewConnection('oci8po'); $db = ADONewConnection($dsn);
print "<h1>Connecting $db->databaseType...</h1>"; print "<h1>Connecting $db->databaseType...</h1>";
if ($db->Connect('', "scott", "natsoft",'')) if (true || $db->Connect('', "scott", "natsoft",''))
//if ($db->PConnect("", "scott", "tiger", "juris.ecosystem.natsoft.com.my"))
testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)"); testdb($db,"create table ADOXYZ (id int, firstname varchar(24), lastname varchar(24),created date)");
else print "ERROR: Oracle test requires an Oracle server setup with scott/natsoft".'<BR>'.$db->ErrorMsg(); else print "ERROR: Oracle test requires an Oracle server setup with scott/natsoft".'<BR>'.$db->ErrorMsg();
@ -234,10 +238,9 @@ if (!empty($testmssql)) { // MS SQL Server via ODBC
print "<h1>Connecting $db->databaseType...</h1>"; print "<h1>Connecting $db->databaseType...</h1>";
$dsn = "mssql-northwind"; $dsn = "PROVIDER=MSDASQL;Driver={SQL Server};Server=localhost;Database=northwind;";
$dsn = "Driver={SQL Server};Server=localhost;Database=northwind;";
if (@$db->PConnect($dsn, "adodb", "natsoft", "")) { if ($db->PConnect($dsn, "adodb", "natsoft", "")) {
testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)");
} }
else print "ERROR: MSSQL test 1 requires a MS SQL 7 server setup with DSN setup"; else print "ERROR: MSSQL test 1 requires a MS SQL 7 server setup with DSN setup";
@ -256,7 +259,7 @@ if (!empty($testmssql) && !empty($testado) ) { // ADO ACCESS MSSQL -- thru ODBC
. "SERVER=tigress;DATABASE=NorthWind;UID=adodb;PWD=natsoft;Trusted_Connection=No" ; . "SERVER=tigress;DATABASE=NorthWind;UID=adodb;PWD=natsoft;Trusted_Connection=No" ;
if (@$db->PConnect($myDSN, "", "", "")) if ($db->PConnect($myDSN, "", "", ""))
testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)");
else print "ERROR: MSSQL test 2 requires MS SQL 7"; else print "ERROR: MSSQL test 2 requires MS SQL 7";
@ -270,11 +273,8 @@ if (!empty($testmssql)) { // MS SQL Server -- the extension is buggy -- probably
print "<h1>Connecting $db->databaseType...</h1>"; print "<h1>Connecting $db->databaseType...</h1>";
$ok = $db->PConnect('tigress','adodb','natsoft','northwind'); $ok = $db->PConnect('tigress','adodb','natsoft','northwind');
//$rs = $db->Execute("exec sp_ddate");
//print_r($rs->fields);
//die();
if ($ok or @$db->PConnect("mangrove", "sa", "natsoft", "ai")) { if ($ok or $db->PConnect("mangrove", "sa", "natsoft", "ai")) {
AutoDetect_MSSQL_Date_Order($db); AutoDetect_MSSQL_Date_Order($db);
// $db->Execute('drop table adoxyz'); // $db->Execute('drop table adoxyz');
testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)"); testdb($db,"create table ADOXYZ (id int, firstname char(24) null, lastname char(24) null,created datetime null)");
@ -288,7 +288,6 @@ if (!empty($testmssql) && !empty($testado)) { // ADO ACCESS MSSQL with OLEDB pro
print "<h1>Connecting DSN-less OLEDB Provider $db->databaseType...</h1>"; print "<h1>Connecting DSN-less OLEDB Provider $db->databaseType...</h1>";
//$db->debug=1; //$db->debug=1;
$myDSN="SERVER=tigress;DATABASE=northwind;Trusted_Connection=yes"; $myDSN="SERVER=tigress;DATABASE=northwind;Trusted_Connection=yes";
//$myDSN='SERVER=(local)\NetSDK;DATABASE=northwind;';
if ($db->PConnect($myDSN, "adodb", "natsoft", 'SQLOLEDB')) if ($db->PConnect($myDSN, "adodb", "natsoft", 'SQLOLEDB'))
testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)"); testdb($db,"create table ADOXYZ (id int, firstname char(24), lastname char(24),created datetime)");
else print "ERROR: MSSQL test 2 requires a MS SQL 7 on a server='mangrove', userid='sa', password='', database='ai'"; else print "ERROR: MSSQL test 2 requires a MS SQL 7 on a server='mangrove', userid='sa', password='', database='ai'";

View file

@ -2,7 +2,7 @@
<body> <body>
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -14,7 +14,7 @@ error_reporting(63);
include("../adodb.inc.php"); include("../adodb.inc.php");
include("../tohtml.inc.php"); include("../tohtml.inc.php");
if (1) { if (0) {
$db = ADONewConnection('oci8po'); $db = ADONewConnection('oci8po');
$db->PConnect('','scott','natsoft'); $db->PConnect('','scott','natsoft');
@ -44,7 +44,7 @@ if (1) {
} }
if (1) { if (1) {
$db = ADONewConnection('oci8'); $db = ADONewConnection('oci8');
$db->PConnect('','scott','tiger'); $db->PConnect('','scott','natsoft');
$db->debug = true; $db->debug = true;
$db->Execute("delete from emp where ename='John'"); $db->Execute("delete from emp where ename='John'");
print $db->Affected_Rows().'<BR>'; print $db->Affected_Rows().'<BR>';
@ -53,6 +53,20 @@ if (1) {
// prepare not quite ready for prime time // prepare not quite ready for prime time
//$rs = $db->Execute($stmt,array('empno'=>3775,'ename'=>'John')); //$rs = $db->Execute($stmt,array('empno'=>3775,'ename'=>'John'));
if (!$rs) die("Empty RS"); if (!$rs) die("Empty RS");
$db->setfetchmode(ADODB_FETCH_NUM);
$vv = 'A%';
$stmt = $db->PrepareSP("BEGIN adodb.open_tab2(:rs,:tt); END;",true);
$db->OutParameter($stmt, $cur, 'rs', -1, OCI_B_CURSOR);
$db->OutParameter($stmt, $vv, 'tt');
$rs = $db->Execute($stmt);
while (!$rs->EOF) {
adodb_pr($rs->fields);
$rs->MoveNext();
}
echo " val = $vv";
} }
if (0) { if (0) {

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -1,7 +1,7 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.
@ -19,12 +19,19 @@ function NotifyExpire($ref,$key)
#### CONNECTION #### CONNECTION
if (1) {
$ADODB_SESSION_DRIVER='oci8'; $ADODB_SESSION_DRIVER='oci8';
$ADODB_SESSION_CONNECT=''; $ADODB_SESSION_CONNECT='';
$ADODB_SESSION_USER ='scott'; $ADODB_SESSION_USER ='scott';
$ADODB_SESSION_PWD ='natsoft'; $ADODB_SESSION_PWD ='natsoft';
$ADODB_SESSION_DB =''; $ADODB_SESSION_DB ='';
} else {
$ADODB_SESSION_DRIVER='mysql';
$ADODB_SESSION_CONNECT='localhost';
$ADODB_SESSION_USER ='root';
$ADODB_SESSION_PWD ='';
$ADODB_SESSION_DB ='xphplens_2';
}
### TURN DEBUGGING ON ### TURN DEBUGGING ON
$ADODB_SESS_DEBUG = true; $ADODB_SESS_DEBUG = true;

View file

@ -1,6 +1,6 @@
<?php <?php
/* /*
V4.50 6 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved. V4.51 29 July 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
Released under both BSD license and Lesser GPL library license. Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses, Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence. the BSD license will take precedence.

View file

@ -2,8 +2,11 @@
<!DOCTYPE adodb_schema [ <!DOCTYPE adodb_schema [
<!ELEMENT schema (table*, sql*)> <!ELEMENT schema (table*, sql*)>
<!ATTLIST schema version CDATA #REQUIRED> <!ATTLIST schema version CDATA #REQUIRED>
<!ELEMENT table ((field+|DROP), constraint*, descr?, index*)> <!ELEMENT table ((field+|DROP), constraint*, descr?, index*, data*)>
<!ELEMENT field ((NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?, NOQUOTE, constraint, descr?)> <!ELEMENT field ((NOTNULL|KEY|PRIMARY)?, (AUTO|AUTOINCREMENT)?, (DEFAULT|DEFDATE|DEFTIMESTAMP)?, NOQUOTE, constraint, descr?)>
<!ELEMENT data (row+)>
<!ELEMENT row (f+)>
<!ELEMENT f (#CDATA)>
<!ELEMENT descr (#CDATA)> <!ELEMENT descr (#CDATA)>
<!ELEMENT NOTNULL EMPTY> <!ELEMENT NOTNULL EMPTY>
<!ELEMENT KEY EMPTY> <!ELEMENT KEY EMPTY>
@ -18,6 +21,8 @@
<!ELEMENT constraint (#CDATA)> <!ELEMENT constraint (#CDATA)>
<!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED> <!ATTLIST table name CDATA #REQUIRED platform CDATA #IMPLIED version CDATA #IMPLIED>
<!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED> <!ATTLIST field name CDATA #REQUIRED type (C|C2|X|X2|B|D|T|L|I|F|N) #REQUIRED size CDATA #IMPLIED>
<!ATTLIST data platform CDATA #IMPLIED>
<!ATTLIST f name CDATA #IMPLIED>
<!ATTLIST DEFAULT value CDATA #REQUIRED> <!ATTLIST DEFAULT value CDATA #REQUIRED>
<!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)> <!ELEMENT index ((col+|DROP), CLUSTERED?, BITMAP?, UNIQUE?, FULLTEXT?, HASH?, descr?)>
<!ELEMENT col (#CDATA)> <!ELEMENT col (#CDATA)>
@ -26,7 +31,7 @@
<!ELEMENT UNIQUE EMPTY> <!ELEMENT UNIQUE EMPTY>
<!ELEMENT FULLTEXT EMPTY> <!ELEMENT FULLTEXT EMPTY>
<!ELEMENT HASH EMPTY> <!ELEMENT HASH EMPTY>
<!ATTLIST index name CDATA #REQUIRED> <!ATTLIST index name CDATA #REQUIRED platform CDATA #IMPLIED>
<!ELEMENT sql (query+, descr?)> <!ELEMENT sql (query+, descr?)>
<!ELEMENT query (#CDATA)> <!ELEMENT query (#CDATA)>
<!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE) > <!ATTLIST sql name CDATA #IMPLIED platform CDATA #IMPLIED, key CDATA, prefixmethod (AUTO|MANUAL|NONE) >

View file

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
<!-- Schema -->
<xsl:template match="/">
<xsl:comment>
ADODB XMLSchema
http://adodb-xmlschema.sourceforge.net
</xsl:comment>
<xsl:comment>
Uninstallation Schema
</xsl:comment>
<xsl:element name="schema">
<xsl:attribute name="version">0.2</xsl:attribute>
<xsl:apply-templates select="schema/table">
<xsl:sort select="position()" data-type="number" order="descending"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<!-- Table -->
<xsl:template match="table">
<xsl:if test="count(DROP) = 0">
<xsl:element name="table">
<xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
<xsl:if test="string-length(@platform) > 0">
<xsl:attribute name="platform"><xsl:value-of select="@platform"/></xsl:attribute>
</xsl:if>
<xsl:if test="string-length(@version) > 0">
<xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="descr[1]"/>
<xsl:element name="DROP"/>
</xsl:element>
</xsl:if>
</xsl:template>
<!-- Description -->
<xsl:template match="descr">
<xsl:element name="descr">
<xsl:value-of select="normalize-space(text())"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>