From 038230082e0a1c2a9d25c9ab8779282c6d8b5512 Mon Sep 17 00:00:00 2001
From: moodler ';
+ }
+ return $rs;
+ }
+
+ $meta = false;
+ $meta = fgetcsv($fp, 32000, ",");
+ if (!$meta) {
+ fclose($fp);
+ $err = "Unexpected EOF 1";
+ return false;
+ }
+ }
+
+ // Get Column definitions
+ $flds = array();
+ foreach($meta as $o) {
+ $o2 = explode(':',$o);
+ if (sizeof($o2)!=3) {
+ $arr[] = $meta;
+ $flds = false;
+ break;
+ }
+ $fld =& new ADOFieldObject();
+ $fld->name = urldecode($o2[0]);
+ $fld->type = $o2[1];
+ $fld->max_length = $o2[2];
+ $flds[] = $fld;
+ }
+ } else {
+ fclose($fp);
+ $err = "Recordset had unexpected EOF 2";
+ return false;
+ }
+
+ // slurp in the data
+ $MAXSIZE = 128000;
+
+ $text = '';
+ while ($txt = fread($fp,$MAXSIZE)) {
+ $text .= $txt;
+ }
+
+ fclose($fp);
+ @$arr = unserialize($text);
+ //var_dump($arr);
+ if (!is_array($arr)) {
+ $err = "Recordset had unexpected EOF (in serialized recordset)";
+ if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!";
+ return false;
+ }
+ $rs =& new ADORecordSet_array();
+ $rs->timeCreated = $ttl;
+ $rs->InitArrayFields($arr,$flds);
+ return $rs;
+ }
?>
\ No newline at end of file
diff --git a/lib/adodb/adodb-datadict.inc.php b/lib/adodb/adodb-datadict.inc.php
index 1959de22f4..453eb329be 100644
--- a/lib/adodb/adodb-datadict.inc.php
+++ b/lib/adodb/adodb-datadict.inc.php
@@ -1,667 +1,674 @@
-$str";
-print_r($a);
-print "
";
-}
-
-if (!function_exists('ctype_alnum')) {
- function ctype_alnum($text) {
- return preg_match('/^[a-z0-9]*$/i', $text);
- }
-}
-
-//Lens_ParseTest();
-
-/**
- Parse arguments, treat "text" (text) and 'text' as quotation marks.
- To escape, use "" or '' or ))
-
- Will read in "abc def" sans quotes, as: abc def
- Same with 'abc def'.
- However if `abc def`, then will read in as `abc def`
-
- @param endstmtchar Character that indicates end of statement
- @param tokenchars Include the following characters in tokens apart from A-Z and 0-9
- @returns 2 dimensional array containing parsed tokens.
-*/
-function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
-{
- $pos = 0;
- $intoken = false;
- $stmtno = 0;
- $endquote = false;
- $tokens = array();
- $tokens[$stmtno] = array();
- $max = strlen($args);
- $quoted = false;
-
- while ($pos < $max) {
- $ch = substr($args,$pos,1);
- switch($ch) {
- case ' ':
- case "\t":
- case "\n":
- case "\r":
- if (!$quoted) {
- if ($intoken) {
- $intoken = false;
- $tokens[$stmtno][] = implode('',$tokarr);
- }
- break;
- }
-
- $tokarr[] = $ch;
- break;
-
- case '`':
- if ($intoken) $tokarr[] = $ch;
- case '(':
- case ')':
- case '"':
- case "'":
-
- if ($intoken) {
- if (empty($endquote)) {
- $tokens[$stmtno][] = implode('',$tokarr);
- if ($ch == '(') $endquote = ')';
- else $endquote = $ch;
- $quoted = true;
- $intoken = true;
- $tokarr = array();
- } else if ($endquote == $ch) {
- $ch2 = substr($args,$pos+1,1);
- if ($ch2 == $endquote) {
- $pos += 1;
- $tokarr[] = $ch2;
- } else {
- $quoted = false;
- $intoken = false;
- $tokens[$stmtno][] = implode('',$tokarr);
- $endquote = '';
- }
- } else
- $tokarr[] = $ch;
-
- }else {
-
- if ($ch == '(') $endquote = ')';
- else $endquote = $ch;
- $quoted = true;
- $intoken = true;
- $tokarr = array();
- if ($ch == '`') $tokarr[] = '`';
- }
- break;
-
- default:
-
- if (!$intoken) {
- if ($ch == $endstmtchar) {
- $stmtno += 1;
- $tokens[$stmtno] = array();
- break;
- }
-
- $intoken = true;
- $quoted = false;
- $endquote = false;
- $tokarr = array();
-
- }
-
- if ($quoted) $tokarr[] = $ch;
- else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch;
- else {
- if ($ch == $endstmtchar) {
- $tokens[$stmtno][] = implode('',$tokarr);
- $stmtno += 1;
- $tokens[$stmtno] = array();
- $intoken = false;
- $tokarr = array();
- break;
- }
- $tokens[$stmtno][] = implode('',$tokarr);
- $tokens[$stmtno][] = $ch;
- $intoken = false;
- }
- }
- $pos += 1;
- }
-
- return $tokens;
-}
-
-
-class ADODB_DataDict {
- var $connection;
- var $debug = false;
- var $dropTable = 'DROP TABLE %s';
- var $dropIndex = 'DROP INDEX %s';
- var $addCol = ' ADD';
- var $alterCol = ' ALTER COLUMN';
- var $dropCol = ' DROP COLUMN';
- var $nameRegex = '\w';
- var $schema = false;
- var $serverInfo = array();
- var $autoIncrement = false;
- var $dataProvider;
- var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob
- /// in other words, we use a text area for editting.
-
- function GetCommentSQL($table,$col)
- {
- return false;
- }
-
- function SetCommentSQL($table,$col,$cmt)
- {
- return false;
- }
-
- function &MetaTables()
- {
- return $this->connection->MetaTables();
- }
-
- function &MetaColumns($tab, $upper=true, $schema=false)
- {
- return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema);
- }
-
- function &MetaPrimaryKeys($tab,$owner=false,$intkey=false)
- {
- return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey);
- }
-
- function &MetaIndexes($table, $primary = false, $owner = false)
- {
- return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner);
- }
-
- function MetaType($t,$len=-1,$fieldobj=false)
- {
- return ADORecordSet::MetaType($t,$len,$fieldobj);
- }
-
- function NameQuote($name = NULL)
- {
- if (!is_string($name)) {
- return FALSE;
- }
-
- $name = trim($name);
-
- if ( !is_object($this->connection) ) {
- return $name;
- }
-
- $quote = $this->connection->nameQuote;
-
- // if name is of the form `name`, quote it
- if ( preg_match('/^`(.+)`$/', $name, $matches) ) {
- return $quote . $matches[1] . $quote;
- }
-
- // if name contains special characters, quote it
- if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) {
- return $quote . $name . $quote;
- }
-
- return $name;
- }
-
- function TableName($name)
- {
- if ( $this->schema ) {
- return $this->NameQuote($this->schema) .'.'. $this->NameQuote($name);
- }
- return $this->NameQuote($name);
- }
-
- // Executes the sql array returned by GetTableSQL and GetIndexSQL
- function ExecuteSQLArray($sql, $continueOnError = true)
- {
- $rez = 2;
- $conn = &$this->connection;
- $saved = $conn->debug;
- foreach($sql as $line) {
-
- if ($this->debug) $conn->debug = true;
- $ok = $conn->Execute($line);
- $conn->debug = $saved;
- if (!$ok) {
- if ($this->debug) ADOConnection::outp($conn->ErrorMsg());
- if (!$continueOnError) return 0;
- $rez = 1;
- }
- }
- return 2;
- }
-
- /*
- Returns the actual type given a character code.
-
- C: varchar
- X: CLOB (character large object) or largest varchar size if CLOB is not supported
- C2: Multibyte varchar
- X2: Multibyte CLOB
-
- B: BLOB (binary large object)
-
- D: Date
- T: Date-time
- L: Integer field suitable for storing booleans (0 or 1)
- I: Integer
- F: Floating point number
- N: Numeric or decimal number
- */
-
- function ActualType($meta)
- {
- return $meta;
- }
-
- function CreateDatabase($dbname,$options=false)
- {
- $options = $this->_Options($options);
- $sql = array();
-
- $s = 'CREATE DATABASE ' . $this->NameQuote($dbname);
- if (isset($options[$this->upperName]))
- $s .= ' '.$options[$this->upperName];
-
- $sql[] = $s;
- return $sql;
- }
-
- /*
- Generates the SQL to create index. Returns an array of sql strings.
- */
- function CreateIndexSQL($idxname, $tabname, $flds, $idxoptions = false)
- {
- if (!is_array($flds)) {
- $flds = explode(',',$flds);
- }
-
- foreach($flds as $key => $fld) {
- $flds[$key] = $this->NameQuote($fld);
- }
-
- return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions));
- }
-
- function DropIndexSQL ($idxname, $tabname = NULL)
- {
- return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname)));
- }
-
- function SetSchema($schema)
- {
- $this->schema = $schema;
- }
-
- function AddColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- $sql = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' ';
- foreach($lines as $v) {
- $sql[] = $alter . $v;
- }
- return $sql;
- }
-
- function AlterColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- $sql = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' ';
- foreach($lines as $v) {
- $sql[] = $alter . $v;
- }
- return $sql;
- }
-
- function DropColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- if (!is_array($flds)) $flds = explode(',',$flds);
- $sql = array();
- $alter = 'ALTER TABLE ' . $tabname . $this->dropCol . ' ';
- foreach($flds as $v) {
- $sql[] = $alter . $this->NameQuote($v);
- }
- return $sql;
- }
-
- function DropTableSQL($tabname)
- {
- return array (sprintf($this->dropTable, $this->TableName($tabname)));
- }
-
- /*
- Generate the SQL to create table. Returns an array of sql strings.
- */
- function CreateTableSQL($tabname, $flds, $tableoptions=false)
- {
- if (!$tableoptions) $tableoptions = array();
-
- list($lines,$pkey) = $this->_GenFields($flds);
-
- $taboptions = $this->_Options($tableoptions);
- $tabname = $this->TableName ($tabname);
- $sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions);
-
- $tsql = $this->_Triggers($tabname,$taboptions);
- foreach($tsql as $s) $sql[] = $s;
-
- return $sql;
- }
-
- function _GenFields($flds)
- {
- if (is_string($flds)) {
- $padding = ' ';
- $txt = $flds.$padding;
- $flds = array();
- $flds0 = Lens_ParseArgs($txt,',');
- $hasparam = false;
- foreach($flds0 as $f0) {
- $f1 = array();
- foreach($f0 as $token) {
- switch (strtoupper($token)) {
- case 'CONSTRAINT':
- case 'DEFAULT':
- $hasparam = $token;
- break;
- default:
- if ($hasparam) $f1[$hasparam] = $token;
- else $f1[] = $token;
- $hasparam = false;
- break;
- }
- }
- $flds[] = $f1;
-
- }
- }
- $this->autoIncrement = false;
- $lines = array();
- $pkey = array();
- foreach($flds as $fld) {
- $fld = _array_change_key_case($fld);
-
- $fname = false;
- $fdefault = false;
- $fautoinc = false;
- $ftype = false;
- $fsize = false;
- $fprec = false;
- $fprimary = false;
- $fnoquote = false;
- $fdefts = false;
- $fdefdate = false;
- $fconstraint = false;
- $fnotnull = false;
- $funsigned = false;
-
- //-----------------
- // Parse attributes
- foreach($fld as $attr => $v) {
- if ($attr == 2 && is_numeric($v)) $attr = 'SIZE';
- else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v);
-
- switch($attr) {
- case '0':
- case 'NAME': $fname = $v; break;
- case '1':
- case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break;
-
- case 'SIZE':
- $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,',');
- if ($dotat === false) $fsize = $v;
- else {
- $fsize = substr($v,0,$dotat);
- $fprec = substr($v,$dotat+1);
- }
- break;
- case 'UNSIGNED': $funsigned = true; break;
- case 'AUTOINCREMENT':
- case 'AUTO': $fautoinc = true; $fnotnull = true; break;
- case 'KEY':
- case 'PRIMARY': $fprimary = $v; $fnotnull = true; break;
- case 'DEF':
- case 'DEFAULT': $fdefault = $v; break;
- case 'NOTNULL': $fnotnull = $v; break;
- case 'NOQUOTE': $fnoquote = $v; break;
- case 'DEFDATE': $fdefdate = $v; break;
- case 'DEFTIMESTAMP': $fdefts = $v; break;
- case 'CONSTRAINT': $fconstraint = $v; break;
- } //switch
- } // foreach $fld
-
- //--------------------
- // VALIDATE FIELD INFO
- if (!strlen($fname)) {
- if ($this->debug) ADOConnection::outp("Undefined NAME");
- return false;
- }
-
- $fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname));
- $fname = $this->NameQuote($fname);
-
- if (!strlen($ftype)) {
- if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'");
- return false;
- } else {
- $ftype = strtoupper($ftype);
- }
-
- $ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec);
-
- if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls
-
- if ($fprimary) $pkey[] = $fname;
-
- // some databases do not allow blobs to have defaults
- if ($ty == 'X') $fdefault = false;
-
- //--------------------
- // CONSTRUCT FIELD SQL
- if ($fdefts) {
- if (substr($this->connection->databaseType,0,5) == 'mysql') {
- $ftype = 'TIMESTAMP';
- } else {
- $fdefault = $this->connection->sysTimeStamp;
- }
- } else if ($fdefdate) {
- if (substr($this->connection->databaseType,0,5) == 'mysql') {
- $ftype = 'TIMESTAMP';
- } else {
- $fdefault = $this->connection->sysDate;
- }
- } else if (strlen($fdefault) && !$fnoquote)
- if ($ty == 'C' or $ty == 'X' or
- ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault)))
- if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ')
- $fdefault = trim($fdefault);
- else if (strtolower($fdefault) != 'null')
- $fdefault = $this->connection->qstr($fdefault);
- $suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned);
-
- $fname = str_pad($fname,16);
- $lines[$fid] = $fname.' '.$ftype.$suffix;
-
- if ($fautoinc) $this->autoIncrement = true;
- } // foreach $flds
-
- return array($lines,$pkey);
- }
- /*
- GENERATE THE SIZE PART OF THE DATATYPE
- $ftype is the actual type
- $ty is the type defined originally in the DDL
- */
- function _GetSize($ftype, $ty, $fsize, $fprec)
- {
- if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) {
- $ftype .= "(".$fsize;
- if (strlen($fprec)) $ftype .= ",".$fprec;
- $ftype .= ')';
- }
- return $ftype;
- }
-
-
- // return string must begin with space
- function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
- {
- $suffix = '';
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fnotnull) $suffix .= ' NOT NULL';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
- function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
- {
- $sql = array();
-
- if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
- $sql[] = sprintf ($this->dropIndex, $idxname);
- if ( isset($idxoptions['DROP']) )
- return $sql;
- }
-
- if ( empty ($flds) ) {
- return $sql;
- }
-
- $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
-
- $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
-
- if ( isset($idxoptions[$this->upperName]) )
- $s .= $idxoptions[$this->upperName];
-
- if ( is_array($flds) )
- $flds = implode(', ',$flds);
- $s .= '(' . $flds . ')';
- $sql[] = $s;
-
- return $sql;
- }
-
- function _DropAutoIncrement($tabname)
- {
- return false;
- }
-
- function _TableSQL($tabname,$lines,$pkey,$tableoptions)
- {
- $sql = array();
-
- if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) {
- $sql[] = sprintf($this->dropTable,$tabname);
- if ($this->autoIncrement) {
- $sInc = $this->_DropAutoIncrement($tabname);
- if ($sInc) $sql[] = $sInc;
- }
- if ( isset ($tableoptions['DROP']) ) {
- return $sql;
- }
- }
- $s = "CREATE TABLE $tabname (\n";
- $s .= implode(",\n", $lines);
- if (sizeof($pkey)>0) {
- $s .= ",\n PRIMARY KEY (";
- $s .= implode(", ",$pkey).")";
- }
- if (isset($tableoptions['CONSTRAINTS']))
- $s .= "\n".$tableoptions['CONSTRAINTS'];
-
- if (isset($tableoptions[$this->upperName.'_CONSTRAINTS']))
- $s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS'];
-
- $s .= "\n)";
- if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName];
- $sql[] = $s;
-
- return $sql;
- }
-
- /*
- GENERATE TRIGGERS IF NEEDED
- used when table has auto-incrementing field that is emulated using triggers
- */
- function _Triggers($tabname,$taboptions)
- {
- return array();
- }
-
- /*
- Sanitize options, so that array elements with no keys are promoted to keys
- */
- function _Options($opts)
- {
- if (!is_array($opts)) return array();
- $newopts = array();
- foreach($opts as $k => $v) {
- if (is_numeric($k)) $newopts[strtoupper($v)] = $v;
- else $newopts[strtoupper($k)] = $v;
- }
- return $newopts;
- }
-
- /*
- "Florian Buzin [ easywe ]"
"; +print_r($a); +print ""; +} + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { + return preg_match('/^[a-z0-9]*$/i', $text); + } +} + +//Lens_ParseTest(); + +/** + Parse arguments, treat "text" (text) and 'text' as quotation marks. + To escape, use "" or '' or )) + + Will read in "abc def" sans quotes, as: abc def + Same with 'abc def'. + However if `abc def`, then will read in as `abc def` + + @param endstmtchar Character that indicates end of statement + @param tokenchars Include the following characters in tokens apart from A-Z and 0-9 + @returns 2 dimensional array containing parsed tokens. +*/ +function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-') +{ + $pos = 0; + $intoken = false; + $stmtno = 0; + $endquote = false; + $tokens = array(); + $tokens[$stmtno] = array(); + $max = strlen($args); + $quoted = false; + + while ($pos < $max) { + $ch = substr($args,$pos,1); + switch($ch) { + case ' ': + case "\t": + case "\n": + case "\r": + if (!$quoted) { + if ($intoken) { + $intoken = false; + $tokens[$stmtno][] = implode('',$tokarr); + } + break; + } + + $tokarr[] = $ch; + break; + + case '`': + if ($intoken) $tokarr[] = $ch; + case '(': + case ')': + case '"': + case "'": + + if ($intoken) { + if (empty($endquote)) { + $tokens[$stmtno][] = implode('',$tokarr); + if ($ch == '(') $endquote = ')'; + else $endquote = $ch; + $quoted = true; + $intoken = true; + $tokarr = array(); + } else if ($endquote == $ch) { + $ch2 = substr($args,$pos+1,1); + if ($ch2 == $endquote) { + $pos += 1; + $tokarr[] = $ch2; + } else { + $quoted = false; + $intoken = false; + $tokens[$stmtno][] = implode('',$tokarr); + $endquote = ''; + } + } else + $tokarr[] = $ch; + + }else { + + if ($ch == '(') $endquote = ')'; + else $endquote = $ch; + $quoted = true; + $intoken = true; + $tokarr = array(); + if ($ch == '`') $tokarr[] = '`'; + } + break; + + default: + + if (!$intoken) { + if ($ch == $endstmtchar) { + $stmtno += 1; + $tokens[$stmtno] = array(); + break; + } + + $intoken = true; + $quoted = false; + $endquote = false; + $tokarr = array(); + + } + + if ($quoted) $tokarr[] = $ch; + else if (ctype_alnum($ch) || strpos($tokenchars,$ch) !== false) $tokarr[] = $ch; + else { + if ($ch == $endstmtchar) { + $tokens[$stmtno][] = implode('',$tokarr); + $stmtno += 1; + $tokens[$stmtno] = array(); + $intoken = false; + $tokarr = array(); + break; + } + $tokens[$stmtno][] = implode('',$tokarr); + $tokens[$stmtno][] = $ch; + $intoken = false; + } + } + $pos += 1; + } + + return $tokens; +} + + +class ADODB_DataDict { + var $connection; + var $debug = false; + var $dropTable = 'DROP TABLE %s'; + var $dropIndex = 'DROP INDEX %s'; + var $addCol = ' ADD'; + var $alterCol = ' ALTER COLUMN'; + var $dropCol = ' DROP COLUMN'; + var $nameRegex = '\w'; + var $schema = false; + var $serverInfo = array(); + var $autoIncrement = false; + var $dataProvider; + var $blobSize = 100; /// any varchar/char field this size or greater is treated as a blob + /// in other words, we use a text area for editting. + + function GetCommentSQL($table,$col) + { + return false; + } + + function SetCommentSQL($table,$col,$cmt) + { + return false; + } + + function &MetaTables() + { + return $this->connection->MetaTables(); + } + + function &MetaColumns($tab, $upper=true, $schema=false) + { + return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema); + } + + function &MetaPrimaryKeys($tab,$owner=false,$intkey=false) + { + return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey); + } + + function &MetaIndexes($table, $primary = false, $owner = false) + { + return $this->connection->MetaIndexes($this->TableName($table), $primary, $owner); + } + + function MetaType($t,$len=-1,$fieldobj=false) + { + return ADORecordSet::MetaType($t,$len,$fieldobj); + } + + function NameQuote($name = NULL) + { + if (!is_string($name)) { + return FALSE; + } + + $name = trim($name); + + if ( !is_object($this->connection) ) { + return $name; + } + + $quote = $this->connection->nameQuote; + + // if name is of the form `name`, quote it + if ( preg_match('/^`(.+)`$/', $name, $matches) ) { + return $quote . $matches[1] . $quote; + } + + // if name contains special characters, quote it + if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) { + return $quote . $name . $quote; + } + + return $name; + } + + function TableName($name) + { + if ( $this->schema ) { + return $this->NameQuote($this->schema) .'.'. $this->NameQuote($name); + } + return $this->NameQuote($name); + } + + // Executes the sql array returned by GetTableSQL and GetIndexSQL + function ExecuteSQLArray($sql, $continueOnError = true) + { + $rez = 2; + $conn = &$this->connection; + $saved = $conn->debug; + foreach($sql as $line) { + + if ($this->debug) $conn->debug = true; + $ok = $conn->Execute($line); + $conn->debug = $saved; + if (!$ok) { + if ($this->debug) ADOConnection::outp($conn->ErrorMsg()); + if (!$continueOnError) return 0; + $rez = 1; + } + } + return $rez; + } + + /* + Returns the actual type given a character code. + + C: varchar + X: CLOB (character large object) or largest varchar size if CLOB is not supported + C2: Multibyte varchar + X2: Multibyte CLOB + + B: BLOB (binary large object) + + D: Date + T: Date-time + L: Integer field suitable for storing booleans (0 or 1) + I: Integer + F: Floating point number + N: Numeric or decimal number + */ + + function ActualType($meta) + { + return $meta; + } + + function CreateDatabase($dbname,$options=false) + { + $options = $this->_Options($options); + $sql = array(); + + $s = 'CREATE DATABASE ' . $this->NameQuote($dbname); + if (isset($options[$this->upperName])) + $s .= ' '.$options[$this->upperName]; + + $sql[] = $s; + return $sql; + } + + /* + Generates the SQL to create index. Returns an array of sql strings. + */ + function CreateIndexSQL($idxname, $tabname, $flds, $idxoptions = false) + { + if (!is_array($flds)) { + $flds = explode(',',$flds); + } + + foreach($flds as $key => $fld) { + $flds[$key] = $this->NameQuote($fld); + } + + return $this->_IndexSQL($this->NameQuote($idxname), $this->TableName($tabname), $flds, $this->_Options($idxoptions)); + } + + function DropIndexSQL ($idxname, $tabname = NULL) + { + return array(sprintf($this->dropIndex, $this->NameQuote($idxname), $this->TableName($tabname))); + } + + function SetSchema($schema) + { + $this->schema = $schema; + } + + function AddColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $tabname . $this->addCol . ' '; + foreach($lines as $v) { + $sql[] = $alter . $v; + } + return $sql; + } + + function AlterColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + $sql = array(); + list($lines,$pkey) = $this->_GenFields($flds); + $alter = 'ALTER TABLE ' . $tabname . $this->alterCol . ' '; + foreach($lines as $v) { + $sql[] = $alter . $v; + } + return $sql; + } + + function DropColumnSQL($tabname, $flds) + { + $tabname = $this->TableName ($tabname); + if (!is_array($flds)) $flds = explode(',',$flds); + $sql = array(); + $alter = 'ALTER TABLE ' . $tabname . $this->dropCol . ' '; + foreach($flds as $v) { + $sql[] = $alter . $this->NameQuote($v); + } + return $sql; + } + + function DropTableSQL($tabname) + { + return array (sprintf($this->dropTable, $this->TableName($tabname))); + } + + /* + Generate the SQL to create table. Returns an array of sql strings. + */ + function CreateTableSQL($tabname, $flds, $tableoptions=false) + { + if (!$tableoptions) $tableoptions = array(); + + list($lines,$pkey) = $this->_GenFields($flds); + + $taboptions = $this->_Options($tableoptions); + $tabname = $this->TableName ($tabname); + $sql = $this->_TableSQL($tabname,$lines,$pkey,$taboptions); + + $tsql = $this->_Triggers($tabname,$taboptions); + foreach($tsql as $s) $sql[] = $s; + + return $sql; + } + + function _GenFields($flds) + { + if (is_string($flds)) { + $padding = ' '; + $txt = $flds.$padding; + $flds = array(); + $flds0 = Lens_ParseArgs($txt,','); + $hasparam = false; + foreach($flds0 as $f0) { + $f1 = array(); + foreach($f0 as $token) { + switch (strtoupper($token)) { + case 'CONSTRAINT': + case 'DEFAULT': + $hasparam = $token; + break; + default: + if ($hasparam) $f1[$hasparam] = $token; + else $f1[] = $token; + $hasparam = false; + break; + } + } + $flds[] = $f1; + + } + } + $this->autoIncrement = false; + $lines = array(); + $pkey = array(); + foreach($flds as $fld) { + $fld = _array_change_key_case($fld); + + $fname = false; + $fdefault = false; + $fautoinc = false; + $ftype = false; + $fsize = false; + $fprec = false; + $fprimary = false; + $fnoquote = false; + $fdefts = false; + $fdefdate = false; + $fconstraint = false; + $fnotnull = false; + $funsigned = false; + + //----------------- + // Parse attributes + foreach($fld as $attr => $v) { + if ($attr == 2 && is_numeric($v)) $attr = 'SIZE'; + else if (is_numeric($attr) && $attr > 1 && !is_numeric($v)) $attr = strtoupper($v); + + switch($attr) { + case '0': + case 'NAME': $fname = $v; break; + case '1': + case 'TYPE': $ty = $v; $ftype = $this->ActualType(strtoupper($v)); break; + + case 'SIZE': + $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,','); + if ($dotat === false) $fsize = $v; + else { + $fsize = substr($v,0,$dotat); + $fprec = substr($v,$dotat+1); + } + break; + case 'UNSIGNED': $funsigned = true; break; + case 'AUTOINCREMENT': + case 'AUTO': $fautoinc = true; $fnotnull = true; break; + case 'KEY': + case 'PRIMARY': $fprimary = $v; $fnotnull = true; break; + case 'DEF': + case 'DEFAULT': $fdefault = $v; break; + case 'NOTNULL': $fnotnull = $v; break; + case 'NOQUOTE': $fnoquote = $v; break; + case 'DEFDATE': $fdefdate = $v; break; + case 'DEFTIMESTAMP': $fdefts = $v; break; + case 'CONSTRAINT': $fconstraint = $v; break; + } //switch + } // foreach $fld + + //-------------------- + // VALIDATE FIELD INFO + if (!strlen($fname)) { + if ($this->debug) ADOConnection::outp("Undefined NAME"); + return false; + } + + $fid = strtoupper(preg_replace('/^`(.+)`$/', '$1', $fname)); + $fname = $this->NameQuote($fname); + + if (!strlen($ftype)) { + if ($this->debug) ADOConnection::outp("Undefined TYPE for field '$fname'"); + return false; + } else { + $ftype = strtoupper($ftype); + } + + $ftype = $this->_GetSize($ftype, $ty, $fsize, $fprec); + + if ($ty == 'X' || $ty == 'X2' || $ty == 'B') $fnotnull = false; // some blob types do not accept nulls + + if ($fprimary) $pkey[] = $fname; + + // some databases do not allow blobs to have defaults + if ($ty == 'X') $fdefault = false; + + //-------------------- + // CONSTRUCT FIELD SQL + if ($fdefts) { + if (substr($this->connection->databaseType,0,5) == 'mysql') { + $ftype = 'TIMESTAMP'; + } else { + $fdefault = $this->connection->sysTimeStamp; + } + } else if ($fdefdate) { + if (substr($this->connection->databaseType,0,5) == 'mysql') { + $ftype = 'TIMESTAMP'; + } else { + $fdefault = $this->connection->sysDate; + } + } else if (strlen($fdefault) && !$fnoquote) + if ($ty == 'C' or $ty == 'X' or + ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault))) + if (strlen($fdefault) != 1 && substr($fdefault,0,1) == ' ' && substr($fdefault,strlen($fdefault)-1) == ' ') + $fdefault = trim($fdefault); + else if (strtolower($fdefault) != 'null') + $fdefault = $this->connection->qstr($fdefault); + $suffix = $this->_CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned); + + $fname = str_pad($fname,16); + $lines[$fid] = $fname.' '.$ftype.$suffix; + + if ($fautoinc) $this->autoIncrement = true; + } // foreach $flds + + return array($lines,$pkey); + } + /* + GENERATE THE SIZE PART OF THE DATATYPE + $ftype is the actual type + $ty is the type defined originally in the DDL + */ + function _GetSize($ftype, $ty, $fsize, $fprec) + { + if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) { + $ftype .= "(".$fsize; + if (strlen($fprec)) $ftype .= ",".$fprec; + $ftype .= ')'; + } + return $ftype; + } + + + // return string must begin with space + function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint) + { + $suffix = ''; + if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault"; + if ($fnotnull) $suffix .= ' NOT NULL'; + if ($fconstraint) $suffix .= ' '.$fconstraint; + return $suffix; + } + + function _IndexSQL($idxname, $tabname, $flds, $idxoptions) + { + $sql = array(); + + if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) { + $sql[] = sprintf ($this->dropIndex, $idxname); + if ( isset($idxoptions['DROP']) ) + return $sql; + } + + if ( empty ($flds) ) { + return $sql; + } + + $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : ''; + + $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' '; + + if ( isset($idxoptions[$this->upperName]) ) + $s .= $idxoptions[$this->upperName]; + + if ( is_array($flds) ) + $flds = implode(', ',$flds); + $s .= '(' . $flds . ')'; + $sql[] = $s; + + return $sql; + } + + function _DropAutoIncrement($tabname) + { + return false; + } + + function _TableSQL($tabname,$lines,$pkey,$tableoptions) + { + $sql = array(); + + if (isset($tableoptions['REPLACE']) || isset ($tableoptions['DROP'])) { + $sql[] = sprintf($this->dropTable,$tabname); + if ($this->autoIncrement) { + $sInc = $this->_DropAutoIncrement($tabname); + if ($sInc) $sql[] = $sInc; + } + if ( isset ($tableoptions['DROP']) ) { + return $sql; + } + } + $s = "CREATE TABLE $tabname (\n"; + $s .= implode(",\n", $lines); + if (sizeof($pkey)>0) { + $s .= ",\n PRIMARY KEY ("; + $s .= implode(", ",$pkey).")"; + } + if (isset($tableoptions['CONSTRAINTS'])) + $s .= "\n".$tableoptions['CONSTRAINTS']; + + if (isset($tableoptions[$this->upperName.'_CONSTRAINTS'])) + $s .= "\n".$tableoptions[$this->upperName.'_CONSTRAINTS']; + + $s .= "\n)"; + if (isset($tableoptions[$this->upperName])) $s .= $tableoptions[$this->upperName]; + $sql[] = $s; + + return $sql; + } + + /* + GENERATE TRIGGERS IF NEEDED + used when table has auto-incrementing field that is emulated using triggers + */ + function _Triggers($tabname,$taboptions) + { + return array(); + } + + /* + Sanitize options, so that array elements with no keys are promoted to keys + */ + function _Options($opts) + { + if (!is_array($opts)) return array(); + $newopts = array(); + foreach($opts as $k => $v) { + if (is_numeric($k)) $newopts[strtoupper($v)] = $v; + else $newopts[strtoupper($k)] = $v; + } + return $newopts; + } + + /* + "Florian Buzin [ easywe ]"
Error=".$this->ErrorNo().'
';
- $first = true;
- foreach($fieldArray as $k => $v) {
- if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col
-
- if ($first) {
- $first = false;
- $iCols = "$k";
- $iVals = "$v";
- } else {
- $iCols .= ",$k";
- $iVals .= ",$v";
- }
- }
- $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)";
- $rs = $zthis->Execute($insert);
- return ($rs) ? 2 : 0;
-}
-
-// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM
-function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false,
- $size=0, $selectAttr='',$compareFields0=true)
-{
- $hasvalue = false;
-
- if ($multiple or is_array($defstr)) {
- if ($size==0) $size=5;
- $attr = " multiple size=$size";
- if (!strpos($name,'[]')) $name .= '[]';
- } else if ($size) $attr = " size=$size";
- else $attr ='';
-
- $s = "\n";
-}
-
-/*
- Count the number of records this sql statement will return by using
- query rewriting techniques...
-
- Does not work with UNIONs.
-*/
-function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
-{
- $qryRecs = 0;
-
- if (preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || preg_match('/\s+GROUP\s+BY\s+/is',$sql)) {
- // ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias
- // but this is only supported by oracle and postgresql...
- if ($zthis->dataProvider == 'oci8') {
-
- $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
- $rewritesql = "SELECT COUNT(*) FROM ($rewritesql)";
-
- } else if ( $zthis->databaseType == 'postgres' || $zthis->databaseType == 'postgres7') {
-
- $info = $zthis->ServerInfo();
- if (substr($info['version'],0,3) >= 7.1) { // good till version 999
- $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
- $rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_";
- }
- }
- } else {
- // now replace SELECT ... FROM with SELECT COUNT(*) FROM
-
- $rewritesql = preg_replace(
- '/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql);
-
- // fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails
- // with mssql, access and postgresql. Also a good speedup optimization - skips sorting!
- $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$rewritesql);
- }
-
- if (isset($rewritesql) && $rewritesql != $sql) {
- if ($secs2cache) {
- // we only use half the time of secs2cache because the count can quickly
- // become inaccurate if new records are added
- $qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr);
-
- } else {
- $qryRecs = $zthis->GetOne($rewritesql,$inputarr);
- }
- if ($qryRecs !== false) return $qryRecs;
- }
-
- //--------------------------------------------
- // query rewrite failed - so try slower way...
-
- // strip off unneeded ORDER BY
- $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
- $rstest = &$zthis->Execute($rewritesql,$inputarr);
- if ($rstest) {
- $qryRecs = $rstest->RecordCount();
- if ($qryRecs == -1) {
- global $ADODB_EXTENSION;
- // some databases will return -1 on MoveLast() - change to MoveNext()
- if ($ADODB_EXTENSION) {
- while(!$rstest->EOF) {
- adodb_movenext($rstest);
- }
- } else {
- while(!$rstest->EOF) {
- $rstest->MoveNext();
- }
- }
- $qryRecs = $rstest->_currentRow;
- }
- $rstest->Close();
- if ($qryRecs == -1) return 0;
- }
-
- return $qryRecs;
-}
-
-/*
- Code originally from "Cornel G" Error=".$this->ErrorNo().' ';
+ $first = true;
+ foreach($fieldArray as $k => $v) {
+ if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col
+
+ if ($first) {
+ $first = false;
+ $iCols = "$k";
+ $iVals = "$v";
+ } else {
+ $iCols .= ",$k";
+ $iVals .= ",$v";
+ }
+ }
+ $insert = "INSERT INTO $table ($iCols) VALUES ($iVals)";
+ $rs = $zthis->Execute($insert);
+ return ($rs) ? 2 : 0;
+}
+
+// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUM
+function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false,
+ $size=0, $selectAttr='',$compareFields0=true)
+{
+ $hasvalue = false;
+
+ if ($multiple or is_array($defstr)) {
+ if ($size==0) $size=5;
+ $attr = " multiple size=$size";
+ if (!strpos($name,'[]')) $name .= '[]';
+ } else if ($size) $attr = " size=$size";
+ else $attr ='';
+
+ $s = "\n";
+}
+
+/*
+ Count the number of records this sql statement will return by using
+ query rewriting techniques...
+
+ Does not work with UNIONs.
+*/
+function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
+{
+ $qryRecs = 0;
+
+ if (preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || preg_match('/\s+GROUP\s+BY\s+/is',$sql)) {
+ // ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias
+ // but this is only supported by oracle and postgresql...
+ if ($zthis->dataProvider == 'oci8') {
+
+ $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
+ $rewritesql = "SELECT COUNT(*) FROM ($rewritesql)";
+
+ } else if ( $zthis->databaseType == 'postgres' || $zthis->databaseType == 'postgres7') {
+
+ $info = $zthis->ServerInfo();
+ if (substr($info['version'],0,3) >= 7.1) { // good till version 999
+ $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
+ $rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_";
+ }
+ }
+ } else {
+ // now replace SELECT ... FROM with SELECT COUNT(*) FROM
+
+ $rewritesql = preg_replace(
+ '/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql);
+
+ // fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails
+ // with mssql, access and postgresql. Also a good speedup optimization - skips sorting!
+ $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$rewritesql);
+ }
+
+ if (isset($rewritesql) && $rewritesql != $sql) {
+ if ($secs2cache) {
+ // we only use half the time of secs2cache because the count can quickly
+ // become inaccurate if new records are added
+ $qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr);
+
+ } else {
+ $qryRecs = $zthis->GetOne($rewritesql,$inputarr);
+ }
+ if ($qryRecs !== false) return $qryRecs;
+ }
+ //--------------------------------------------
+ // query rewrite failed - so try slower way...
+
+ // strip off unneeded ORDER BY if no UNION
+ if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql;
+ else $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);
+
+ $rstest = &$zthis->Execute($rewritesql,$inputarr);
+ if ($rstest) {
+ $qryRecs = $rstest->RecordCount();
+ if ($qryRecs == -1) {
+ global $ADODB_EXTENSION;
+ // some databases will return -1 on MoveLast() - change to MoveNext()
+ if ($ADODB_EXTENSION) {
+ while(!$rstest->EOF) {
+ adodb_movenext($rstest);
+ }
+ } else {
+ while(!$rstest->EOF) {
+ $rstest->MoveNext();
+ }
+ }
+ $qryRecs = $rstest->_currentRow;
+ }
+ $rstest->Close();
+ if ($qryRecs == -1) return 0;
+ }
+
+ return $qryRecs;
+}
+
+/*
+ Code originally from "Cornel G" $this->helpurl. ".$this->conn->ErrorMsg()." $this->helpurl. ".$this->conn->ErrorMsg()." $this->helpurl. ".$this->conn->ErrorMsg()." ".htmlspecialchars($sqls)." No Recordset returned $this->helpurl. ".$this->conn->ErrorMsg()." $this->helpurl. ".$this->conn->ErrorMsg()." $this->helpurl. ".$this->conn->ErrorMsg()." ".htmlspecialchars($sqls)." No Recordset returned Testing gregorian <=> julian conversion ";
$t = adodb_mktime(0,0,0,10,11,1492);
//http://www.holidayorigins.com/html/columbus_day.html - Friday check
@@ -541,6 +585,9 @@ function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
$_month_table_normal = array("",31,28,31,30,31,30,31,31,30,31,30,31);
$_month_table_leaf = array("",31,29,31,30,31,30,31,31,30,31,30,31);
+ $d366 = $_day_power * 366;
+ $d365 = $_day_power * 365;
+
if ($d < 0) {
$origd = $d;
// The valid range of a 32bit signed timestamp is typically from
@@ -548,10 +595,9 @@ function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
for ($a = 1970 ; --$a >= 0;) {
$lastd = $d;
- if ($leaf = _adodb_is_leap_year($a)) {
- $d += $_day_power * 366;
- } else
- $d += $_day_power * 365;
+ if ($leaf = _adodb_is_leap_year($a)) $d += $d366;
+ else $d += $d365;
+
if ($d >= 0) {
$year = $a;
break;
@@ -579,14 +625,11 @@ function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
$hour = floor($d/$_hour_power);
} else {
-
for ($a = 1970 ;; $a++) {
$lastd = $d;
- if ($leaf = _adodb_is_leap_year($a)) {
- $d -= $_day_power * 366;
- } else
- $d -= $_day_power * 365;
+ if ($leaf = _adodb_is_leap_year($a)) $d -= $d366;
+ else $d -= $d365;
if ($d < 0) {
$year = $a;
break;
@@ -598,7 +641,7 @@ function _adodb_getdate($origd=false,$fast=false,$is_gmt=false)
for ($a = 1 ; $a <= 12; $a++) {
$lastd = $d;
$d -= $mtab[$a] * $_day_power;
- if ($d <= 0) {
+ if ($d < 0) {
$month = $a;
$ndays = $mtab[$a];
break;
@@ -650,6 +693,7 @@ function adodb_gmdate($fmt,$d=false)
return adodb_date($fmt,$d,true);
}
+// accepts unix timestamp and iso date format in $d
function adodb_date2($fmt, $d=false, $is_gmt=false)
{
if ($d !== false) {
@@ -667,21 +711,25 @@ function adodb_date2($fmt, $d=false, $is_gmt=false)
return adodb_date($fmt,$d,$is_gmt);
}
+
/**
Return formatted date based on timestamp $d
*/
function adodb_date($fmt,$d=false,$is_gmt=false)
{
- if ($d === false) return date($fmt);
+ if ($d === false) return ($is_gmt)? @gmdate($fmt): @date($fmt);
if (!defined('ADODB_TEST_DATES')) {
if ((abs($d) <= 0x7FFFFFFF)) { // check if number in 32-bit signed range
if (!defined('ADODB_NO_NEGATIVE_TS') || $d >= 0) // if windows, must be +ve integer
- return @date($fmt,$d);
+ return ($is_gmt)? @gmdate($fmt,$d): @date($fmt,$d);
+
}
}
$_day_power = 86400;
$arr = _adodb_getdate($d,true,$is_gmt);
+ if (function_exists('adodb_daylight_sv')) adodb_daylight_sv($arr, $is_gmt);
+
$year = $arr['year'];
$month = $arr['mon'];
$day = $arr['mday'];
@@ -812,6 +860,8 @@ function adodb_gmmktime($hr,$min,$sec,$mon,$day,$year,$is_dst=false)
/**
Return a timestamp given a local time. Originally by jackbbs.
Note that $is_dst is not implemented and is ignored.
+
+ 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)
{
@@ -820,7 +870,9 @@ function adodb_mktime($hr,$min,$sec,$mon,$day,$year,$is_dst=false,$is_gmt=false)
// 1 Jan 1970 could generate negative timestamp, which is illegal
if (!defined('ADODB_NO_NEGATIVE_TS') || ($year >= 1971))
if (1901 < $year && $year < 2038)
- return @mktime($hr,$min,$sec,$mon,$day,$year);
+ return $is_gmt?
+ @gmmktime($hr,$min,$sec,$mon,$day,$year):
+ @mktime($hr,$min,$sec,$mon,$day,$year);
}
$gmt_different = ($is_gmt) ? 0 : adodb_get_gmt_diff();
diff --git a/lib/adodb/adodb-time.zip b/lib/adodb/adodb-time.zip
index ac2b4a857de50ef0307f6403e74c29c327a46f5a..d3239dbc32b2687a01b5d322e20b63f24ad33fd4 100644
GIT binary patch
literal 8953
zcmV m%YYD6_7$)}k6=)tX6wpT7#f
z2q5o;?3oTZhQqg5B(*gIJ`CTg^K4&w?D&Q)rLSb0TPeYfI>I8 Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true; Insert_ID error Affected_Rows error ADONewConnection: Unable to load database driver '$db' Bad $rs in %s. Connection or SQL invalid. Try using $connection->debug=true; Insert_ID error Affected_Rows error ADONewConnection: Unable to load database driver '$db' Connect: 1st argument should be left blank for $this->databaseType Connect: 1st argument should be left blank for $this->databaseType Connect: 1st argument should be left blank for $this->databaseType Connect: 1st argument should be left blank for $this->databaseType Have EXPLAIN tables been created? Have EXPLAIN tables been created? Explain: '.htmlspecialchars($sql).' Explain: '.htmlspecialchars($sql).' Unable to EXPLAIN non-select statement Explain: '.htmlspecialchars($sql).' Unable to EXPLAIN non-select statement Explain: '.htmlspecialchars($sql).' Missing PLAN_TABLE Explain: ".htmlspecialchars($sql)." $m Cache that is 50% of current size is still too big None found ';
- $s .= $this->_SuspiciousSQL();
- return $s;
- }
-
- // code thanks to Ixora.
- // http://www.ixora.com.au/scripts/query_opt.htm
- // requires oracle 8.1.7 or later
- function ExpensiveSQL($numsql = 10)
- {
- $sql = "
-select
- substr(to_char(s.pct, '99.00'), 2) || '%' load,
- s.executions executes,
- p.sql_text
-from
- (
- select
- address,
- disk_reads,
- executions,
- pct,
- rank() over (order by disk_reads desc) ranking
- from
- (
- select
- address,
- disk_reads,
- executions,
- 100 * ratio_to_report(disk_reads) over () pct
- from
- sys.v_\$sql
- where
- command_type != 47 and module != 'T.O.A.D.'
- )
- where
- disk_reads > 50 * executions
- ) s,
- sys.v_\$sqltext p
-where
- s.ranking <= $numsql and
- p.address = s.address
-order by
- 1 desc, s.address, p.piece
-";
- global $ADODB_CACHE_MODE,$HTTP_GET_VARS;
- if (isset($HTTP_GET_VARS['expeixora']) && isset($HTTP_GET_VARS['sql'])) {
- $partial = empty($HTTP_GET_VARS['part']);
- echo "".$this->Explain($HTTP_GET_VARS['sql'],$partial)."\n";
- }
-
- if (isset($HTTP_GET_VARS['sql'])) {
- $var =& $this->_ExpensiveSQL();
- return $var;
- }
- $save = $ADODB_CACHE_MODE;
- $ADODB_CACHE_MODE = ADODB_FETCH_NUM;
- $savelog = $this->conn->LogSQL(false);
- $rs =& $this->conn->Execute($sql);
- $this->conn->LogSQL($savelog);
- $ADODB_CACHE_MODE = $save;
- if ($rs) {
- $s = "\n ';
- $s .= $this->_ExpensiveSQL();
- return $s;
- }
-
-}
+ array('RATIOH',
+ "select round((1-(phy.value / (cur.value + con.value)))*100,2)
+ from v\$sysstat cur, v\$sysstat con, v\$sysstat phy
+ where cur.name = 'db block gets' and
+ con.name = 'consistent gets' and
+ phy.name = 'physical reads'",
+ '=WarnCacheRatio'),
+
+ 'sql cache hit ratio' => array( 'RATIOH',
+ 'select round(100*(sum(pins)-sum(reloads))/sum(pins),2) from v$librarycache',
+ 'increase shared_pool_size if too ratio low'),
+
+ 'datadict cache hit ratio' => array('RATIOH',
+ "select
+ round((1 - (sum(getmisses) / (sum(gets) +
+ sum(getmisses))))*100,2)
+ from v\$rowcache",
+ 'increase shared_pool_size if too ratio low'),
+
+ 'memory sort ratio' => array('RATIOH',
+ "SELECT ROUND((100 * b.VALUE) /DECODE ((a.VALUE + b.VALUE),
+ 0,1,(a.VALUE + b.VALUE)),2)
+FROM v\$sysstat a,
+ v\$sysstat b
+WHERE a.name = 'sorts (disk)'
+AND b.name = 'sorts (memory)'",
+ "% of memory sorts compared to disk sorts - should be over 95%"),
+
+ 'IO',
+ 'data reads' => array('IO',
+ "select value from v\$sysstat where name='physical reads'"),
+
+ 'data writes' => array('IO',
+ "select value from v\$sysstat where name='physical writes'"),
+
+ 'Data Cache',
+ 'data cache buffers' => array( 'DATAC',
+ "select a.value/b.value from v\$parameter a, v\$parameter b
+ where a.name = 'db_cache_size' and b.name= 'db_block_size'",
+ 'Number of cache buffers. Tune db_cache_size if the data cache hit ratio is too low.'),
+ 'data cache blocksize' => array('DATAC',
+ "select value from v\$parameter where name='db_block_size'",
+ '' ),
+ 'Memory Pools',
+ 'data cache size' => array('DATAC',
+ "select value from v\$parameter where name = 'db_cache_size'",
+ 'db_cache_size' ),
+ 'shared pool size' => array('DATAC',
+ "select value from v\$parameter where name = 'shared_pool_size'",
+ 'shared_pool_size, which holds shared sql, stored procedures, dict cache and similar shared structs' ),
+ 'java pool size' => array('DATAJ',
+ "select value from v\$parameter where name = 'java_pool_size'",
+ 'java_pool_size' ),
+ 'large pool buffer size' => array('CACHE',
+ "select value from v\$parameter where name='large_pool_size'",
+ 'this pool is for large mem allocations (not because it is larger than shared pool), for MTS sessions, parallel queries, io buffers (large_pool_size) ' ),
+
+ 'pga buffer size' => array('CACHE',
+ "select value from v\$parameter where name='pga_aggregate_target'",
+ 'program global area is private memory for sorting, and hash and bitmap merges - since oracle 9i (pga_aggregate_target)' ),
+
+
+ 'Connections',
+ 'current connections' => array('SESS',
+ 'select count(*) from sys.v_$session where username is not null',
+ ''),
+ 'max connections' => array( 'SESS',
+ "select value from v\$parameter where name='sessions'",
+ ''),
+
+ 'Memory Utilization',
+ 'data cache utilization ratio' => array('RATIOU',
+ "select round((1-bytes/sgasize)*100, 2)
+ from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f
+ where name = 'free memory' and pool = 'shared pool'",
+ 'Percentage of data cache actually in use - should be over 85%'),
+
+ 'shared pool utilization ratio' => array('RATIOU',
+ 'select round((sga.bytes/p.value)*100,2)
+ from v$sgastat sga, v$parameter p
+ where sga.name = \'free memory\' and sga.pool = \'shared pool\'
+ and p.name = \'shared_pool_size\'',
+ 'Percentage of shared pool actually used - too low is bad, too high is worse'),
+
+ 'large pool utilization ratio' => array('RATIOU',
+ "select round((1-bytes/sgasize)*100, 2)
+ from (select sum(bytes) sgasize from sys.v_\$sgastat) s, sys.v_\$sgastat f
+ where name = 'free memory' and pool = 'large pool'",
+ 'Percentage of large_pool actually in use - too low is bad, too high is worse'),
+ 'sort buffer size' => array('CACHE',
+ "select value from v\$parameter where name='sort_area_size'",
+ 'max in-mem sort_area_size (per query), uses memory in pga' ),
+
+ 'pga usage at peak' => array('RATIOU',
+ '=PGA','Mb utilization at peak transactions (requires Oracle 9i+)'),
+ 'Transactions',
+ 'rollback segments' => array('ROLLBACK',
+ "select count(*) from sys.v_\$rollstat",
+ ''),
+
+ 'peak transactions' => array('ROLLBACK',
+ "select max_utilization tx_hwm
+ from sys.v_\$resource_limit
+ where resource_name = 'transactions'",
+ 'Taken from high-water-mark'),
+ 'max transactions' => array('ROLLBACK',
+ "select value from v\$parameter where name = 'transactions'",
+ 'max transactions / rollback segments < 3.5 (or transactions_per_rollback_segment)'),
+ 'Parameters',
+ 'cursor sharing' => array('CURSOR',
+ "select value from v\$parameter where name = 'cursor_sharing'",
+ 'Cursor reuse strategy. Recommended is FORCE (8i+) or SIMILAR (9i+). See cursor_sharing.'),
+ /*
+ 'cursor reuse' => array('CURSOR',
+ "select count(*) from (select sql_text_wo_constants, count(*)
+ from t1
+ group by sql_text_wo_constants
+having count(*) > 100)",'These are sql statements that should be using bind variables'),*/
+ 'index cache cost' => array('COST',
+ "select value from v\$parameter where name = 'optimizer_index_caching'",
+ '% of indexed data blocks expected in the cache.
+ Recommended is 20-80. Default is 0. See optimizer_index_caching.'),
+
+ 'random page cost' => array('COST',
+ "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 optimizer_index_cost_adj. '),
+
+ false
+
+ );
+
+
+ function perf_oci8(&$conn)
+ {
+ $savelog = $conn->LogSQL(false);
+ $this->version = $conn->ServerInfo();
+ $conn->LogSQL($savelog);
+ $this->conn =& $conn;
+ }
+
+
+ function PGA()
+ {
+ if ($this->version['version'] < 9) return 'Oracle 9i or later required';
+
+ $rs = $this->conn->Execute("select a.mb,a.targ as pga_size_pct,a.pct from
+ (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb,
+ pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r
+ from v\$pga_target_advice) a left join
+ (select round(pga_target_for_estimate/1024.0/1024.0,0) Mb,
+ pga_target_factor targ,estd_pga_cache_hit_percentage pct,rownum as r
+ from v\$pga_target_advice) b on
+ a.r = b.r+1 where
+ b.pct < 100");
+ if (!$rs) return "Only in 9i or later";
+ $rs->Close();
+ if ($rs->EOF) return "PGA could be too big";
+
+ return reset($rs->fields);
+ }
+
+ function Explain($sql,$partial=false)
+ {
+ $savelog = $this->conn->LogSQL(false);
+ $rs =& $this->conn->SelectLimit("select ID FROM PLAN_TABLE");
+ if (!$rs) {
+ echo " Missing PLAN_TABLE Explain: ".htmlspecialchars($sql)." $m Cache that is 50% of current size is still too big None found ';
+ $s .= $this->_SuspiciousSQL();
+ return $s;
+ }
+
+ // code thanks to Ixora.
+ // http://www.ixora.com.au/scripts/query_opt.htm
+ // requires oracle 8.1.7 or later
+ function ExpensiveSQL($numsql = 10)
+ {
+ $sql = "
+select
+ substr(to_char(s.pct, '99.00'), 2) || '%' load,
+ s.executions executes,
+ p.sql_text
+from
+ (
+ select
+ address,
+ disk_reads,
+ executions,
+ pct,
+ rank() over (order by disk_reads desc) ranking
+ from
+ (
+ select
+ address,
+ disk_reads,
+ executions,
+ 100 * ratio_to_report(disk_reads) over () pct
+ from
+ sys.v_\$sql
+ where
+ command_type != 47 and module != 'T.O.A.D.'
+ )
+ where
+ disk_reads > 50 * executions
+ ) s,
+ sys.v_\$sqltext p
+where
+ s.ranking <= $numsql and
+ p.address = s.address
+order by
+ 1 desc, s.address, p.piece
+";
+ global $ADODB_CACHE_MODE,$HTTP_GET_VARS;
+ if (isset($HTTP_GET_VARS['expeixora']) && isset($HTTP_GET_VARS['sql'])) {
+ $partial = empty($HTTP_GET_VARS['part']);
+ echo "".$this->Explain($HTTP_GET_VARS['sql'],$partial)."\n";
+ }
+
+ if (isset($HTTP_GET_VARS['sql'])) {
+ $var =& $this->_ExpensiveSQL();
+ return $var;
+ }
+ $save = $ADODB_CACHE_MODE;
+ $ADODB_CACHE_MODE = ADODB_FETCH_NUM;
+ $savelog = $this->conn->LogSQL(false);
+ $rs =& $this->conn->Execute($sql);
+ $this->conn->LogSQL($savelog);
+ $ADODB_CACHE_MODE = $save;
+ if ($rs) {
+ $s = "\n ';
+ $s .= $this->_ExpensiveSQL();
+ return $s;
+ }
+
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/perf/perf-postgres.inc.php b/lib/adodb/perf/perf-postgres.inc.php
index 2d5912ce5a..c3d4be5dc6 100644
--- a/lib/adodb/perf/perf-postgres.inc.php
+++ b/lib/adodb/perf/perf-postgres.inc.php
@@ -1,120 +1,123 @@
- array('RATIO',
- "select case when count(*)=3 then 'TRUE' else 'FALSE' end from pg_settings where (name='stats_block_level' or name='stats_row_level' or name='stats_start_collector') and setting='on' ",
- 'Value must be TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level and stats_block_level must be set to true in postgresql.conf)'),
- 'data cache hit ratio' => array('RATIO',
- "select case when blks_hit=0 then 0 else (1-blks_read::float/blks_hit)*100 end from pg_stat_database where datname='\$DATABASE'",
- '=WarnCacheRatio'),
- 'IO',
- 'data reads' => array('IO',
- 'select sum(heap_blks_read+toast_blks_read) from pg_statio_user_tables',
- ),
- 'data writes' => array('IO',
- 'select sum(n_tup_ins/4.0+n_tup_upd/8.0+n_tup_del/4.0)/16 from pg_stat_user_tables',
- 'Count of inserts/updates/deletes * coef'),
-
- 'Data Cache',
- 'data cache buffers' => array('DATAC',
- "select setting from pg_settings where name='shared_buffers'",
- 'Number of cache buffers. Tuning'),
- 'cache blocksize' => array('DATAC',
- 'select 8192',
- '(estimate)' ),
- 'data cache size' => array( 'DATAC',
- "select setting::integer*8192 from pg_settings where name='shared_buffers'",
- '' ),
- 'operating system cache size' => array( 'DATA',
- "select setting::integer*8192 from pg_settings where name='effective_cache_size'",
- '(effective cache size)' ),
- 'Memory Usage',
- 'sort buffer size' => array('CACHE',
- "select setting::integer*1024 from pg_settings where name='sort_mem'",
- 'Size of sort buffer (per query)' ),
- 'Connections',
- 'current connections' => array('SESS',
- 'select count(*) from pg_stat_activity',
- ''),
- 'max connections' => array('SESS',
- "select setting from pg_settings where name='max_connections'",
- ''),
- 'Parameters',
- 'rollback buffers' => array('COST',
- "select setting from pg_settings where name='wal_buffers'",
- 'WAL buffers'),
- 'random page cost' => array('COST',
- "select setting from pg_settings where name='random_page_cost'",
- 'Cost of doing a seek (default=4). See random_page_cost'),
- false
- );
-
- function perf_postgres(&$conn)
- {
- $this->conn =& $conn;
- }
-
- function Explain($sql,$partial=false)
- {
- $save = $this->conn->LogSQL(false);
-
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
- if ($arr) {
- foreach($arr as $row) {
- $sql = reset($row);
- if (crc32($sql) == $partial) break;
- }
- }
- }
- $sql = str_replace('?',"''",$sql);
- $s = ' Explain: '.htmlspecialchars($sql).' Explain: '.htmlspecialchars($sql).' ";
- return;
- }
- $arr = $rs->GetArray();
- //$db->debug = true;
- global $ADODB_COUNTRECS;
- $ADODB_COUNTRECS = false;
- $start = microtime();
- for ($i=0; $i < $max; $i++) {
- $rs =& $db->Execute($sql);
- $arr =& $rs->GetArray();
- // print $arr[0][1];
- }
- $end = microtime();
- $start = explode(' ',$start);
- $end = explode(' ',$end);
-
- //print_r($start);
- //print_r($end);
-
- // print_r($arr);
- $total = $end[0]+trim($end[1]) - $start[0]-trim($start[1]);
- printf (" seconds = %8.2f for %d iterations each with %d records ";
+ return;
+ }
+ $arr = $rs->GetArray();
+ //$db->debug = true;
+ global $ADODB_COUNTRECS;
+ $ADODB_COUNTRECS = false;
+ $start = microtime();
+ for ($i=0; $i < $max; $i++) {
+ $rs =& $db->Execute($sql);
+ $arr =& $rs->GetArray();
+ // print $arr[0][1];
+ }
+ $end = microtime();
+ $start = explode(' ',$start);
+ $end = explode(' ',$end);
+
+ //print_r($start);
+ //print_r($end);
+
+ // print_r($arr);
+ $total = $end[0]+trim($end[1]) - $start[0]-trim($start[1]);
+ printf (" seconds = %8.2f for %d iterations each with %d records ";
- print " ";
+ print " ";
- $db = NewADOConnection($dbType);
- $dict = NewDataDictionary($db);
-
- if (!$dict) continue;
- $dict->debug = 1;
-
- $opts = array('REPLACE','mysql' => 'TYPE=ISAM', 'oci8' => 'TABLESPACE USERS');
-
-/* $flds = array(
- array('id', 'I',
- 'AUTO','KEY'),
-
- array('name' => 'firstname', 'type' => 'varchar','size' => 30,
- 'DEFAULT'=>'Joan'),
-
- array('lastname','varchar',28,
- 'DEFAULT'=>'Chen','key'),
-
- array('averylonglongfieldname','X',1024,
- 'NOTNULL','default' => 'test'),
-
- array('price','N','7.2',
- 'NOTNULL','default' => '0.00'),
-
- array('MYDATE', 'D',
- 'DEFDATE'),
- array('TS','T',
- 'DEFTIMESTAMP')
- );*/
-
- $flds = "
-ID I AUTO KEY,
-FIRSTNAME VARCHAR(30) DEFAULT 'Joan',
-LASTNAME VARCHAR(28) DEFAULT 'Chen' key,
-averylonglongfieldname X(1024) DEFAULT 'test',
-price N(7.2) DEFAULT '0.00',
-MYDATE D DEFDATE,
-BIGFELLOW X NOTNULL,
-TS T DEFTIMESTAMP";
-
-
- $sqla = $dict->CreateDatabase('KUTU',array('postgres'=>"LOCATION='/u01/postdata'"));
- $dict->SetSchema('KUTU');
-
- $sqli = ($dict->CreateTableSQL('testtable',$flds, $opts));
- $sqla =& array_merge($sqla,$sqli);
-
- $sqli = $dict->CreateIndexSQL('idx','testtable','firstname,lastname',array('BITMAP','FULLTEXT','CLUSTERED','HASH'));
- $sqla =& array_merge($sqla,$sqli);
- $sqli = $dict->CreateIndexSQL('idx2','testtable','price,lastname');//,array('BITMAP','FULLTEXT','CLUSTERED'));
- $sqla =& array_merge($sqla,$sqli);
-
- $addflds = array(array('height', 'F'),array('weight','F'));
- $sqli = $dict->AddColumnSQL('testtable',$addflds);
- $sqla =& array_merge($sqla,$sqli);
- $addflds = array(array('height', 'F','NOTNULL'),array('weight','F','NOTNULL'));
- $sqli = $dict->AlterColumnSQL('testtable',$addflds);
- $sqla =& array_merge($sqla,$sqli);
-
-
- printsqla($dbType,$sqla);
-
- if (file_exists('d:\inetpub\wwwroot\php\phplens\adodb\adodb.inc.php'))
- if ($dbType == 'mysql') {
- $db->Connect('localhost', "root", "", "test");
- $dict->SetSchema('');
- $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds);
- if ($sqla2) printsqla($dbType,$sqla2);
- }
- if ($dbType == 'postgres') {
- $db->Connect('localhost', "tester", "test", "test");
- $dict->SetSchema('');
- $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds);
- if ($sqla2) printsqla($dbType,$sqla2);
- }
-
-}
-
-function printsqla($dbType,$sqla)
-{
- print " ";
+ $db = NewADOConnection($dbType);
+ $dict = NewDataDictionary($db);
+
+ if (!$dict) continue;
+ $dict->debug = 1;
+
+ $opts = array('REPLACE','mysql' => 'TYPE=INNODB', 'oci8' => 'TABLESPACE USERS');
+
+/* $flds = array(
+ array('id', 'I',
+ 'AUTO','KEY'),
+
+ array('name' => 'firstname', 'type' => 'varchar','size' => 30,
+ 'DEFAULT'=>'Joan'),
+
+ array('lastname','varchar',28,
+ 'DEFAULT'=>'Chen','key'),
+
+ array('averylonglongfieldname','X',1024,
+ 'NOTNULL','default' => 'test'),
+
+ array('price','N','7.2',
+ 'NOTNULL','default' => '0.00'),
+
+ array('MYDATE', 'D',
+ 'DEFDATE'),
+ array('TS','T',
+ 'DEFTIMESTAMP')
+ );*/
+
+ $flds = "
+ID I AUTO KEY,
+FIRSTNAME VARCHAR(30) DEFAULT 'Joan',
+LASTNAME VARCHAR(28) DEFAULT 'Chen' key,
+averylonglongfieldname X(1024) DEFAULT 'test',
+price N(7.2) DEFAULT '0.00',
+MYDATE D DEFDATE,
+BIGFELLOW X NOTNULL,
+TS T DEFTIMESTAMP";
+
+
+ $sqla = $dict->CreateDatabase('KUTU',array('postgres'=>"LOCATION='/u01/postdata'"));
+ $dict->SetSchema('KUTU');
+
+ $sqli = ($dict->CreateTableSQL('testtable',$flds, $opts));
+ $sqla =& array_merge($sqla,$sqli);
+
+ $sqli = $dict->CreateIndexSQL('idx','testtable','firstname,lastname',array('BITMAP','FULLTEXT','CLUSTERED','HASH'));
+ $sqla =& array_merge($sqla,$sqli);
+ $sqli = $dict->CreateIndexSQL('idx2','testtable','price,lastname');//,array('BITMAP','FULLTEXT','CLUSTERED'));
+ $sqla =& array_merge($sqla,$sqli);
+
+ $addflds = array(array('height', 'F'),array('weight','F'));
+ $sqli = $dict->AddColumnSQL('testtable',$addflds);
+ $sqla =& array_merge($sqla,$sqli);
+ $addflds = array(array('height', 'F','NOTNULL'),array('weight','F','NOTNULL'));
+ $sqli = $dict->AlterColumnSQL('testtable',$addflds);
+ $sqla =& array_merge($sqla,$sqli);
+
+
+ printsqla($dbType,$sqla);
+
+ if (file_exists('d:\inetpub\wwwroot\php\phplens\adodb\adodb.inc.php'))
+ if ($dbType == 'mysql') {
+ $db->Connect('localhost', "root", "", "test");
+ $dict->SetSchema('');
+ $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds);
+ if ($sqla2) printsqla($dbType,$sqla2);
+ }
+ if ($dbType == 'postgres') {
+ $db->Connect('localhost', "tester", "test", "test");
+ $dict->SetSchema('');
+ $sqla2 = $dict->ChangeTableSQL('adoxyz',$flds);
+ if ($sqla2) printsqla($dbType,$sqla2);
+ }
+
+}
+
+function printsqla($dbType,$sqla)
+{
+ print " White space detected in adodb-$conn.inc.php or include file...|<
';
- var $prev = '<<
';
- var $next = '>>
';
- var $last = '>|
';
- var $moreLinks = '...';
- var $startLinks = '...';
- var $gridHeader = false;
- var $htmlSpecialChars = true;
- var $page = 'Page';
- var $linkSelectedColor = 'red';
- var $cache = 0; #secs to cache with CachePageExecute()
-
- //----------------------------------------------
- // constructor
- //
- // $db adodb connection object
- // $sql sql statement
- // $id optional id to identify which pager,
- // if you have multiple on 1 page.
- // $id should be only be [a-z0-9]*
- //
- function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false)
- {
- global $HTTP_SERVER_VARS,$PHP_SELF,$HTTP_SESSION_VARS,$HTTP_GET_VARS;
-
- $curr_page = $id.'_curr_page';
- if (empty($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
-
- $this->sql = $sql;
- $this->id = $id;
- $this->db = $db;
- $this->showPageLinks = $showPageLinks;
-
- $next_page = $id.'_next_page';
-
- if (isset($HTTP_GET_VARS[$next_page])) {
- $HTTP_SESSION_VARS[$curr_page] = $HTTP_GET_VARS[$next_page];
- }
- if (empty($HTTP_SESSION_VARS[$curr_page])) $HTTP_SESSION_VARS[$curr_page] = 1; ## at first page
-
- $this->curr_page = $HTTP_SESSION_VARS[$curr_page];
-
- }
-
- //---------------------------
- // Display link to first page
- function Render_First($anchor=true)
- {
- global $PHP_SELF;
- if ($anchor) {
- ?>
- first;?>
- first ";
- }
- }
-
- //--------------------------
- // Display link to next page
- function render_next($anchor=true)
- {
- global $PHP_SELF;
-
- if ($anchor) {
- ?>
- next;?>
- next ";
- }
- }
-
- //------------------
- // Link to last page
- //
- // for better performance with large recordsets, you can set
- // $this->db->pageExecuteCountRows = false, which disables
- // last page counting.
- function render_last($anchor=true)
- {
- global $PHP_SELF;
-
- if (!$this->db->pageExecuteCountRows) return;
-
- if ($anchor) {
- ?>
- last;?>
- last ";
- }
- }
-
- //---------------------------------------------------
- // original code by "Pablo Costa" Query failed: $this->sql
";
- return;
- }
-
- if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage()))
- $header = $this->RenderNav();
- else
- $header = " ";
-
- $grid = $this->RenderGrid();
- $footer = $this->RenderPageCount();
- $rs->Close();
- $this->rs = false;
-
- $this->RenderLayout($header,$grid,$footer);
- }
-
- //------------------------------------------------------
- // override this to control overall layout and formating
- function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige')
- {
- echo "
";
- }
-}
-
-
+ implemented Render_PageLinks().
+
+ Please note, this class is entirely unsupported,
+ and no free support requests except for bug reports
+ will be entertained by the author.
+
+*/
+class ADODB_Pager {
+ var $id; // unique id for pager (defaults to 'adodb')
+ var $db; // ADODB connection object
+ var $sql; // sql used
+ var $rs; // recordset generated
+ var $curr_page; // current page number before Render() called, calculated in constructor
+ var $rows; // number of rows per page
+ var $linksPerPage=10; // number of links per page in navigation bar
+ var $showPageLinks;
+
+ var $gridAttributes = 'width=100% border=1 bgcolor=white';
+
+ // Localize text strings here
+ var $first = '",
- $header,
- " ",
- $grid,
- " ",
- $footer,
- " |<
';
+ var $prev = '<<
';
+ var $next = '>>
';
+ var $last = '>|
';
+ var $moreLinks = '...';
+ var $startLinks = '...';
+ var $gridHeader = false;
+ var $htmlSpecialChars = true;
+ var $page = 'Page';
+ var $linkSelectedColor = 'red';
+ var $cache = 0; #secs to cache with CachePageExecute()
+
+ //----------------------------------------------
+ // constructor
+ //
+ // $db adodb connection object
+ // $sql sql statement
+ // $id optional id to identify which pager,
+ // if you have multiple on 1 page.
+ // $id should be only be [a-z0-9]*
+ //
+ function ADODB_Pager(&$db,$sql,$id = 'adodb', $showPageLinks = false)
+ {
+ global $HTTP_SERVER_VARS,$PHP_SELF,$HTTP_SESSION_VARS,$HTTP_GET_VARS;
+
+ $curr_page = $id.'_curr_page';
+ if (empty($PHP_SELF)) $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
+
+ $this->sql = $sql;
+ $this->id = $id;
+ $this->db = $db;
+ $this->showPageLinks = $showPageLinks;
+
+ $next_page = $id.'_next_page';
+
+ if (isset($HTTP_GET_VARS[$next_page])) {
+ $HTTP_SESSION_VARS[$curr_page] = $HTTP_GET_VARS[$next_page];
+ }
+ if (empty($HTTP_SESSION_VARS[$curr_page])) $HTTP_SESSION_VARS[$curr_page] = 1; ## at first page
+
+ $this->curr_page = $HTTP_SESSION_VARS[$curr_page];
+
+ }
+
+ //---------------------------
+ // Display link to first page
+ function Render_First($anchor=true)
+ {
+ global $PHP_SELF;
+ if ($anchor) {
+ ?>
+ first;?>
+ first ";
+ }
+ }
+
+ //--------------------------
+ // Display link to next page
+ function render_next($anchor=true)
+ {
+ global $PHP_SELF;
+
+ if ($anchor) {
+ ?>
+ next;?>
+ next ";
+ }
+ }
+
+ //------------------
+ // Link to last page
+ //
+ // for better performance with large recordsets, you can set
+ // $this->db->pageExecuteCountRows = false, which disables
+ // last page counting.
+ function render_last($anchor=true)
+ {
+ global $PHP_SELF;
+
+ if (!$this->db->pageExecuteCountRows) return;
+
+ if ($anchor) {
+ ?>
+ last;?>
+ last ";
+ }
+ }
+
+ //---------------------------------------------------
+ // original code by "Pablo Costa" Query failed: $this->sql
";
+ return;
+ }
+
+ if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage()))
+ $header = $this->RenderNav();
+ else
+ $header = " ";
+
+ $grid = $this->RenderGrid();
+ $footer = $this->RenderPageCount();
+ $rs->Close();
+ $this->rs = false;
+
+ $this->RenderLayout($header,$grid,$footer);
+ }
+
+ //------------------------------------------------------
+ // override this to control overall layout and formating
+ function RenderLayout($header,$grid,$footer,$attributes='border=1 bgcolor=beige')
+ {
+ echo "
";
+ }
+}
+
+
?>
\ No newline at end of file
diff --git a/lib/adodb/adodb-pear.inc.php b/lib/adodb/adodb-pear.inc.php
index 3894730469..69de43966a 100644
--- a/lib/adodb/adodb-pear.inc.php
+++ b/lib/adodb/adodb-pear.inc.php
@@ -1,359 +1,365 @@
- |
- * and Tomas V.V.Cox ",
+ $header,
+ " ",
+ $grid,
+ " ",
+ $footer,
+ "
'.$HTTP_SERVER_VARS['HTTP_HOST'];
- if (isset($HTTP_SERVER_VARS['PHP_SELF'])) $tracer .= $HTTP_SERVER_VARS['PHP_SELF'];
- } else
- if (isset($HTTP_SERVER_VARS['PHP_SELF'])) $tracer .= '
'.$HTTP_SERVER_VARS['PHP_SELF'];
- //$tracer .= (string) adodb_backtrace(false);
-
- $tracer = substr($tracer,0,500);
-
- if (is_array($inputarr)) {
- if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr);
- else {
- $params = '';
- $params = implode(', ',$inputarr);
- if (strlen($params) >= 3000) $params = substr($params, 0, 3000);
- }
- } else {
- $params = '';
- }
-
- if (is_array($sql)) $sql = $sql[0];
- $arr = array('b'=>trim(substr($sql,0,230)),
- 'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>round($time,6));
-
- $saved = $conn->debug;
- $conn->debug = 0;
-
- if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') {
- $isql = "insert into $perf_table values($conn->sysTimeStamp,:b,:c,:d,:e,:f)";
- } else if ($dbT == 'odbc_mssql' || $dbT == 'informix') {
- $timer = $arr['f'];
- if ($dbT == 'informix') $sql2 = substr($sql2,0,230);
-
- $sql1 = $conn->qstr($arr['b']);
- $sql2 = $conn->qstr($arr['c']);
- $params = $conn->qstr($arr['d']);
- $tracer = $conn->qstr($arr['e']);
-
- $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($conn->sysTimeStamp,$sql1,$sql2,$params,$tracer,$timer)";
- if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql);
- $arr = false;
- } else {
- $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $conn->sysTimeStamp,?,?,?,?,?)";
- }
- $ok = $conn->Execute($isql,$arr);
- $conn->debug = $saved;
-
- if ($ok) {
- $conn->_logsql = true;
- } else {
- $err2 = $conn->ErrorMsg();
- $conn->_logsql = true; // enable logsql error simulation
- $perf =& NewPerfMonitor($conn);
- if ($perf) {
- if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr);
- } else {
- $ok = $conn->Execute("create table $perf_table (
- created varchar(50),
- sql0 varchar(250),
- sql1 varchar(4000),
- params varchar(3000),
- tracer varchar(500),
- timer decimal(16,6))");
- }
- if (!$ok) {
- ADOConnection::outp( "LOGSQL Insert Failed: $isql
$err2");
- $conn->_logsql = false;
- }
- }
- $conn->_errorMsg = $errM;
- $conn->_errorCode = $errN;
- }
- $conn->fnExecute = 'adodb_log_sql';
- return $rs;
-}
-
-
-/*
-The settings data structure is an associative array that database parameter per element.
-
-Each database parameter element in the array is itself an array consisting of:
-
-0: category code, used to group related db parameters
-1: either
- a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'",
- b. array holding sql string and field to look for, e.g. array('show variables','table_cache'),
- c. a string prefixed by =, then a PHP method of the class is invoked,
- e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue',
-2: description of the database parameter
-*/
-
-class adodb_perf {
- var $conn;
- var $color = '#F0F0F0';
- var $table = '';
- var $titles = '
\n";
- $this->conn->fnExecute = $saveE;
-
- return $html;
- }
-
- function Tables($orderby='1')
- {
- if (!$this->tablesSQL) return false;
-
- $savelog = $this->conn->LogSQL(false);
- $rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby);
- $this->conn->LogSQL($savelog);
- $html = rs2html($rs,false,false,false,false);
- return $html;
- }
-
-
- function CreateLogTable()
- {
- if (!$this->createTableSQL) return false;
-
- $savelog = $this->conn->LogSQL(false);
- $ok = $this->conn->Execute($this->createTableSQL);
- $this->conn->LogSQL($savelog);
- return ($ok) ? true : false;
- }
-
- function DoSQLForm()
- {
- global $HTTP_SERVER_VARS,$HTTP_GET_VARS,$HTTP_POST_VARS,$HTTP_SESSION_VARS;
-
- $HTTP_VARS = array_merge($HTTP_GET_VARS,$HTTP_POST_VARS);
-
- $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
- $sql = isset($HTTP_VARS['sql']) ? $HTTP_VARS['sql'] : '';
-
- if (isset($HTTP_SESSION_VARS['phplens_sqlrows'])) $rows = $HTTP_SESSION_VARS['phplens_sqlrows'];
- else $rows = 3;
-
- if (isset($HTTP_VARS['SMALLER'])) {
- $rows /= 2;
- if ($rows < 3) $rows = 3;
- $HTTP_SESSION_VARS['phplens_sqlrows'] = $rows;
- }
- if (isset($HTTP_VARS['BIGGER'])) {
- $rows *= 2;
- $HTTP_SESSION_VARS['phplens_sqlrows'] = $rows;
- }
-
-?>
-
-
-
-undomq(trim($sql));
- if (substr($sql,strlen($sql)-1) === ';') {
- $print = true;
- $sqla = $this->SplitSQL($sql);
- } else {
- $print = false;
- $sqla = array($sql);
- }
- foreach($sqla as $sqls) {
-
- if (!$sqls) continue;
-
- if ($print) {
- print " ';
- var $warnRatio = 90;
- var $tablesSQL = false;
- var $cliFormat = "%32s => %s \r\n";
- var $sql1 = 'sql1'; // used for casting sql1 to text for mssql
- var $explain = true;
- var $helpurl = "LogSQL help";
- var $createTableSQL = false;
- var $maxLength = 2000;
-
- // Sets the tablename to be used
- function table($newtable = false)
- {
- static $_table;
-
- if (!empty($newtable)) $_table = $newtable;
- if (empty($_table)) $_table = 'adodb_logsql';
- return $_table;
- }
-
- // returns array with info to calculate CPU Load
- function _CPULoad()
- {
-/*
-
-cpu 524152 2662 2515228 336057010
-cpu0 264339 1408 1257951 168025827
-cpu1 259813 1254 1257277 168031181
-page 622307 25475680
-swap 24 1891
-intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320)
-ctxt 66155838
-btime 1062315585
-processes 69293
-
-*/
- // Algorithm is taken from
- // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp
- if (strncmp(PHP_OS,'WIN',3)==0) {
- @$c = new COM("WinMgmts:{impersonationLevel=impersonate}!Win32_PerfRawData_PerfOS_Processor.Name='_Total'");
- if (!$c) return false;
-
- $info[0] = $c->PercentProcessorTime;
- $info[1] = 0;
- $info[2] = 0;
- $info[3] = $c->TimeStamp_Sys100NS;
- //print_r($info);
- return $info;
- }
-
- // Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com)
- $statfile = '/proc/stat';
- if (!file_exists($statfile)) return false;
-
- $fd = fopen($statfile,"r");
- if (!$fd) return false;
-
- $statinfo = explode("\n",fgets($fd, 1024));
- fclose($fd);
- foreach($statinfo as $line) {
- $info = explode(" ",$line);
- if($info[0]=="cpu") {
- array_shift($info); // pop off "cpu"
- if(!$info[0]) array_shift($info); // pop off blank space (if any)
- return $info;
- }
- }
-
- return false;
-
- }
-
- /* NOT IMPLEMENTED */
- function MemInfo()
- {
- /*
-
- total: used: free: shared: buffers: cached:
-Mem: 1055289344 917299200 137990144 0 165437440 599773184
-Swap: 2146775040 11055104 2135719936
-MemTotal: 1030556 kB
-MemFree: 134756 kB
-MemShared: 0 kB
-Buffers: 161560 kB
-Cached: 581384 kB
-SwapCached: 4332 kB
-Active: 494468 kB
-Inact_dirty: 322856 kB
-Inact_clean: 24256 kB
-Inact_target: 168316 kB
-HighTotal: 131064 kB
-HighFree: 1024 kB
-LowTotal: 899492 kB
-LowFree: 133732 kB
-SwapTotal: 2096460 kB
-SwapFree: 2085664 kB
-Committed_AS: 348732 kB
- */
- }
-
-
- /*
- Remember that this is client load, not db server load!
- */
- var $_lastLoad;
- function CPULoad()
- {
- $info = $this->_CPULoad();
- if (!$info) return false;
-
- if (empty($this->_lastLoad)) {
- sleep(1);
- $this->_lastLoad = $info;
- $info = $this->_CPULoad();
- }
-
- $last = $this->_lastLoad;
- $this->_lastLoad = $info;
-
- $d_user = $info[0] - $last[0];
- $d_nice = $info[1] - $last[1];
- $d_system = $info[2] - $last[2];
- $d_idle = $info[3] - $last[3];
-
- //printf("Delta - User: %f Nice: %f System: %f Idle: %fParameter Value Description
",$d_user,$d_nice,$d_system,$d_idle);
-
- if (strncmp(PHP_OS,'WIN',3)==0) {
- if ($d_idle < 1) $d_idle = 1;
- return 100*(1-$d_user/$d_idle);
- }else {
- $total=$d_user+$d_nice+$d_system+$d_idle;
- if ($total<1) $total=1;
- return 100*($d_user+$d_nice+$d_system)/$total;
- }
- }
-
- function Tracer($sql)
- {
- $perf_table = adodb_perf::table();
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
-
- $sqlq = $this->conn->qstr($sql);
- $arr = $this->conn->GetArray(
-"select count(*),tracer
- from $perf_table where sql1=$sqlq
- group by tracer
- order by 1 desc");
- $s = '';
- if ($arr) {
- $s .= 'Scripts Affected
';
- foreach($arr as $k) {
- $s .= sprintf("%4d",$k[0]).' '.strip_tags($k[1]).'
';
- }
- }
- $this->conn->fnExecute = $saveE;
- return $s;
- }
-
- /*
- Explain Plan for $sql.
- If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the
- actual sql.
- */
- function Explain($sql,$partial=false)
- {
- return false;
- }
-
- function InvalidSQL($numsql = 10)
- {
- global $HTTP_GET_VARS;
-
- if (isset($HTTP_GET_VARS['sql'])) return;
- $s = 'Invalid SQL
';
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
- $perf_table = adodb_perf::table();
- $rs =& $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql);
- $this->conn->fnExecute = $saveE;
- if ($rs) {
- $s .= rs2html($rs,false,false,false,false);
- } else
- return "Suspicious SQL
-The following SQL have high average execution times
-
";
-
- }
-
- function CheckMemory()
- {
- return '';
- }
-
-
- function SuspiciousSQL($numsql=10)
- {
- return adodb_perf::_SuspiciousSQL($numsql);
- }
-
- function ExpensiveSQL($numsql=10)
- {
- return adodb_perf::_ExpensiveSQL($numsql);
- }
-
-
- /*
- This reports the percentage of load on the instance due to the most
- expensive few SQL statements. Tuning these statements can often
- make huge improvements in overall system performance.
- */
- function _ExpensiveSQL($numsql = 10)
- {
- global $HTTP_GET_VARS,$ADODB_FETCH_MODE;
-
- $perf_table = adodb_perf::table();
- $saveE = $this->conn->fnExecute;
- $this->conn->fnExecute = false;
-
- if (isset($HTTP_GET_VARS['expe']) && isset($HTTP_GET_VARS['sql'])) {
- $partial = !empty($HTTP_GET_VARS['part']);
- echo "".$this->Explain($HTTP_GET_VARS['sql'],$partial)."\n";
- }
-
- if (isset($HTTP_GET_VARS['sql'])) return;
-
- $sql1 = $this->sql1;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $rs =& $this->conn->SelectLimit(
- "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
- from $perf_table
- where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
- and (tracer is null or tracer not like 'ERROR:%')
- group by sql1
- order by 1 desc",$numsql);
-
- $this->conn->fnExecute = $saveE;
- $ADODB_FETCH_MODE = $save;
- if (!$rs) return " \n";
- $max = $this->maxLength;
- while (!$rs->EOF) {
- $sql = $rs->fields[1];
- $raw = urlencode($sql);
- if (strlen($raw)>$max-100) {
- $sql2 = substr($sql,0,$max-500);
- $raw = urlencode($sql2).'&part='.crc32($sql);
- }
- $prefix = "";
- $suffix = "";
- if ($this->explain == false || strlen($prefix)>$max) {
- $suffix = ' ... String too long for GET parameter: '.strlen($prefix).'';
- $prefix = '';
- }
- $s .= "Avg Time Count SQL Max Min ";
- $rs->MoveNext();
- }
- return $s."".round($rs->fields[0],6)." ".$rs->fields[2]." ".$prefix.htmlspecialchars($sql).$suffix."".
- " ".$rs->fields[3]." ".$rs->fields[4]." Expensive SQL
-Tuning the following SQL will reduce the server load substantially
-
";
- }
-
- /*
- Raw function to return parameter value from $settings.
- */
- function DBParameter($param)
- {
- if (empty($this->settings[$param])) return false;
- $sql = $this->settings[$param][1];
- return $this->_DBParameter($sql);
- }
-
- /*
- Raw function returning array of poll paramters
- */
- function &PollParameters()
- {
- $arr[0] = (float)$this->DBParameter('data cache hit ratio');
- $arr[1] = (float)$this->DBParameter('data reads');
- $arr[2] = (float)$this->DBParameter('data writes');
- $arr[3] = (integer) $this->DBParameter('current connections');
- return $arr;
- }
-
- /*
- Low-level Get Database Parameter
- */
- function _DBParameter($sql)
- {
- $savelog = $this->conn->LogSQL(false);
- if (is_array($sql)) {
- global $ADODB_FETCH_MODE;
-
- $sql1 = $sql[0];
- $key = $sql[1];
- if (sizeof($sql)>2) $pos = $sql[2];
- else $pos = 1;
- if (sizeof($sql)>3) $coef = $sql[3];
- else $coef = false;
- $ret = false;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $rs = $this->conn->Execute($sql1);
- $ADODB_FETCH_MODE = $save;
- if ($rs) {
- while (!$rs->EOF) {
- $keyf = reset($rs->fields);
- if (trim($keyf) == $key) {
- $ret = $rs->fields[$pos];
- if ($coef) $ret *= $coef;
- break;
- }
- $rs->MoveNext();
- }
- $rs->Close();
- }
- $this->conn->LogSQL($savelog);
- return $ret;
- } else {
- if (strncmp($sql,'=',1) == 0) {
- $fn = substr($sql,1);
- return $this->$fn();
- }
- $sql = str_replace('$DATABASE',$this->conn->database,$sql);
- $ret = $this->conn->GetOne($sql);
- $this->conn->LogSQL($savelog);
-
- return $ret;
- }
- }
-
- /*
- Warn if cache ratio falls below threshold. Displayed in "Description" column.
- */
- function WarnCacheRatio($val)
- {
- if ($val < $this->warnRatio)
- return 'Cache ratio should be at least '.$this->warnRatio.'%';
- else return '';
- }
-
- /***********************************************************************************************/
- // HIGH LEVEL UI FUNCTIONS
- /***********************************************************************************************/
-
-
- function UI($pollsecs=5)
- {
- global $HTTP_GET_VARS,$HTTP_SERVER_VARS,$HTTP_POST_VARS;
-
- $perf_table = adodb_perf::table();
- $conn = $this->conn;
-
- $app = $conn->host;
- if ($conn->host && $conn->database) $app .= ', db=';
- $app .= $conn->database;
-
- if ($app) $app .= ', ';
- $savelog = $this->conn->LogSQL(false);
- $info = $conn->ServerInfo();
- if (isset($HTTP_GET_VARS['clearsql'])) {
- $this->conn->Execute("delete from $perf_table");
- }
- $this->conn->LogSQL($savelog);
-
- // magic quotes
-
- if (isset($HTTP_GET_VARS['sql']) && get_magic_quotes_gpc()) {
- $_GET['sql'] = $HTTP_GET_VARS['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$HTTP_GET_VARS['sql']);
- }
-
- if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10;
- else $nsql = $_SESSION['ADODB_PERF_SQL'];
-
- $app .= ''.$info['description'].'';
-
-
- if (isset($HTTP_GET_VARS['do'])) $do = $HTTP_GET_VARS['do'];
- else if (isset($HTTP_POST_VARS['do'])) $do = $HTTP_POST_VARS['do'];
- else if (isset($HTTP_GET_VARS['sql'])) $do = 'viewsql';
- else $do = 'stats';
-
- if (isset($HTTP_GET_VARS['nsql'])) {
- if ($HTTP_GET_VARS['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $HTTP_GET_VARS['nsql'];
- }
- echo " \n";
- $max = $this->maxLength;
- while (!$rs->EOF) {
- $sql = $rs->fields[1];
- $raw = urlencode($sql);
- if (strlen($raw)>$max-100) {
- $sql2 = substr($sql,0,$max-500);
- $raw = urlencode($sql2).'&part='.crc32($sql);
- }
- $prefix = "";
- $suffix = "";
- if($this->explain == false || strlen($prefix>$max)) {
- $prefix = '';
- $suffix = '';
- }
- $s .= "Load Count SQL Max Min ";
- $rs->MoveNext();
- }
- return $s."".round($rs->fields[0],6)." ".$rs->fields[2]." ".$prefix.htmlspecialchars($sql).$suffix."".
- " ".$rs->fields[3]." ".$rs->fields[4]." ";
- else $form = " ";
-
- $allowsql = !defined('ADODB_PERF_NO_RUN_SQL');
-
- if (empty($HTTP_GET_VARS['hidem']))
- echo "
";
-
-
- switch ($do) {
- default:
- case 'stats':
- echo $this->HealthCheck();
- $this->conn->debug=1;
- echo $this->CheckMemory();
- break;
- case 'poll':
- echo "";
- break;
- case 'poll2':
- echo "
- ADOdb Performance Monitor for $app
- Performance Stats View SQL
- View Tables Poll Stats",
- $allowsql ? ' Run SQL' : '',
- "$form",
- " ";
- $this->Poll($pollsecs);
- break;
-
- case 'dosql':
- if (!$allowsql) break;
-
- $this->DoSQLForm();
- break;
- case 'viewsql':
- if (empty($HTTP_GET_VARS['hidem']))
- echo " Clear SQL Log
";
- echo($this->SuspiciousSQL($nsql));
- echo($this->ExpensiveSQL($nsql));
- echo($this->InvalidSQL($nsql));
- break;
- case 'tables':
- echo $this->Tables(); break;
- }
- global $ADODB_vers;
- echo " '.$this->titles;
-
- $oldc = false;
- $bgc = '';
- foreach($this->settings as $name => $arr) {
- if ($arr === false) break;
-
- if (!is_string($name)) {
- if ($cli) $html .= " -- $arr -- \n";
- else $html .= "'.$this->conn->databaseType.'
color> ";
- continue;
- }
-
- if (!is_array($arr)) break;
- $category = $arr[0];
- $how = $arr[1];
- if (sizeof($arr)>2) $desc = $arr[2];
- else $desc = ' ';
-
-
- if ($category == 'HIDE') continue;
-
- $val = $this->_DBParameter($how);
-
- if ($desc && strncmp($desc,"=",1) === 0) {
- $fn = substr($desc,1);
- $desc = $this->$fn($val);
- }
-
- if ($val === false) {
- $m = $this->conn->ErrorMsg();
- $val = "Error: $m";
- } else {
- if (is_numeric($val) && $val >= 256*1024) {
- if ($val % (1024*1024) == 0) {
- $val /= (1024*1024);
- $val .= 'M';
- } else if ($val % 1024 == 0) {
- $val /= 1024;
- $val .= 'K';
- }
- //$val = htmlspecialchars($val);
- }
- }
- if ($category != $oldc) {
- $oldc = $category;
- //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color;
- }
- if (strlen($desc)==0) $desc = ' ';
- if (strlen($val)==0) $val = ' ';
- if ($cli) {
- $html .= str_replace(' ','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc)));
-
- }else {
- $html .= "$arr \n";
- }
- }
-
- if (!$cli) $html .= "".$name.' '.$val.' '.$desc."
";
- rs2html($rs);
- }
- } else {
- $e1 = (integer) $this->conn->ErrorNo();
- $e2 = $this->conn->ErrorMsg();
- if (($e1) || ($e2)) {
- if (empty($e1)) $e1 = '-1'; // postgresql fix
- print ' '.$e1.': '.$e2;
- } else {
- print "
'.$HTTP_SERVER_VARS['HTTP_HOST'];
+ if (isset($HTTP_SERVER_VARS['PHP_SELF'])) $tracer .= $HTTP_SERVER_VARS['PHP_SELF'];
+ } else
+ if (isset($HTTP_SERVER_VARS['PHP_SELF'])) $tracer .= '
'.$HTTP_SERVER_VARS['PHP_SELF'];
+ //$tracer .= (string) adodb_backtrace(false);
+
+ $tracer = substr($tracer,0,500);
+
+ if (is_array($inputarr)) {
+ if (is_array(reset($inputarr))) $params = 'Array sizeof='.sizeof($inputarr);
+ else {
+ $params = '';
+ $params = implode(', ',$inputarr);
+ if (strlen($params) >= 3000) $params = substr($params, 0, 3000);
+ }
+ } else {
+ $params = '';
+ }
+
+ if (is_array($sql)) $sql = $sql[0];
+ $arr = array('b'=>trim(substr($sql,0,230)),
+ 'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6));
+ //var_dump($arr);
+ $saved = $conn->debug;
+ $conn->debug = 0;
+
+ if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') {
+ $isql = "insert into $perf_table values($conn->sysTimeStamp,:b,:c,:d,:e,:f)";
+ } else if ($dbT == 'odbc_mssql' || $dbT == 'informix') {
+ $timer = $arr['f'];
+ if ($dbT == 'informix') $sql2 = substr($sql2,0,230);
+
+ $sql1 = $conn->qstr($arr['b']);
+ $sql2 = $conn->qstr($arr['c']);
+ $params = $conn->qstr($arr['d']);
+ $tracer = $conn->qstr($arr['e']);
+
+ $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values($conn->sysTimeStamp,$sql1,$sql2,$params,$tracer,$timer)";
+ if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql);
+ $arr = false;
+ } else {
+ $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $conn->sysTimeStamp,?,?,?,?,?)";
+ }
+ $ok = $conn->Execute($isql,$arr);
+ $conn->debug = $saved;
+
+ if ($ok) {
+ $conn->_logsql = true;
+ } else {
+ $err2 = $conn->ErrorMsg();
+ $conn->_logsql = true; // enable logsql error simulation
+ $perf =& NewPerfMonitor($conn);
+ if ($perf) {
+ if ($perf->CreateLogTable()) $ok = $conn->Execute($isql,$arr);
+ } else {
+ $ok = $conn->Execute("create table $perf_table (
+ created varchar(50),
+ sql0 varchar(250),
+ sql1 varchar(4000),
+ params varchar(3000),
+ tracer varchar(500),
+ timer decimal(16,6))");
+ }
+ if (!$ok) {
+ ADOConnection::outp( "LOGSQL Insert Failed: $isql
$err2");
+ $conn->_logsql = false;
+ }
+ }
+ $conn->_errorMsg = $errM;
+ $conn->_errorCode = $errN;
+ }
+ $conn->fnExecute = 'adodb_log_sql';
+ return $rs;
+}
+
+
+/*
+The settings data structure is an associative array that database parameter per element.
+
+Each database parameter element in the array is itself an array consisting of:
+
+0: category code, used to group related db parameters
+1: either
+ a. sql string to retrieve value, eg. "select value from v\$parameter where name='db_block_size'",
+ b. array holding sql string and field to look for, e.g. array('show variables','table_cache'),
+ c. a string prefixed by =, then a PHP method of the class is invoked,
+ e.g. to invoke $this->GetIndexValue(), set this array element to '=GetIndexValue',
+2: description of the database parameter
+*/
+
+class adodb_perf {
+ var $conn;
+ var $color = '#F0F0F0';
+ var $table = '';
+ var $titles = '
\n";
+ $this->conn->fnExecute = $saveE;
+
+ return $html;
+ }
+
+ function Tables($orderby='1')
+ {
+ if (!$this->tablesSQL) return false;
+
+ $savelog = $this->conn->LogSQL(false);
+ $rs = $this->conn->Execute($this->tablesSQL.' order by '.$orderby);
+ $this->conn->LogSQL($savelog);
+ $html = rs2html($rs,false,false,false,false);
+ return $html;
+ }
+
+
+ function CreateLogTable()
+ {
+ if (!$this->createTableSQL) return false;
+
+ $savelog = $this->conn->LogSQL(false);
+ $ok = $this->conn->Execute($this->createTableSQL);
+ $this->conn->LogSQL($savelog);
+ return ($ok) ? true : false;
+ }
+
+ function DoSQLForm()
+ {
+ global $HTTP_SERVER_VARS,$HTTP_GET_VARS,$HTTP_POST_VARS,$HTTP_SESSION_VARS;
+
+ $HTTP_VARS = array_merge($HTTP_GET_VARS,$HTTP_POST_VARS);
+
+ $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF'];
+ $sql = isset($HTTP_VARS['sql']) ? $HTTP_VARS['sql'] : '';
+
+ if (isset($HTTP_SESSION_VARS['phplens_sqlrows'])) $rows = $HTTP_SESSION_VARS['phplens_sqlrows'];
+ else $rows = 3;
+
+ if (isset($HTTP_VARS['SMALLER'])) {
+ $rows /= 2;
+ if ($rows < 3) $rows = 3;
+ $HTTP_SESSION_VARS['phplens_sqlrows'] = $rows;
+ }
+ if (isset($HTTP_VARS['BIGGER'])) {
+ $rows *= 2;
+ $HTTP_SESSION_VARS['phplens_sqlrows'] = $rows;
+ }
+
+?>
+
+
+
+undomq(trim($sql));
+ if (substr($sql,strlen($sql)-1) === ';') {
+ $print = true;
+ $sqla = $this->SplitSQL($sql);
+ } else {
+ $print = false;
+ $sqla = array($sql);
+ }
+ foreach($sqla as $sqls) {
+
+ if (!$sqls) continue;
+
+ if ($print) {
+ print " ';
+ var $warnRatio = 90;
+ var $tablesSQL = false;
+ var $cliFormat = "%32s => %s \r\n";
+ var $sql1 = 'sql1'; // used for casting sql1 to text for mssql
+ var $explain = true;
+ var $helpurl = "LogSQL help";
+ var $createTableSQL = false;
+ var $maxLength = 2000;
+
+ // Sets the tablename to be used
+ function table($newtable = false)
+ {
+ static $_table;
+
+ if (!empty($newtable)) $_table = $newtable;
+ if (empty($_table)) $_table = 'adodb_logsql';
+ return $_table;
+ }
+
+ // returns array with info to calculate CPU Load
+ function _CPULoad()
+ {
+/*
+
+cpu 524152 2662 2515228 336057010
+cpu0 264339 1408 1257951 168025827
+cpu1 259813 1254 1257277 168031181
+page 622307 25475680
+swap 24 1891
+intr 890153570 868093576 6 0 4 4 0 6 1 2 0 0 0 124 0 8098760 2 13961053 0 0 0 0 0 0 0 0 0 0 0 0 0 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+disk_io: (3,0):(3144904,54369,610378,3090535,50936192) (3,1):(3630212,54097,633016,3576115,50951320)
+ctxt 66155838
+btime 1062315585
+processes 69293
+
+*/
+ // Algorithm is taken from
+ // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/example__obtaining_raw_performance_data.asp
+ if (strncmp(PHP_OS,'WIN',3)==0) {
+ @$c = new COM("WinMgmts:{impersonationLevel=impersonate}!Win32_PerfRawData_PerfOS_Processor.Name='_Total'");
+ if (!$c) return false;
+
+ $info[0] = $c->PercentProcessorTime;
+ $info[1] = 0;
+ $info[2] = 0;
+ $info[3] = $c->TimeStamp_Sys100NS;
+ //print_r($info);
+ return $info;
+ }
+
+ // Algorithm - Steve Blinch (BlitzAffe Online, http://www.blitzaffe.com)
+ $statfile = '/proc/stat';
+ if (!file_exists($statfile)) return false;
+
+ $fd = fopen($statfile,"r");
+ if (!$fd) return false;
+
+ $statinfo = explode("\n",fgets($fd, 1024));
+ fclose($fd);
+ foreach($statinfo as $line) {
+ $info = explode(" ",$line);
+ if($info[0]=="cpu") {
+ array_shift($info); // pop off "cpu"
+ if(!$info[0]) array_shift($info); // pop off blank space (if any)
+ return $info;
+ }
+ }
+
+ return false;
+
+ }
+
+ /* NOT IMPLEMENTED */
+ function MemInfo()
+ {
+ /*
+
+ total: used: free: shared: buffers: cached:
+Mem: 1055289344 917299200 137990144 0 165437440 599773184
+Swap: 2146775040 11055104 2135719936
+MemTotal: 1030556 kB
+MemFree: 134756 kB
+MemShared: 0 kB
+Buffers: 161560 kB
+Cached: 581384 kB
+SwapCached: 4332 kB
+Active: 494468 kB
+Inact_dirty: 322856 kB
+Inact_clean: 24256 kB
+Inact_target: 168316 kB
+HighTotal: 131064 kB
+HighFree: 1024 kB
+LowTotal: 899492 kB
+LowFree: 133732 kB
+SwapTotal: 2096460 kB
+SwapFree: 2085664 kB
+Committed_AS: 348732 kB
+ */
+ }
+
+
+ /*
+ Remember that this is client load, not db server load!
+ */
+ var $_lastLoad;
+ function CPULoad()
+ {
+ $info = $this->_CPULoad();
+ if (!$info) return false;
+
+ if (empty($this->_lastLoad)) {
+ sleep(1);
+ $this->_lastLoad = $info;
+ $info = $this->_CPULoad();
+ }
+
+ $last = $this->_lastLoad;
+ $this->_lastLoad = $info;
+
+ $d_user = $info[0] - $last[0];
+ $d_nice = $info[1] - $last[1];
+ $d_system = $info[2] - $last[2];
+ $d_idle = $info[3] - $last[3];
+
+ //printf("Delta - User: %f Nice: %f System: %f Idle: %fParameter Value Description
",$d_user,$d_nice,$d_system,$d_idle);
+
+ if (strncmp(PHP_OS,'WIN',3)==0) {
+ if ($d_idle < 1) $d_idle = 1;
+ return 100*(1-$d_user/$d_idle);
+ }else {
+ $total=$d_user+$d_nice+$d_system+$d_idle;
+ if ($total<1) $total=1;
+ return 100*($d_user+$d_nice+$d_system)/$total;
+ }
+ }
+
+ function Tracer($sql)
+ {
+ $perf_table = adodb_perf::table();
+ $saveE = $this->conn->fnExecute;
+ $this->conn->fnExecute = false;
+
+ $sqlq = $this->conn->qstr($sql);
+ $arr = $this->conn->GetArray(
+"select count(*),tracer
+ from $perf_table where sql1=$sqlq
+ group by tracer
+ order by 1 desc");
+ $s = '';
+ if ($arr) {
+ $s .= 'Scripts Affected
';
+ foreach($arr as $k) {
+ $s .= sprintf("%4d",$k[0]).' '.strip_tags($k[1]).'
';
+ }
+ }
+ $this->conn->fnExecute = $saveE;
+ return $s;
+ }
+
+ /*
+ Explain Plan for $sql.
+ If only a snippet of the $sql is passed in, then $partial will hold the crc32 of the
+ actual sql.
+ */
+ function Explain($sql,$partial=false)
+ {
+ return false;
+ }
+
+ function InvalidSQL($numsql = 10)
+ {
+ global $HTTP_GET_VARS;
+
+ if (isset($HTTP_GET_VARS['sql'])) return;
+ $s = 'Invalid SQL
';
+ $saveE = $this->conn->fnExecute;
+ $this->conn->fnExecute = false;
+ $perf_table = adodb_perf::table();
+ $rs =& $this->conn->SelectLimit("select distinct count(*),sql1,tracer as error_msg from $perf_table where tracer like 'ERROR:%' group by sql1,tracer order by 1 desc",$numsql);//,$numsql);
+ $this->conn->fnExecute = $saveE;
+ if ($rs) {
+ $s .= rs2html($rs,false,false,false,false);
+ } else
+ return "Suspicious SQL
+The following SQL have high average execution times
+
";
+
+ }
+
+ function CheckMemory()
+ {
+ return '';
+ }
+
+
+ function SuspiciousSQL($numsql=10)
+ {
+ return adodb_perf::_SuspiciousSQL($numsql);
+ }
+
+ function ExpensiveSQL($numsql=10)
+ {
+ return adodb_perf::_ExpensiveSQL($numsql);
+ }
+
+
+ /*
+ This reports the percentage of load on the instance due to the most
+ expensive few SQL statements. Tuning these statements can often
+ make huge improvements in overall system performance.
+ */
+ function _ExpensiveSQL($numsql = 10)
+ {
+ global $HTTP_GET_VARS,$ADODB_FETCH_MODE;
+
+ $perf_table = adodb_perf::table();
+ $saveE = $this->conn->fnExecute;
+ $this->conn->fnExecute = false;
+
+ if (isset($HTTP_GET_VARS['expe']) && isset($HTTP_GET_VARS['sql'])) {
+ $partial = !empty($HTTP_GET_VARS['part']);
+ echo "".$this->Explain($HTTP_GET_VARS['sql'],$partial)."\n";
+ }
+
+ if (isset($HTTP_GET_VARS['sql'])) return;
+
+ $sql1 = $this->sql1;
+ $save = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ $rs =& $this->conn->SelectLimit(
+ "select sum(timer) as total,$sql1,count(*),max(timer) as max_timer,min(timer) as min_timer
+ from $perf_table
+ where {$this->conn->upperCase}({$this->conn->substr}(sql0,1,5)) not in ('DROP ','INSER','COMMI','CREAT')
+ and (tracer is null or tracer not like 'ERROR:%')
+ group by sql1
+ order by 1 desc",$numsql);
+
+ $this->conn->fnExecute = $saveE;
+ $ADODB_FETCH_MODE = $save;
+ if (!$rs) return " \n";
+ $max = $this->maxLength;
+ while (!$rs->EOF) {
+ $sql = $rs->fields[1];
+ $raw = urlencode($sql);
+ if (strlen($raw)>$max-100) {
+ $sql2 = substr($sql,0,$max-500);
+ $raw = urlencode($sql2).'&part='.crc32($sql);
+ }
+ $prefix = "";
+ $suffix = "";
+ if ($this->explain == false || strlen($prefix)>$max) {
+ $suffix = ' ... String too long for GET parameter: '.strlen($prefix).'';
+ $prefix = '';
+ }
+ $s .= "Avg Time Count SQL Max Min ";
+ $rs->MoveNext();
+ }
+ return $s."".adodb_round($rs->fields[0],6)." ".$rs->fields[2]." ".$prefix.htmlspecialchars($sql).$suffix."".
+ " ".$rs->fields[3]." ".$rs->fields[4]." Expensive SQL
+Tuning the following SQL will reduce the server load substantially
+
";
+ }
+
+ /*
+ Raw function to return parameter value from $settings.
+ */
+ function DBParameter($param)
+ {
+ if (empty($this->settings[$param])) return false;
+ $sql = $this->settings[$param][1];
+ return $this->_DBParameter($sql);
+ }
+
+ /*
+ Raw function returning array of poll paramters
+ */
+ function &PollParameters()
+ {
+ $arr[0] = (float)$this->DBParameter('data cache hit ratio');
+ $arr[1] = (float)$this->DBParameter('data reads');
+ $arr[2] = (float)$this->DBParameter('data writes');
+ $arr[3] = (integer) $this->DBParameter('current connections');
+ return $arr;
+ }
+
+ /*
+ Low-level Get Database Parameter
+ */
+ function _DBParameter($sql)
+ {
+ $savelog = $this->conn->LogSQL(false);
+ if (is_array($sql)) {
+ global $ADODB_FETCH_MODE;
+
+ $sql1 = $sql[0];
+ $key = $sql[1];
+ if (sizeof($sql)>2) $pos = $sql[2];
+ else $pos = 1;
+ if (sizeof($sql)>3) $coef = $sql[3];
+ else $coef = false;
+ $ret = false;
+ $save = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ $rs = $this->conn->Execute($sql1);
+ $ADODB_FETCH_MODE = $save;
+ if ($rs) {
+ while (!$rs->EOF) {
+ $keyf = reset($rs->fields);
+ if (trim($keyf) == $key) {
+ $ret = $rs->fields[$pos];
+ if ($coef) $ret *= $coef;
+ break;
+ }
+ $rs->MoveNext();
+ }
+ $rs->Close();
+ }
+ $this->conn->LogSQL($savelog);
+ return $ret;
+ } else {
+ if (strncmp($sql,'=',1) == 0) {
+ $fn = substr($sql,1);
+ return $this->$fn();
+ }
+ $sql = str_replace('$DATABASE',$this->conn->database,$sql);
+ $ret = $this->conn->GetOne($sql);
+ $this->conn->LogSQL($savelog);
+
+ return $ret;
+ }
+ }
+
+ /*
+ Warn if cache ratio falls below threshold. Displayed in "Description" column.
+ */
+ function WarnCacheRatio($val)
+ {
+ if ($val < $this->warnRatio)
+ return 'Cache ratio should be at least '.$this->warnRatio.'%';
+ else return '';
+ }
+
+ /***********************************************************************************************/
+ // HIGH LEVEL UI FUNCTIONS
+ /***********************************************************************************************/
+
+
+ function UI($pollsecs=5)
+ {
+ global $HTTP_GET_VARS,$HTTP_SERVER_VARS,$HTTP_POST_VARS;
+
+ $perf_table = adodb_perf::table();
+ $conn = $this->conn;
+
+ $app = $conn->host;
+ if ($conn->host && $conn->database) $app .= ', db=';
+ $app .= $conn->database;
+
+ if ($app) $app .= ', ';
+ $savelog = $this->conn->LogSQL(false);
+ $info = $conn->ServerInfo();
+ if (isset($HTTP_GET_VARS['clearsql'])) {
+ $this->conn->Execute("delete from $perf_table");
+ }
+ $this->conn->LogSQL($savelog);
+
+ // magic quotes
+
+ if (isset($HTTP_GET_VARS['sql']) && get_magic_quotes_gpc()) {
+ $_GET['sql'] = $HTTP_GET_VARS['sql'] = str_replace(array("\\'",'\"'),array("'",'"'),$HTTP_GET_VARS['sql']);
+ }
+
+ if (!isset($_SESSION['ADODB_PERF_SQL'])) $nsql = $_SESSION['ADODB_PERF_SQL'] = 10;
+ else $nsql = $_SESSION['ADODB_PERF_SQL'];
+
+ $app .= $info['description'];
+
+
+ if (isset($HTTP_GET_VARS['do'])) $do = $HTTP_GET_VARS['do'];
+ else if (isset($HTTP_POST_VARS['do'])) $do = $HTTP_POST_VARS['do'];
+ else if (isset($HTTP_GET_VARS['sql'])) $do = 'viewsql';
+ else $do = 'stats';
+
+ if (isset($HTTP_GET_VARS['nsql'])) {
+ if ($HTTP_GET_VARS['nsql'] > 0) $nsql = $_SESSION['ADODB_PERF_SQL'] = (integer) $HTTP_GET_VARS['nsql'];
+ }
+ echo " \n";
+ $max = $this->maxLength;
+ while (!$rs->EOF) {
+ $sql = $rs->fields[1];
+ $raw = urlencode($sql);
+ if (strlen($raw)>$max-100) {
+ $sql2 = substr($sql,0,$max-500);
+ $raw = urlencode($sql2).'&part='.crc32($sql);
+ }
+ $prefix = "";
+ $suffix = "";
+ if($this->explain == false || strlen($prefix>$max)) {
+ $prefix = '';
+ $suffix = '';
+ }
+ $s .= "Load Count SQL Max Min ";
+ $rs->MoveNext();
+ }
+ return $s."".adodb_round($rs->fields[0],6)." ".$rs->fields[2]." ".$prefix.htmlspecialchars($sql).$suffix."".
+ " ".$rs->fields[3]." ".$rs->fields[4]." ";
+ else $form = " ";
+
+ $allowsql = !defined('ADODB_PERF_NO_RUN_SQL');
+
+ if (empty($HTTP_GET_VARS['hidem']))
+ echo "
";
+
+
+ switch ($do) {
+ default:
+ case 'stats':
+ echo $this->HealthCheck();
+ //$this->conn->debug=1;
+ echo $this->CheckMemory();
+ break;
+ case 'poll':
+ echo "";
+ break;
+ case 'poll2':
+ echo "
+ ADOdb Performance Monitor for $app
+ Performance Stats View SQL
+ View Tables Poll Stats",
+ $allowsql ? ' Run SQL' : '',
+ "$form",
+ " ";
+ $this->Poll($pollsecs);
+ break;
+
+ case 'dosql':
+ if (!$allowsql) break;
+
+ $this->DoSQLForm();
+ break;
+ case 'viewsql':
+ if (empty($HTTP_GET_VARS['hidem']))
+ echo " Clear SQL Log
";
+ echo($this->SuspiciousSQL($nsql));
+ echo($this->ExpensiveSQL($nsql));
+ echo($this->InvalidSQL($nsql));
+ break;
+ case 'tables':
+ echo $this->Tables(); break;
+ }
+ global $ADODB_vers;
+ echo " '.$this->titles;
+
+ $oldc = false;
+ $bgc = '';
+ foreach($this->settings as $name => $arr) {
+ if ($arr === false) break;
+
+ if (!is_string($name)) {
+ if ($cli) $html .= " -- $arr -- \n";
+ else $html .= "'.$this->conn->databaseType.'
color> ";
+ continue;
+ }
+
+ if (!is_array($arr)) break;
+ $category = $arr[0];
+ $how = $arr[1];
+ if (sizeof($arr)>2) $desc = $arr[2];
+ else $desc = ' ';
+
+
+ if ($category == 'HIDE') continue;
+
+ $val = $this->_DBParameter($how);
+
+ if ($desc && strncmp($desc,"=",1) === 0) {
+ $fn = substr($desc,1);
+ $desc = $this->$fn($val);
+ }
+
+ if ($val === false) {
+ $m = $this->conn->ErrorMsg();
+ $val = "Error: $m";
+ } else {
+ if (is_numeric($val) && $val >= 256*1024) {
+ if ($val % (1024*1024) == 0) {
+ $val /= (1024*1024);
+ $val .= 'M';
+ } else if ($val % 1024 == 0) {
+ $val /= 1024;
+ $val .= 'K';
+ }
+ //$val = htmlspecialchars($val);
+ }
+ }
+ if ($category != $oldc) {
+ $oldc = $category;
+ //$bgc = ($bgc == ' bgcolor='.$this->color) ? ' bgcolor=white' : ' bgcolor='.$this->color;
+ }
+ if (strlen($desc)==0) $desc = ' ';
+ if (strlen($val)==0) $val = ' ';
+ if ($cli) {
+ $html .= str_replace(' ','',sprintf($this->cliFormat,strip_tags($name),strip_tags($val),strip_tags($desc)));
+
+ }else {
+ $html .= "$arr \n";
+ }
+ }
+
+ if (!$cli) $html .= "".$name.' '.$val.' '.$desc."
";
+ rs2html($rs);
+ }
+ } else {
+ $e1 = (integer) $this->conn->ErrorNo();
+ $e2 = $this->conn->ErrorMsg();
+ if (($e1) || ($e2)) {
+ if (empty($e1)) $e1 = '-1'; // postgresql fix
+ print ' '.$e1.': '.$e2;
+ } else {
+ print " Testing adodb_date and adodb_mktime. version=".ADODB_DATE_VERSION. "
";
- set_time_limit(0);
+ @set_time_limit(0);
$fail = false;
// 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);
+ $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).'
';
+
+ $t = adodb_mktime(0,0,0,2,1,2102);
+ if (!(adodb_date('Y-m-d',$t) == '2102-02-01')) print 'Error in '.adodb_date('Y-m-d',$t).'
';
+
+
print "n+=E2Fzf-oKkZGl^W1}=g$ahzO38W;5voMS6m!o
zm;hr7{<;j
\n";
-
- if (isset($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) echo $msg;
- else echo strip_tags($msg);
- if (!empty($ADODB_FLUSH) && ob_get_length() !== false) flush(); // dp not flush if output buffering enabled - useless - thx to Jesse Mullan
-
- }
-
- /**
- * Connect to database
- *
- * @param [argHostname] Host to connect to
- * @param [argUsername] Userid to login
- * @param [argPassword] Associated password
- * @param [argDatabaseName] database
- * @param [forceNew] force new connection
- *
- * @return true or false
- */
- function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false)
- {
- if ($argHostname != "") $this->host = $argHostname;
- if ($argUsername != "") $this->user = $argUsername;
- if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons
- if ($argDatabaseName != "") $this->database = $argDatabaseName;
-
- $this->_isPersistentConnection = false;
- if ($fn = $this->raiseErrorFn) {
- if ($forceNew) {
- if ($this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true;
- } else {
- if ($this->_connect($this->host, $this->user, $this->password, $this->database)) return true;
- }
- $err = $this->ErrorMsg();
- if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
- $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
- } else {
- if ($forceNew) {
- if ($this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true;
- } else {
- if ($this->_connect($this->host, $this->user, $this->password, $this->database)) return true;
- }
- }
- if ($this->debug) ADOConnection::outp( $this->host.': '.$this->ErrorMsg());
- return false;
- }
-
- function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
- {
- return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName);
- }
-
-
- /**
- * Always force a new connection to database - currently only works with oracle
- *
- * @param [argHostname] Host to connect to
- * @param [argUsername] Userid to login
- * @param [argPassword] Associated password
- * @param [argDatabaseName] database
- *
- * @return true or false
- */
- function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
- {
- return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true);
- }
-
- /**
- * Establish persistent connect to database
- *
- * @param [argHostname] Host to connect to
- * @param [argUsername] Userid to login
- * @param [argPassword] Associated password
- * @param [argDatabaseName] database
- *
- * @return return true or false
- */
- function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
- {
- if (defined('ADODB_NEVER_PERSIST'))
- return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName);
-
- if ($argHostname != "") $this->host = $argHostname;
- if ($argUsername != "") $this->user = $argUsername;
- if ($argPassword != "") $this->password = $argPassword;
- if ($argDatabaseName != "") $this->database = $argDatabaseName;
-
- $this->_isPersistentConnection = true;
-
- if ($fn = $this->raiseErrorFn) {
- if ($this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true;
- $err = $this->ErrorMsg();
- if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
- $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
- } else
- if ($this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true;
-
- if ($this->debug) ADOConnection::outp( $this->host.': '.$this->ErrorMsg());
- return false;
- }
-
- // Format date column in sql string given an input format that understands Y M D
- function SQLDate($fmt, $col=false)
- {
- if (!$col) $col = $this->sysDate;
- return $col; // child class implement
- }
-
- /**
- * Should prepare the sql statement and return the stmt resource.
- * For databases that do not support this, we return the $sql. To ensure
- * compatibility with databases that do not support prepare:
- *
- * $stmt = $db->Prepare("insert into table (id, name) values (?,?)");
- * $db->Execute($stmt,array(1,'Jill')) or die('insert failed');
- * $db->Execute($stmt,array(2,'Joe')) or die('insert failed');
- *
- * @param sql SQL to send to database
- *
- * @return return FALSE, or the prepared statement, or the original sql if
- * if the database does not support prepare.
- *
- */
- function Prepare($sql)
- {
- return $sql;
- }
-
- /**
- * Some databases, eg. mssql require a different function for preparing
- * stored procedures. So we cannot use Prepare().
- *
- * Should prepare the stored procedure and return the stmt resource.
- * For databases that do not support this, we return the $sql. To ensure
- * compatibility with databases that do not support prepare:
- *
- * @param sql SQL to send to database
- *
- * @return return FALSE, or the prepared statement, or the original sql if
- * if the database does not support prepare.
- *
- */
- function PrepareSP($sql,$param=false)
- {
- return $this->Prepare($sql,$param);
- }
-
- /**
- * PEAR DB Compat
- */
- function Quote($s)
- {
- return $this->qstr($s,false);
- }
-
- /**
- Requested by "Karsten Dambekalns"
- b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.
- c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block
- are disabled, making it backward compatible.
- */
- function StartTrans($errfn = 'ADODB_TransMonitor')
- {
- if ($this->transOff > 0) {
- $this->transOff += 1;
- return;
- }
-
- $this->_oldRaiseFn = $this->raiseErrorFn;
- $this->raiseErrorFn = $errfn;
- $this->_transOK = true;
-
- if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans");
- $this->BeginTrans();
- $this->transOff = 1;
- }
-
- /**
- Used together with StartTrans() to end a transaction. Monitors connection
- for sql errors, and will commit or rollback as appropriate.
-
- @autoComplete if true, monitor sql errors and commit and rollback as appropriate,
- and if set to false force rollback even if no SQL error detected.
- @returns true on commit, false on rollback.
- */
- function CompleteTrans($autoComplete = true)
- {
- if ($this->transOff > 1) {
- $this->transOff -= 1;
- return true;
- }
- $this->raiseErrorFn = $this->_oldRaiseFn;
-
- $this->transOff = 0;
- if ($this->_transOK && $autoComplete) {
- if (!$this->CommitTrans()) {
- $this->_transOK = false;
- if ($this->debug) ADOConnection::outp("Smart Commit failed");
- } else
- if ($this->debug) ADOConnection::outp("Smart Commit occurred");
- } else {
- $this->RollbackTrans();
- if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred");
- }
-
- return $this->_transOK;
- }
-
- /*
- At the end of a StartTrans/CompleteTrans block, perform a rollback.
- */
- function FailTrans()
- {
- if ($this->debug)
- if ($this->transOff == 0) {
- ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans");
- } else {
- ADOConnection::outp("FailTrans was called");
- adodb_backtrace();
- }
- $this->_transOK = false;
- }
-
- /**
- Check if transaction has failed, only for Smart Transactions.
- */
- function HasFailedTrans()
- {
- if ($this->transOff > 0) return $this->_transOK == false;
- return false;
- }
-
- /**
- * Execute SQL
- *
- * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text)
- * @param [inputarr] holds the input data to bind to. Null elements will be set to null.
- * @return RecordSet or false
- */
- function &Execute($sql,$inputarr=false)
- {
- if ($this->fnExecute) {
- $fn = $this->fnExecute;
- $ret =& $fn($this,$sql,$inputarr);
- if (isset($ret)) return $ret;
- }
- if ($inputarr && is_array($inputarr)) {
- $element0 = reset($inputarr);
- # is_object check is because oci8 descriptors can be passed in
- $array_2d = is_array($element0) && !is_object(reset($element0));
-
- if (!is_array($sql) && !$this->_bindInputArray) {
- $sqlarr = explode('?',$sql);
-
- if (!$array_2d) $inputarr = array($inputarr);
- foreach($inputarr as $arr) {
- $sql = ''; $i = 0;
- foreach($arr as $v) {
- $sql .= $sqlarr[$i];
- // from Ron Baldwin
\n($this->databaseType): ".htmlspecialchars($sqlTxt)." $ss
\n
\n",false);
- else ADOConnection::outp( "
\n($this->databaseType): ".htmlspecialchars($sqlTxt)." $ss
\n
\n",false);
- else
- ADOConnection::outp( "=----\n($this->databaseType): ".($sqlTxt)." \n-----\n",false);
-
- $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 recure
- */
- if ($this->databaseType == 'mssql') {
- // ErrorNo is a slow function call in mssql, and not reliable
- // in PHP 4.0.6
- if($emsg = $this->ErrorMsg()) {
- $err = $this->ErrorNo();
- if ($err) {
- ADOConnection::outp($err.': '.$emsg);
- }
- }
- } else
- if (!$this->_queryID) {
- $e = $this->ErrorNo();
- $m = $this->ErrorMsg();
- ADOConnection::outp($e .': '. $m );
- }
- } else {
- // non-debug version of query
-
- $this->_queryID =@$this->_query($sql,$inputarr);
- }
-
- /************************
- OK, query executed
- *************************/
- // error handling if query fails
- if ($this->_queryID === false) {
- if ($this->debug == 99) adodb_backtrace(true,5);
- $fn = $this->raiseErrorFn;
- if ($fn) {
- $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);
- }
-
- return false;
- } else if ($this->_queryID === true) {
- // return simplified empty recordset for inserts/updates/deletes with lower overhead
- $rs =& new ADORecordSet_empty();
- return $rs;
- }
-
- // return real recordset from select statement
- $rsclass = $this->rsPrefix.$this->databaseType;
- $rs =& new $rsclass($this->_queryID,$this->fetchMode); // &new not supported by older PHP versions
- $rs->connection = &$this; // Pablo suggestion
- $rs->Init();
- if (is_array($sql)) $rs->sql = $sql[0];
- else $rs->sql = $sql;
- if ($rs->_numOfRows <= 0) {
- global $ADODB_COUNTRECS;
-
- if ($ADODB_COUNTRECS) {
- if (!$rs->EOF){
- $rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql));
- $rs->_queryID = $this->_queryID;
- } else
- $rs->_numOfRows = 0;
- }
- }
- return $rs;
- }
-
- function CreateSequence($seqname='adodbseq',$startID=1)
- {
- if (empty($this->_genSeqSQL)) return false;
- return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
- }
-
- function DropSequence($seqname)
- {
- if (empty($this->_dropSeqSQL)) return false;
- return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
- }
-
- /**
- * Generates a sequence id and stores it in $this->genID;
- * GenID is only available if $this->hasGenID = true;
- *
- * @param seqname name of sequence to use
- * @param startID if sequence does not exist, start at this ID
- * @return 0 if not supported, otherwise a sequence id
- */
- function GenID($seqname='adodbseq',$startID=1)
- {
- if (!$this->hasGenID) {
- return 0; // formerly returns false pre 1.60
- }
-
- $getnext = sprintf($this->_genIDSQL,$seqname);
-
- $holdtransOK = $this->_transOK;
- $rs = @$this->Execute($getnext);
- if (!$rs) {
- $this->_transOK = $holdtransOK; //if the status was ok before reset
- $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
- $rs = $this->Execute($getnext);
- }
- if ($rs && !$rs->EOF) $this->genID = reset($rs->fields);
- else $this->genID = 0; // false
-
- if ($rs) $rs->Close();
-
- return $this->genID;
- }
-
- /**
- * @return the last inserted ID. Not all databases support this.
- */
- function Insert_ID()
- {
- if ($this->_logsql && $this->lastInsID) return $this->lastInsID;
- if ($this->hasInsertID) return $this->_insertid();
- if ($this->debug) {
- ADOConnection::outp( '\n", system($cmd),"
");
- } else {
- exec($cmd);
- }
- return;
- }
- $f = $this->_gencachename($sql.serialize($inputarr),false);
- adodb_write_file($f,''); // is adodb_write_file needed?
- if (!@unlink($f)) {
- if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f");
- }
- }
-
- /**
- * Private function to generate filename for caching.
- * Filename is generated based on:
- *
- * - sql statement
- * - database type (oci8, ibase, ifx, etc)
- * - database name
- * - userid
- *
- * We create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR).
- * Assuming that we can have 50,000 files per directory with good performance,
- * then we can scale to 12.8 million unique cached recordsets. Wow!
- */
- function _gencachename($sql,$createdir)
- {
- global $ADODB_CACHE_DIR;
-
- $m = md5($sql.$this->databaseType.$this->database.$this->user);
- $dir = $ADODB_CACHE_DIR.'/'.substr($m,0,2);
- if ($createdir && !file_exists($dir)) {
- $oldu = umask(0);
- if (!mkdir($dir,0771))
- if ($this->debug) ADOConnection::outp( "Unable to mkdir $dir for $sql");
- umask($oldu);
- }
- return $dir.'/adodb_'.$m.'.cache';
- }
-
-
- /**
- * Execute SQL, caching recordsets.
- *
- * @param [secs2cache] seconds to cache data, set to 0 to force query.
- * This is an optional parameter.
- * @param sql SQL statement to execute
- * @param [inputarr] holds the input data to bind to
- * @return RecordSet or false
- */
- function &CacheExecute($secs2cache,$sql=false,$inputarr=false)
- {
- if (!is_numeric($secs2cache)) {
- $inputarr = $sql;
- $sql = $secs2cache;
- $secs2cache = $this->cacheSecs;
- }
- global $ADODB_INCLUDED_CSV;
- if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
-
- if (is_array($sql)) $sql = $sql[0];
-
- $md5file = $this->_gencachename($sql.serialize($inputarr),true);
- $err = '';
-
- if ($secs2cache > 0){
- $rs = &csv2rs($md5file,$err,$secs2cache);
- $this->numCacheHits += 1;
- } else {
- $err='Timeout 1';
- $rs = false;
- $this->numCacheMisses += 1;
- }
- if (!$rs) {
- // no cached rs found
- if ($this->debug) {
- if (get_magic_quotes_runtime()) {
- ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :(");
- }
- if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)");
- }
- $rs = &$this->Execute($sql,$inputarr);
- if ($rs) {
- $eof = $rs->EOF;
- $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
- $txt = _rs2serialize($rs,false,$sql); // serialize
-
- if (!adodb_write_file($md5file,$txt,$this->debug)) {
- if ($fn = $this->raiseErrorFn) {
- $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this);
- }
- if ($this->debug) ADOConnection::outp( " Cache write error");
- }
- if ($rs->EOF && !$eof) {
- $rs->MoveFirst();
- //$rs = &csv2rs($md5file,$err);
- $rs->connection = &$this; // Pablo suggestion
- }
-
- } else
- @unlink($md5file);
- } else {
- $this->_errorMsg = '';
- $this->_errorCode = 0;
-
- if ($this->fnCacheExecute) {
- $fn = $this->fnCacheExecute;
- $fn($this, $secs2cache, $sql, $inputarr);
- }
- // ok, set cached object found
- $rs->connection = &$this; // Pablo suggestion
- if ($this->debug){
- global $HTTP_SERVER_VARS;
-
- $inBrowser = isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']);
- $ttl = $rs->timeCreated + $secs2cache - time();
- $s = is_array($sql) ? $sql[0] : $sql;
- if ($inBrowser) $s = ''.htmlspecialchars($s).'';
-
- ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]");
- }
- }
- return $rs;
- }
-
-
- /**
- * Generates an Update Query based on an existing recordset.
- * $arrFields is an associative array of fields with the value
- * that should be assigned.
- *
- * Note: This function should only be used on a recordset
- * that is run against a single table and sql should only
- * be a simple select stmt with no groupby/orderby/limit
- *
- * "Jonathan Younger"
\n");
- $ok = false;
- }
-
- return $ok;
- }
-
- /*
- Perform a print_r, with pre tags for better formatting.
- */
- function adodb_pr($var)
- {
- if (isset($_SERVER['HTTP_USER_AGENT'])) {
- echo " \n";print_r($var);echo "
\n";
- } else
- print_r($var);
- }
-
- /*
- Perform a stack-crawl and pretty print it.
-
- @param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then).
- @param levels Number of levels to display
- */
- function adodb_backtrace($printOrArr=true,$levels=9999)
- {
- $s = '';
- if (PHPVERSION() < 4.3) return;
-
- $html = (isset($_SERVER['HTTP_USER_AGENT']));
- $fmt = ($html) ? " %% line %4d, file: %s" : "%% line %4d, file: %s";
-
- $MAXSTRLEN = 64;
-
- $s = ($html) ? '' : '';
-
- 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) ? ' ' : "\t";
- $tabs -= 1;
- if ($html) $s .= '';
- 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 .= '
';
- if ($printOrArr) print $s;
-
- return $s;
- }
-
-} // defined
+
+ Manual is at http://php.weblogs.com/adodb_manual
+
+ */
+
+ if (!defined('_ADODB_LAYER')) {
+ define('_ADODB_LAYER',1);
+
+ //==============================================================================================
+ // CONSTANT DEFINITIONS
+ //==============================================================================================
+
+
+ /**
+ * Set ADODB_DIR to the directory where this file resides...
+ * This constant was formerly called $ADODB_RootPath
+ */
+ if (!defined('ADODB_DIR')) define('ADODB_DIR',dirname(__FILE__));
+
+ //==============================================================================================
+ // GLOBAL VARIABLES
+ //==============================================================================================
+
+ GLOBAL
+ $ADODB_vers, // database version
+ $ADODB_COUNTRECS, // count number of records returned - slows down query
+ $ADODB_CACHE_DIR, // directory to cache recordsets
+ $ADODB_EXTENSION, // ADODB extension installed
+ $ADODB_COMPAT_FETCH, // If $ADODB_COUNTRECS and this is true, $rs->fields is available on EOF
+ $ADODB_FETCH_MODE; // DEFAULT, NUM, ASSOC or BOTH. Default follows native driver default...
+
+ //==============================================================================================
+ // GLOBAL SETUP
+ //==============================================================================================
+
+ $ADODB_EXTENSION = defined('ADODB_EXTENSION');
+ if (!$ADODB_EXTENSION || ADODB_EXTENSION < 4.0) {
+
+ define('ADODB_BAD_RS','
\n";
+
+ if (isset($HTTP_SERVER_VARS['HTTP_USER_AGENT'])) echo $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
+
+ }
+
+ function Time()
+ {
+ $rs =& $this->Execute("select $this->sysTimeStamp");
+ if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
+
+ return false;
+ }
+
+ /**
+ * Connect to database
+ *
+ * @param [argHostname] Host to connect to
+ * @param [argUsername] Userid to login
+ * @param [argPassword] Associated password
+ * @param [argDatabaseName] database
+ * @param [forceNew] force new connection
+ *
+ * @return true or false
+ */
+ function Connect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "", $forceNew = false)
+ {
+ if ($argHostname != "") $this->host = $argHostname;
+ if ($argUsername != "") $this->user = $argUsername;
+ if ($argPassword != "") $this->password = $argPassword; // not stored for security reasons
+ if ($argDatabaseName != "") $this->database = $argDatabaseName;
+
+ $this->_isPersistentConnection = false;
+ if ($forceNew) {
+ if ($this->_nconnect($this->host, $this->user, $this->password, $this->database)) return true;
+ } else {
+ if ($this->_connect($this->host, $this->user, $this->password, $this->database)) return true;
+ }
+ $err = $this->ErrorMsg();
+ if (empty($err)) $err = "Connection error to server '$argHostname' with user '$argUsername'";
+ if ($fn = $this->raiseErrorFn)
+ $fn($this->databaseType,'CONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
+
+ if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
+ return false;
+ }
+
+ function _nconnect($argHostname, $argUsername, $argPassword, $argDatabaseName)
+ {
+ return $this->_connect($argHostname, $argUsername, $argPassword, $argDatabaseName);
+ }
+
+
+ /**
+ * Always force a new connection to database - currently only works with oracle
+ *
+ * @param [argHostname] Host to connect to
+ * @param [argUsername] Userid to login
+ * @param [argPassword] Associated password
+ * @param [argDatabaseName] database
+ *
+ * @return true or false
+ */
+ function NConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
+ {
+ return $this->Connect($argHostname, $argUsername, $argPassword, $argDatabaseName, true);
+ }
+
+ /**
+ * Establish persistent connect to database
+ *
+ * @param [argHostname] Host to connect to
+ * @param [argUsername] Userid to login
+ * @param [argPassword] Associated password
+ * @param [argDatabaseName] database
+ *
+ * @return return true or false
+ */
+ function PConnect($argHostname = "", $argUsername = "", $argPassword = "", $argDatabaseName = "")
+ {
+ if (defined('ADODB_NEVER_PERSIST'))
+ return $this->Connect($argHostname,$argUsername,$argPassword,$argDatabaseName);
+
+ if ($argHostname != "") $this->host = $argHostname;
+ if ($argUsername != "") $this->user = $argUsername;
+ if ($argPassword != "") $this->password = $argPassword;
+ if ($argDatabaseName != "") $this->database = $argDatabaseName;
+
+ $this->_isPersistentConnection = true;
+ if ($this->_pconnect($this->host, $this->user, $this->password, $this->database)) return true;
+ $err = $this->ErrorMsg();
+ if (empty($err)) {
+ $err = "Connection error to server '$argHostname' with user '$argUsername'";
+ }
+ if ($fn = $this->raiseErrorFn) {
+ $fn($this->databaseType,'PCONNECT',$this->ErrorNo(),$err,$this->host,$this->database,$this);
+ }
+
+ if ($this->debug) ADOConnection::outp( $this->host.': '.$err);
+ return false;
+ }
+
+ // Format date column in sql string given an input format that understands Y M D
+ function SQLDate($fmt, $col=false)
+ {
+ if (!$col) $col = $this->sysDate;
+ return $col; // child class implement
+ }
+
+ /**
+ * Should prepare the sql statement and return the stmt resource.
+ * For databases that do not support this, we return the $sql. To ensure
+ * compatibility with databases that do not support prepare:
+ *
+ * $stmt = $db->Prepare("insert into table (id, name) values (?,?)");
+ * $db->Execute($stmt,array(1,'Jill')) or die('insert failed');
+ * $db->Execute($stmt,array(2,'Joe')) or die('insert failed');
+ *
+ * @param sql SQL to send to database
+ *
+ * @return return FALSE, or the prepared statement, or the original sql if
+ * if the database does not support prepare.
+ *
+ */
+ function Prepare($sql)
+ {
+ return $sql;
+ }
+
+ /**
+ * Some databases, eg. mssql require a different function for preparing
+ * stored procedures. So we cannot use Prepare().
+ *
+ * Should prepare the stored procedure and return the stmt resource.
+ * For databases that do not support this, we return the $sql. To ensure
+ * compatibility with databases that do not support prepare:
+ *
+ * @param sql SQL to send to database
+ *
+ * @return return FALSE, or the prepared statement, or the original sql if
+ * if the database does not support prepare.
+ *
+ */
+ function PrepareSP($sql,$param=true)
+ {
+ return $this->Prepare($sql,$param);
+ }
+
+ /**
+ * PEAR DB Compat
+ */
+ function Quote($s)
+ {
+ return $this->qstr($s,false);
+ }
+
+ /**
+ Requested by "Karsten Dambekalns"
+ b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.
+ c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block
+ are disabled, making it backward compatible.
+ */
+ function StartTrans($errfn = 'ADODB_TransMonitor')
+ {
+ if ($this->transOff > 0) {
+ $this->transOff += 1;
+ return;
+ }
+
+ $this->_oldRaiseFn = $this->raiseErrorFn;
+ $this->raiseErrorFn = $errfn;
+ $this->_transOK = true;
+
+ if ($this->debug && $this->transCnt > 0) ADOConnection::outp("Bad Transaction: StartTrans called within BeginTrans");
+ $this->BeginTrans();
+ $this->transOff = 1;
+ }
+
+
+ /**
+ Used together with StartTrans() to end a transaction. Monitors connection
+ for sql errors, and will commit or rollback as appropriate.
+
+ @autoComplete if true, monitor sql errors and commit and rollback as appropriate,
+ and if set to false force rollback even if no SQL error detected.
+ @returns true on commit, false on rollback.
+ */
+ function CompleteTrans($autoComplete = true)
+ {
+ if ($this->transOff > 1) {
+ $this->transOff -= 1;
+ return true;
+ }
+ $this->raiseErrorFn = $this->_oldRaiseFn;
+
+ $this->transOff = 0;
+ if ($this->_transOK && $autoComplete) {
+ if (!$this->CommitTrans()) {
+ $this->_transOK = false;
+ if ($this->debug) ADOConnection::outp("Smart Commit failed");
+ } else
+ if ($this->debug) ADOConnection::outp("Smart Commit occurred");
+ } else {
+ $this->RollbackTrans();
+ if ($this->debug) ADOCOnnection::outp("Smart Rollback occurred");
+ }
+
+ return $this->_transOK;
+ }
+
+ /*
+ At the end of a StartTrans/CompleteTrans block, perform a rollback.
+ */
+ function FailTrans()
+ {
+ if ($this->debug)
+ if ($this->transOff == 0) {
+ ADOConnection::outp("FailTrans outside StartTrans/CompleteTrans");
+ } else {
+ ADOConnection::outp("FailTrans was called");
+ adodb_backtrace();
+ }
+ $this->_transOK = false;
+ }
+
+ /**
+ Check if transaction has failed, only for Smart Transactions.
+ */
+ function HasFailedTrans()
+ {
+ if ($this->transOff > 0) return $this->_transOK == false;
+ return false;
+ }
+
+ /**
+ * Execute SQL
+ *
+ * @param sql SQL statement to execute, or possibly an array holding prepared statement ($sql[0] will hold sql text)
+ * @param [inputarr] holds the input data to bind to. Null elements will be set to null.
+ * @return RecordSet or false
+ */
+ function &Execute($sql,$inputarr=false)
+ {
+ if ($this->fnExecute) {
+ $fn = $this->fnExecute;
+ $ret =& $fn($this,$sql,$inputarr);
+ if (isset($ret)) return $ret;
+ }
+ if ($inputarr && is_array($inputarr)) {
+ $element0 = reset($inputarr);
+ # is_object check because oci8 descriptors can be passed in
+ $array_2d = is_array($element0) && !is_object(reset($element0));
+
+ if (!is_array($sql) && !$this->_bindInputArray) {
+ $sqlarr = explode('?',$sql);
+
+ if (!$array_2d) $inputarr = array($inputarr);
+ foreach($inputarr as $arr) {
+ $sql = ''; $i = 0;
+ foreach($arr as $v) {
+ $sql .= $sqlarr[$i];
+ // from Ron Baldwin
\n($this->databaseType): ".htmlspecialchars($sqlTxt)." $ss
\n
\n",false);
+ else
+ ADOConnection::outp( "
\n($this->databaseType): ".htmlspecialchars($sqlTxt)." $ss
\n
\n",false);
+ } else {
+ ADOConnection::outp("-----\n($this->databaseType): ".($sqlTxt)." \n-----\n",false);
+ }
+ $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
+ *************************/
+
+ if ($this->_queryID === false) {
+ // error handling if query fails
+ if ($this->debug == 99) adodb_backtrace(true,5);
+ $fn = $this->raiseErrorFn;
+ if ($fn) {
+ $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);
+ }
+
+ return false;
+ }
+
+
+ if ($this->_queryID === true) {
+ // return simplified empty recordset for inserts/updates/deletes with lower overhead
+ $rs =& new ADORecordSet_empty();
+ #if (is_array($sql)) $rs->sql = $sql[0];
+ #else $rs->sql = $sql;
+ return $rs;
+ }
+
+ // return real recordset from select statement
+ $rsclass = $this->rsPrefix.$this->databaseType;
+ $rs =& new $rsclass($this->_queryID,$this->fetchMode);
+ $rs->connection = &$this; // Pablo suggestion
+ $rs->Init();
+ if (is_array($sql)) $rs->sql = $sql[0];
+ else $rs->sql = $sql;
+ if ($rs->_numOfRows <= 0) {
+ global $ADODB_COUNTRECS;
+ if ($ADODB_COUNTRECS) {
+ if (!$rs->EOF){
+ $rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql));
+ $rs->_queryID = $this->_queryID;
+ } else
+ $rs->_numOfRows = 0;
+ }
+ }
+ return $rs;
+ }
+
+ function CreateSequence($seqname='adodbseq',$startID=1)
+ {
+ if (empty($this->_genSeqSQL)) return false;
+ return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
+ }
+
+ function DropSequence($seqname)
+ {
+ if (empty($this->_dropSeqSQL)) return false;
+ return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
+ }
+
+ /**
+ * Generates a sequence id and stores it in $this->genID;
+ * GenID is only available if $this->hasGenID = true;
+ *
+ * @param seqname name of sequence to use
+ * @param startID if sequence does not exist, start at this ID
+ * @return 0 if not supported, otherwise a sequence id
+ */
+ function GenID($seqname='adodbseq',$startID=1)
+ {
+ if (!$this->hasGenID) {
+ return 0; // formerly returns false pre 1.60
+ }
+
+ $getnext = sprintf($this->_genIDSQL,$seqname);
+
+ $holdtransOK = $this->_transOK;
+ $rs = @$this->Execute($getnext);
+ if (!$rs) {
+ $this->_transOK = $holdtransOK; //if the status was ok before reset
+ $createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));
+ $rs = $this->Execute($getnext);
+ }
+ if ($rs && !$rs->EOF) $this->genID = reset($rs->fields);
+ else $this->genID = 0; // false
+
+ if ($rs) $rs->Close();
+
+ return $this->genID;
+ }
+
+ /**
+ * @return the last inserted ID. Not all databases support this.
+ */
+ function Insert_ID()
+ {
+ if ($this->_logsql && $this->lastInsID) return $this->lastInsID;
+ if ($this->hasInsertID) return $this->_insertid();
+ if ($this->debug) {
+ ADOConnection::outp( '\n", system($cmd),"
");
+ } else {
+ exec($cmd);
+ }
+ return;
+ }
+ $f = $this->_gencachename($sql.serialize($inputarr),false);
+ adodb_write_file($f,''); // is adodb_write_file needed?
+ if (!@unlink($f)) {
+ if ($this->debug) ADOConnection::outp( "CacheFlush: failed for $f");
+ }
+ }
+
+ /**
+ * Private function to generate filename for caching.
+ * Filename is generated based on:
+ *
+ * - sql statement
+ * - database type (oci8, ibase, ifx, etc)
+ * - database name
+ * - userid
+ * - setFetchMode (adodb 4.23)
+ *
+ * When not in safe mode, we create 256 sub-directories in the cache directory ($ADODB_CACHE_DIR).
+ * Assuming that we can have 50,000 files per directory with good performance,
+ * then we can scale to 12.8 million unique cached recordsets. Wow!
+ */
+ function _gencachename($sql,$createdir)
+ {
+ global $ADODB_CACHE_DIR;
+ static $notSafeMode;
+
+ if ($this->fetchMode === false) {
+ global $ADODB_FETCH_MODE;
+ $mode = $ADODB_FETCH_MODE;
+ } else {
+ $mode = $this->fetchMode;
+ }
+ $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode);
+
+ if (!isset($notSafeMode)) $notSafeMode = !ini_get('safe_mode');
+ $dir = ($notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($m,0,2) : $ADODB_CACHE_DIR;
+
+ if ($createdir && $notSafeMode && !file_exists($dir)) {
+ $oldu = umask(0);
+ if (!mkdir($dir,0771))
+ if ($this->debug) ADOConnection::outp( "Unable to mkdir $dir for $sql");
+ umask($oldu);
+ }
+ return $dir.'/adodb_'.$m.'.cache';
+ }
+
+
+ /**
+ * Execute SQL, caching recordsets.
+ *
+ * @param [secs2cache] seconds to cache data, set to 0 to force query.
+ * This is an optional parameter.
+ * @param sql SQL statement to execute
+ * @param [inputarr] holds the input data to bind to
+ * @return RecordSet or false
+ */
+ function &CacheExecute($secs2cache,$sql=false,$inputarr=false)
+ {
+ if (!is_numeric($secs2cache)) {
+ $inputarr = $sql;
+ $sql = $secs2cache;
+ $secs2cache = $this->cacheSecs;
+ }
+ global $ADODB_INCLUDED_CSV;
+ if (empty($ADODB_INCLUDED_CSV)) include_once(ADODB_DIR.'/adodb-csvlib.inc.php');
+
+ if (is_array($sql)) $sql = $sql[0];
+
+ $md5file = $this->_gencachename($sql.serialize($inputarr),true);
+ $err = '';
+
+ if ($secs2cache > 0){
+ $rs = &csv2rs($md5file,$err,$secs2cache);
+ $this->numCacheHits += 1;
+ } else {
+ $err='Timeout 1';
+ $rs = false;
+ $this->numCacheMisses += 1;
+ }
+ if (!$rs) {
+ // no cached rs found
+ if ($this->debug) {
+ if (get_magic_quotes_runtime()) {
+ ADOConnection::outp("Please disable magic_quotes_runtime - it corrupts cache files :(");
+ }
+ if ($this->debug !== -1) ADOConnection::outp( " $md5file cache failure: $err (see sql below)");
+ }
+ $rs = &$this->Execute($sql,$inputarr);
+ if ($rs) {
+ $eof = $rs->EOF;
+ $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
+ $txt = _rs2serialize($rs,false,$sql); // serialize
+
+ if (!adodb_write_file($md5file,$txt,$this->debug)) {
+ if ($fn = $this->raiseErrorFn) {
+ $fn($this->databaseType,'CacheExecute',-32000,"Cache write error",$md5file,$sql,$this);
+ }
+ if ($this->debug) ADOConnection::outp( " Cache write error");
+ }
+ if ($rs->EOF && !$eof) {
+ $rs->MoveFirst();
+ //$rs = &csv2rs($md5file,$err);
+ $rs->connection = &$this; // Pablo suggestion
+ }
+
+ } else
+ @unlink($md5file);
+ } else {
+ $this->_errorMsg = '';
+ $this->_errorCode = 0;
+
+ if ($this->fnCacheExecute) {
+ $fn = $this->fnCacheExecute;
+ $fn($this, $secs2cache, $sql, $inputarr);
+ }
+ // ok, set cached object found
+ $rs->connection = &$this; // Pablo suggestion
+ if ($this->debug){
+ global $HTTP_SERVER_VARS;
+
+ $inBrowser = isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']);
+ $ttl = $rs->timeCreated + $secs2cache - time();
+ $s = is_array($sql) ? $sql[0] : $sql;
+ if ($inBrowser) $s = ''.htmlspecialchars($s).'';
+
+ ADOConnection::outp( " $md5file reloaded, ttl=$ttl [ $s ]");
+ }
+ }
+ return $rs;
+ }
+
+
+ /**
+ * Generates an Update Query based on an existing recordset.
+ * $arrFields is an associative array of fields with the value
+ * that should be assigned.
+ *
+ * Note: This function should only be used on a recordset
+ * that is run against a single table and sql should only
+ * be a simple select stmt with no groupby/orderby/limit
+ *
+ * "Jonathan Younger"
\n");
+ $ok = false;
+ }
+
+ return $ok;
+ }
+
+ /*
+ Perform a print_r, with pre tags for better formatting.
+ */
+ function adodb_pr($var)
+ {
+ if (isset($_SERVER['HTTP_USER_AGENT'])) {
+ echo " \n";print_r($var);echo "
\n";
+ } else
+ print_r($var);
+ }
+
+ /*
+ Perform a stack-crawl and pretty print it.
+
+ @param printOrArr Pass in a boolean to indicate print, or an $exception->trace array (assumes that print is true then).
+ @param levels Number of levels to display
+ */
+ function adodb_backtrace($printOrArr=true,$levels=9999)
+ {
+ $s = '';
+ if (PHPVERSION() < 4.3) return;
+
+ $html = (isset($_SERVER['HTTP_USER_AGENT']));
+ $fmt = ($html) ? " %% line %4d, file: %s" : "%% line %4d, file: %s";
+
+ $MAXSTRLEN = 64;
+
+ $s = ($html) ? '' : '';
+
+ 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) ? ' ' : "\t";
+ $tabs -= 1;
+ if ($html) $s .= '';
+ 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 .= '
';
+ if ($printOrArr) print $s;
+
+ return $s;
+ }
+
+} // defined
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-access.inc.php b/lib/adodb/datadict/datadict-access.inc.php
index c6a4bc5368..48f02416a8 100644
--- a/lib/adodb/datadict/datadict-access.inc.php
+++ b/lib/adodb/datadict/datadict-access.inc.php
@@ -1,92 +1,95 @@
-debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)");
- }
- if ($fnotnull) $suffix .= ' NOT NULL';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
- function CreateDatabase($dbname,$options=false)
- {
- return array();
- }
-
-
- function SetSchema($schema)
- {
- }
-
- function AlterColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
- return array();
- }
-
-
- function DropColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
- return array();
- }
-
-}
-
-
+debug) ADOConnection::outp("Warning: Access does not supported DEFAULT values (field $fname)");
+ }
+ if ($fnotnull) $suffix .= ' NOT NULL';
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+ return $suffix;
+ }
+
+ function CreateDatabase($dbname,$options=false)
+ {
+ return array();
+ }
+
+
+ function SetSchema($schema)
+ {
+ }
+
+ function AlterColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported");
+ return array();
+ }
+
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
+ return array();
+ }
+
+}
+
+
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-db2.inc.php b/lib/adodb/datadict/datadict-db2.inc.php
index cadf516107..769ed4aa3a 100644
--- a/lib/adodb/datadict/datadict-db2.inc.php
+++ b/lib/adodb/datadict/datadict-db2.inc.php
@@ -1,74 +1,76 @@
-debug) ADOConnection::outp("AlterColumnSQL not supported");
- return array();
- }
-
-
- function DropColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
- return array();
- }
-
-}
-
-
+debug) ADOConnection::outp("AlterColumnSQL not supported");
+ return array();
+ }
+
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
+ return array();
+ }
+
+}
+
+
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-firebird.inc.php b/lib/adodb/datadict/datadict-firebird.inc.php
new file mode 100644
index 0000000000..b5068e50b8
--- /dev/null
+++ b/lib/adodb/datadict/datadict-firebird.inc.php
@@ -0,0 +1,151 @@
+connection) ) {
+ return $name;
+ }
+
+ $quote = $this->connection->nameQuote;
+
+ // if name is of the form `name`, quote it
+ if ( preg_match('/^`(.+)`$/', $name, $matches) ) {
+ return $quote . $matches[1] . $quote;
+ }
+
+ // if name contains special characters, quote it
+ if ( !preg_match('/^[' . $this->nameRegex . ']+$/', $name) ) {
+ return $quote . $name . $quote;
+ }
+
+ return $quote . $name . $quote;
+ }
+
+ function CreateDatabase($dbname, $options=false)
+ {
+ $options = $this->_Options($options);
+ $sql = array();
+
+ $sql[] = "DECLARE EXTERNAL FUNCTION LOWER CSTRING(80) RETURNS CSTRING(80) FREE_IT ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'";
+
+ return $sql;
+ }
+
+ function _DropAutoIncrement($t)
+ {
+ if (strpos($t,'.') !== false) {
+ $tarr = explode('.',$t);
+ return 'DROP GENERATOR '.$tarr[0].'."gen_'.$tarr[1].'"';
+ }
+ return 'DROP GENERATOR "GEN_'.$t;
+ }
+
+
+ function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
+ {
+ $suffix = '';
+
+ if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
+ if ($fnotnull) $suffix .= ' NOT NULL';
+ if ($fautoinc) $this->seqField = $fname;
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+
+ return $suffix;
+ }
+
+/*
+CREATE or replace TRIGGER jaddress_insert
+before insert on jaddress
+for each row
+begin
+IF ( NEW."seqField" IS NULL OR NEW."seqField" = 0 ) THEN
+ NEW."seqField" = GEN_ID("GEN_tabname", 1);
+end;
+*/
+ function _Triggers($tabname,$tableoptions)
+ {
+ if (!$this->seqField) return array();
+
+ $tab1 = preg_replace( '/"/', '', $tabname );
+ if ($this->schema) {
+ $t = strpos($tab1,'.');
+ if ($t !== false) $tab = substr($tab1,$t+1);
+ else $tab = $tab1;
+ $seqField = $this->seqField;
+ $seqname = $this->schema.'.'.$this->seqPrefix.$tab;
+ $trigname = $this->schema.'.trig_'.$this->seqPrefix.$tab;
+ } else {
+ $seqField = $this->seqField;
+ $seqname = $this->seqPrefix.$tab1;
+ $trigname = 'trig_'.$seqname;
+ }
+ if (isset($tableoptions['REPLACE']))
+ { $sql[] = "DROP GENERATOR \"$seqname\"";
+ $sql[] = "CREATE GENERATOR \"$seqname\"";
+ $sql[] = "ALTER TRIGGER \"$trigname\" BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
+ }
+ else
+ { $sql[] = "CREATE GENERATOR \"$seqname\"";
+ $sql[] = "CREATE TRIGGER \"$trigname\" FOR $tabname BEFORE INSERT OR UPDATE AS BEGIN IF ( NEW.$seqField IS NULL OR NEW.$seqField = 0 ) THEN NEW.$seqField = GEN_ID(\"$seqname\", 1); END";
+ }
+
+ $this->seqField = false;
+ return $sql;
+ }
+
+}
+
+
+?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-generic.inc.php b/lib/adodb/datadict/datadict-generic.inc.php
index cb4fc462d1..15232fcd0c 100644
--- a/lib/adodb/datadict/datadict-generic.inc.php
+++ b/lib/adodb/datadict/datadict-generic.inc.php
@@ -1,122 +1,125 @@
-debug) ADOConnection::outp("AlterColumnSQL not supported");
- return array();
- }
-
-
- function DropColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
- return array();
- }
-
-}
-
-/*
-//db2
- function ActualType($meta)
- {
- switch($meta) {
- case 'C': return 'VARCHAR';
- case 'X': return 'VARCHAR';
-
- case 'C2': return 'VARCHAR'; // up to 32K
- case 'X2': return 'VARCHAR';
-
- case 'B': return 'BLOB';
-
- case 'D': return 'DATE';
- case 'T': return 'TIMESTAMP';
-
- case 'L': return 'SMALLINT';
- case 'I': return 'INTEGER';
- case 'I1': return 'SMALLINT';
- case 'I2': return 'SMALLINT';
- case 'I4': return 'INTEGER';
- case 'I8': return 'BIGINT';
-
- case 'F': return 'DOUBLE';
- case 'N': return 'DECIMAL';
- default:
- return $meta;
- }
- }
-
-// ifx
-function ActualType($meta)
- {
- switch($meta) {
- case 'C': return 'VARCHAR';// 255
- case 'X': return 'TEXT';
-
- case 'C2': return 'NVARCHAR';
- case 'X2': return 'TEXT';
-
- case 'B': return 'BLOB';
-
- case 'D': return 'DATE';
- case 'T': return 'DATETIME';
-
- case 'L': return 'SMALLINT';
- case 'I': return 'INTEGER';
- case 'I1': return 'SMALLINT';
- case 'I2': return 'SMALLINT';
- case 'I4': return 'INTEGER';
- case 'I8': return 'DECIMAL(20)';
-
- case 'F': return 'FLOAT';
- case 'N': return 'DECIMAL';
- default:
- return $meta;
- }
- }
-*/
+debug) ADOConnection::outp("AlterColumnSQL not supported");
+ return array();
+ }
+
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
+ return array();
+ }
+
+}
+
+/*
+//db2
+ function ActualType($meta)
+ {
+ switch($meta) {
+ case 'C': return 'VARCHAR';
+ case 'X': return 'VARCHAR';
+
+ case 'C2': return 'VARCHAR'; // up to 32K
+ case 'X2': return 'VARCHAR';
+
+ case 'B': return 'BLOB';
+
+ case 'D': return 'DATE';
+ case 'T': return 'TIMESTAMP';
+
+ case 'L': return 'SMALLINT';
+ case 'I': return 'INTEGER';
+ case 'I1': return 'SMALLINT';
+ case 'I2': return 'SMALLINT';
+ case 'I4': return 'INTEGER';
+ case 'I8': return 'BIGINT';
+
+ case 'F': return 'DOUBLE';
+ case 'N': return 'DECIMAL';
+ default:
+ return $meta;
+ }
+ }
+
+// ifx
+function ActualType($meta)
+ {
+ switch($meta) {
+ case 'C': return 'VARCHAR';// 255
+ case 'X': return 'TEXT';
+
+ case 'C2': return 'NVARCHAR';
+ case 'X2': return 'TEXT';
+
+ case 'B': return 'BLOB';
+
+ case 'D': return 'DATE';
+ case 'T': return 'DATETIME';
+
+ case 'L': return 'SMALLINT';
+ case 'I': return 'INTEGER';
+ case 'I1': return 'SMALLINT';
+ case 'I2': return 'SMALLINT';
+ case 'I4': return 'INTEGER';
+ case 'I8': return 'DECIMAL(20)';
+
+ case 'F': return 'FLOAT';
+ case 'N': return 'DECIMAL';
+ default:
+ return $meta;
+ }
+ }
+*/
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-ibase.inc.php b/lib/adodb/datadict/datadict-ibase.inc.php
index 0583b962a2..558d5560a6 100644
--- a/lib/adodb/datadict/datadict-ibase.inc.php
+++ b/lib/adodb/datadict/datadict-ibase.inc.php
@@ -1,64 +1,67 @@
-debug) ADOConnection::outp("AlterColumnSQL not supported");
- return array();
- }
-
-
- function DropColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
- return array();
- }
-
-}
-
-
+debug) ADOConnection::outp("AlterColumnSQL not supported");
+ return array();
+ }
+
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
+ return array();
+ }
+
+}
+
+
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-informix.inc.php b/lib/adodb/datadict/datadict-informix.inc.php
index 0064c9a43a..abc2f61308 100644
--- a/lib/adodb/datadict/datadict-informix.inc.php
+++ b/lib/adodb/datadict/datadict-informix.inc.php
@@ -1,77 +1,80 @@
-debug) ADOConnection::outp("AlterColumnSQL not supported");
- return array();
- }
-
-
- function DropColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
- return array();
- }
-
- // return string must begin with space
- function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
- {
- if ($fautoinc) {
- $ftype = 'SERIAL';
- return '';
- }
- $suffix = '';
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fnotnull) $suffix .= ' NOT NULL';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
-}
-
+debug) ADOConnection::outp("AlterColumnSQL not supported");
+ return array();
+ }
+
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("DropColumnSQL not supported");
+ return array();
+ }
+
+ // return string must begin with space
+ function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
+ {
+ if ($fautoinc) {
+ $ftype = 'SERIAL';
+ return '';
+ }
+ $suffix = '';
+ if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
+ if ($fnotnull) $suffix .= ' NOT NULL';
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+ return $suffix;
+ }
+
+}
+
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-mssql.inc.php b/lib/adodb/datadict/datadict-mssql.inc.php
index a3fdc9e3ec..ec61cf4e02 100644
--- a/lib/adodb/datadict/datadict-mssql.inc.php
+++ b/lib/adodb/datadict/datadict-mssql.inc.php
@@ -1,229 +1,250 @@
-type;
- $len = $fieldobj->max_length;
- }
-
- $len = -1; // mysql max_length is not accurate
- switch (strtoupper($t)) {
-
- case 'INT':
- case 'INTEGER': return 'I';
- case 'BIT':
- case 'TINYINT': return 'I1';
- case 'SMALLINT': return 'I2';
- case 'BIGINT': return 'I8';
-
- case 'REAL':
- case 'FLOAT': return 'F';
- default: return parent::MetaType($t,$len,$fieldobj);
- }
- }
-
- function ActualType($meta)
- {
- switch(strtoupper($meta)) {
- case 'C': return 'VARCHAR';
- case 'XL':
- case 'X': return 'TEXT';
-
- case 'C2': return 'NVARCHAR';
- case 'X2': return 'NTEXT';
-
- case 'B': return 'IMAGE';
-
- case 'D': return 'DATETIME';
- case 'T': return 'DATETIME';
- case 'L': return 'BIT';
-
- case 'I': return 'INT';
- case 'I1': return 'TINYINT';
- case 'I2': return 'SMALLINT';
- case 'I4': return 'INT';
- case 'I8': return 'BIGINT';
-
- case 'F': return 'REAL';
- case 'N': return 'NUMERIC';
- default:
- return $meta;
- }
- }
-
-
- function AddColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- $f = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- $s = "ALTER TABLE $tabname $this->addCol";
- foreach($lines as $v) {
- $f[] = "\n $v";
- }
- $s .= implode(',',$f);
- $sql[] = $s;
- return $sql;
- }
-
- /*
- function AlterColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- $sql = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- foreach($lines as $v) {
- $sql[] = "ALTER TABLE $tabname $this->alterCol $v";
- }
-
- return $sql;
- }
- */
-
- function DropColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- if (!is_array($flds))
- $flds = explode(',',$flds);
- $f = array();
- $s = 'ALTER TABLE ' . $tabname;
- foreach($flds as $v) {
- $f[] = "\n$this->dropCol $v";
- }
- $s .= implode(',',$f);
- $sql[] = $s;
- return $sql;
- }
-
- // return string must begin with space
- function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
- {
- $suffix = '';
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
- if ($fnotnull) $suffix .= ' NOT NULL';
- else if ($suffix == '') $suffix .= ' NULL';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
- /*
-CREATE TABLE
- [ database_name.[ owner ] . | owner. ] table_name
- ( { < column_definition >
- | column_name AS computed_column_expression
- | < table_constraint > ::= [ CONSTRAINT constraint_name ] }
-
- | [ { PRIMARY KEY | UNIQUE } [ ,...n ]
- )
-
-[ ON { filegroup | DEFAULT } ]
-[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
-
-< column_definition > ::= { column_name data_type }
- [ COLLATE < collation_name > ]
- [ [ DEFAULT constant_expression ]
- | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
- ]
- [ ROWGUIDCOL]
- [ < column_constraint > ] [ ...n ]
-
-< column_constraint > ::= [ CONSTRAINT constraint_name ]
- { [ NULL | NOT NULL ]
- | [ { PRIMARY KEY | UNIQUE }
- [ CLUSTERED | NONCLUSTERED ]
- [ WITH FILLFACTOR = fillfactor ]
- [ON {filegroup | DEFAULT} ] ]
- ]
- | [ [ FOREIGN KEY ]
- REFERENCES ref_table [ ( ref_column ) ]
- [ ON DELETE { CASCADE | NO ACTION } ]
- [ ON UPDATE { CASCADE | NO ACTION } ]
- [ NOT FOR REPLICATION ]
- ]
- | CHECK [ NOT FOR REPLICATION ]
- ( logical_expression )
- }
-
-< table_constraint > ::= [ CONSTRAINT constraint_name ]
- { [ { PRIMARY KEY | UNIQUE }
- [ CLUSTERED | NONCLUSTERED ]
- { ( column [ ASC | DESC ] [ ,...n ] ) }
- [ WITH FILLFACTOR = fillfactor ]
- [ ON { filegroup | DEFAULT } ]
- ]
- | FOREIGN KEY
- [ ( column [ ,...n ] ) ]
- REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
- [ ON DELETE { CASCADE | NO ACTION } ]
- [ ON UPDATE { CASCADE | NO ACTION } ]
- [ NOT FOR REPLICATION ]
- | CHECK [ NOT FOR REPLICATION ]
- ( search_conditions )
- }
-
-
- */
-
- /*
- CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
- ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
- [ WITH < index_option > [ ,...n] ]
- [ ON filegroup ]
- < index_option > :: =
- { PAD_INDEX |
- FILLFACTOR = fillfactor |
- IGNORE_DUP_KEY |
- DROP_EXISTING |
- STATISTICS_NORECOMPUTE |
- SORT_IN_TEMPDB
- }
-*/
- function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
- {
- $sql = array();
-
- if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
- $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
- if ( isset($idxoptions['DROP']) )
- return $sql;
- }
-
- if ( empty ($flds) ) {
- return $sql;
- }
-
- $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
- $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
-
- if ( is_array($flds) )
- $flds = implode(', ',$flds);
- $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
-
- if ( isset($idxoptions[$this->upperName]) )
- $s .= $idxoptions[$this->upperName];
-
-
- $sql[] = $s;
-
- return $sql;
- }
-}
+type;
+ $len = $fieldobj->max_length;
+ }
+
+ $len = -1; // mysql max_length is not accurate
+ switch (strtoupper($t)) {
+
+ case 'INT':
+ case 'INTEGER': return 'I';
+ case 'BIT':
+ case 'TINYINT': return 'I1';
+ case 'SMALLINT': return 'I2';
+ case 'BIGINT': return 'I8';
+
+ case 'REAL':
+ case 'FLOAT': return 'F';
+ default: return parent::MetaType($t,$len,$fieldobj);
+ }
+ }
+
+ function ActualType($meta)
+ {
+ switch(strtoupper($meta)) {
+ case 'C': return 'VARCHAR';
+ case 'XL':
+ case 'X': return 'TEXT';
+
+ case 'C2': return 'NVARCHAR';
+ case 'X2': return 'NTEXT';
+
+ case 'B': return 'IMAGE';
+
+ case 'D': return 'DATETIME';
+ case 'T': return 'DATETIME';
+ case 'L': return 'BIT';
+
+ case 'I': return 'INT';
+ case 'I1': return 'TINYINT';
+ case 'I2': return 'SMALLINT';
+ case 'I4': return 'INT';
+ case 'I8': return 'BIGINT';
+
+ case 'F': return 'REAL';
+ case 'N': return 'NUMERIC';
+ default:
+ return $meta;
+ }
+ }
+
+
+ function AddColumnSQL($tabname, $flds)
+ {
+ $tabname = $this->TableName ($tabname);
+ $f = array();
+ list($lines,$pkey) = $this->_GenFields($flds);
+ $s = "ALTER TABLE $tabname $this->addCol";
+ foreach($lines as $v) {
+ $f[] = "\n $v";
+ }
+ $s .= implode(',',$f);
+ $sql[] = $s;
+ return $sql;
+ }
+
+ /*
+ function AlterColumnSQL($tabname, $flds)
+ {
+ $tabname = $this->TableName ($tabname);
+ $sql = array();
+ list($lines,$pkey) = $this->_GenFields($flds);
+ foreach($lines as $v) {
+ $sql[] = "ALTER TABLE $tabname $this->alterCol $v";
+ }
+
+ return $sql;
+ }
+ */
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ $tabname = $this->TableName ($tabname);
+ if (!is_array($flds))
+ $flds = explode(',',$flds);
+ $f = array();
+ $s = 'ALTER TABLE ' . $tabname;
+ foreach($flds as $v) {
+ $f[] = "\n$this->dropCol $v";
+ }
+ $s .= implode(',',$f);
+ $sql[] = $s;
+ return $sql;
+ }
+
+ // return string must begin with space
+ function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
+ {
+ $suffix = '';
+ if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
+ if ($fautoinc) $suffix .= ' IDENTITY(1,1)';
+ if ($fnotnull) $suffix .= ' NOT NULL';
+ else if ($suffix == '') $suffix .= ' NULL';
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+ return $suffix;
+ }
+
+ /*
+CREATE TABLE
+ [ database_name.[ owner ] . | owner. ] table_name
+ ( { < column_definition >
+ | column_name AS computed_column_expression
+ | < table_constraint > ::= [ CONSTRAINT constraint_name ] }
+
+ | [ { PRIMARY KEY | UNIQUE } [ ,...n ]
+ )
+
+[ ON { filegroup | DEFAULT } ]
+[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
+
+< column_definition > ::= { column_name data_type }
+ [ COLLATE < collation_name > ]
+ [ [ DEFAULT constant_expression ]
+ | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
+ ]
+ [ ROWGUIDCOL]
+ [ < column_constraint > ] [ ...n ]
+
+< column_constraint > ::= [ CONSTRAINT constraint_name ]
+ { [ NULL | NOT NULL ]
+ | [ { PRIMARY KEY | UNIQUE }
+ [ CLUSTERED | NONCLUSTERED ]
+ [ WITH FILLFACTOR = fillfactor ]
+ [ON {filegroup | DEFAULT} ] ]
+ ]
+ | [ [ FOREIGN KEY ]
+ REFERENCES ref_table [ ( ref_column ) ]
+ [ ON DELETE { CASCADE | NO ACTION } ]
+ [ ON UPDATE { CASCADE | NO ACTION } ]
+ [ NOT FOR REPLICATION ]
+ ]
+ | CHECK [ NOT FOR REPLICATION ]
+ ( logical_expression )
+ }
+
+< table_constraint > ::= [ CONSTRAINT constraint_name ]
+ { [ { PRIMARY KEY | UNIQUE }
+ [ CLUSTERED | NONCLUSTERED ]
+ { ( column [ ASC | DESC ] [ ,...n ] ) }
+ [ WITH FILLFACTOR = fillfactor ]
+ [ ON { filegroup | DEFAULT } ]
+ ]
+ | FOREIGN KEY
+ [ ( column [ ,...n ] ) ]
+ REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
+ [ ON DELETE { CASCADE | NO ACTION } ]
+ [ ON UPDATE { CASCADE | NO ACTION } ]
+ [ NOT FOR REPLICATION ]
+ | CHECK [ NOT FOR REPLICATION ]
+ ( search_conditions )
+ }
+
+
+ */
+
+ /*
+ CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
+ ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
+ [ WITH < index_option > [ ,...n] ]
+ [ ON filegroup ]
+ < index_option > :: =
+ { PAD_INDEX |
+ FILLFACTOR = fillfactor |
+ IGNORE_DUP_KEY |
+ DROP_EXISTING |
+ STATISTICS_NORECOMPUTE |
+ SORT_IN_TEMPDB
+ }
+*/
+ function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
+ {
+ $sql = array();
+
+ if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
+ $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
+ if ( isset($idxoptions['DROP']) )
+ return $sql;
+ }
+
+ if ( empty ($flds) ) {
+ return $sql;
+ }
+
+ $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
+ $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
+
+ if ( is_array($flds) )
+ $flds = implode(', ',$flds);
+ $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
+
+ if ( isset($idxoptions[$this->upperName]) )
+ $s .= $idxoptions[$this->upperName];
+
+
+ $sql[] = $s;
+
+ return $sql;
+ }
+
+
+ function _GetSize($ftype, $ty, $fsize, $fprec)
+ {
+ switch ($ftype) {
+ case 'INT':
+ case 'SMALLINT':
+ case 'TINYINT':
+ case 'BIGINT':
+ return $ftype;
+ }
+ if (strlen($fsize) && $ty != 'X' && $ty != 'B' && strpos($ftype,'(') === false) {
+ $ftype .= "(".$fsize;
+ if (strlen($fprec)) $ftype .= ",".$fprec;
+ $ftype .= ')';
+ }
+ return $ftype;
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-mysql.inc.php b/lib/adodb/datadict/datadict-mysql.inc.php
index 8990fcf883..105fdd73cc 100644
--- a/lib/adodb/datadict/datadict-mysql.inc.php
+++ b/lib/adodb/datadict/datadict-mysql.inc.php
@@ -1,176 +1,179 @@
-type;
- $len = $fieldobj->max_length;
- }
-
- $len = -1; // mysql max_length is not accurate
- switch (strtoupper($t)) {
- case 'STRING':
- case 'CHAR':
- case 'VARCHAR':
- case 'TINYBLOB':
- case 'TINYTEXT':
- case 'ENUM':
- case 'SET':
- if ($len <= $this->blobSize) return 'C';
-
- case 'TEXT':
- case 'LONGTEXT':
- case 'MEDIUMTEXT':
- return 'X';
-
- // php_mysql extension always returns 'blob' even if 'text'
- // so we have to check whether binary...
- case 'IMAGE':
- case 'LONGBLOB':
- case 'BLOB':
- case 'MEDIUMBLOB':
- return !empty($fieldobj->binary) ? 'B' : 'X';
-
- case 'YEAR':
- case 'DATE': return 'D';
-
- case 'TIME':
- case 'DATETIME':
- case 'TIMESTAMP': return 'T';
-
- case 'FLOAT':
- case 'DOUBLE':
- return 'F';
-
- case 'INT':
- case 'INTEGER': return (!empty($fieldobj->primary_key)) ? 'R' : 'I';
- case 'TINYINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I1';
- case 'SMALLINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I2';
- case 'MEDIUMINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I4';
- case 'BIGINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I8';
- default: return 'N';
- }
- }
-
- function ActualType($meta)
- {
- switch(strtoupper($meta)) {
- case 'C': return 'VARCHAR';
- case 'XL':
- case 'X': return 'LONGTEXT';
-
- case 'C2': return 'VARCHAR';
- case 'X2': return 'LONGTEXT';
-
- case 'B': return 'LONGBLOB';
-
- case 'D': return 'DATE';
- case 'T': return 'DATETIME';
- case 'L': return 'TINYINT';
-
- case 'R':
- case 'I': return 'INTEGER';
- case 'I1': return 'TINYINT';
- case 'I2': return 'SMALLINT';
- case 'I4': return 'MEDIUMINT';
- case 'I8': return 'BIGINT';
-
- case 'F': return 'DOUBLE';
- case 'N': return 'NUMERIC';
- default:
- return $meta;
- }
- }
-
- // return string must begin with space
- function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
- {
- $suffix = '';
- if ($funsigned) $suffix .= ' UNSIGNED';
- if ($fnotnull) $suffix .= ' NOT NULL';
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fautoinc) $suffix .= ' AUTO_INCREMENT';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
- /*
- CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
- [table_options] [select_statement]
- create_definition:
- col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
- [PRIMARY KEY] [reference_definition]
- or PRIMARY KEY (index_col_name,...)
- or KEY [index_name] (index_col_name,...)
- or INDEX [index_name] (index_col_name,...)
- or UNIQUE [INDEX] [index_name] (index_col_name,...)
- or FULLTEXT [INDEX] [index_name] (index_col_name,...)
- or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
- [reference_definition]
- or CHECK (expr)
- */
-
- /*
- CREATE [UNIQUE|FULLTEXT] INDEX index_name
- ON tbl_name (col_name[(length)],... )
- */
-
- function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
- {
- $sql = array();
-
- if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
- if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname";
- else $sql[] = sprintf($this->dropIndex, $idxname, $tabname);
-
- if ( isset($idxoptions['DROP']) )
- return $sql;
- }
-
- if ( empty ($flds) ) {
- return $sql;
- }
-
- if (isset($idxoptions['FULLTEXT'])) {
- $unique = ' FULLTEXT';
- } elseif (isset($idxoptions['UNIQUE'])) {
- $unique = ' UNIQUE';
- } else {
- $unique = '';
- }
-
- if ( is_array($flds) ) $flds = implode(', ',$flds);
-
- if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname ";
- else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname;
-
- $s .= ' (' . $flds . ')';
-
- if ( isset($idxoptions[$this->upperName]) )
- $s .= $idxoptions[$this->upperName];
-
- $sql[] = $s;
-
- return $sql;
- }
-}
+type;
+ $len = $fieldobj->max_length;
+ }
+
+ $len = -1; // mysql max_length is not accurate
+ switch (strtoupper($t)) {
+ case 'STRING':
+ case 'CHAR':
+ case 'VARCHAR':
+ case 'TINYBLOB':
+ case 'TINYTEXT':
+ case 'ENUM':
+ case 'SET':
+ if ($len <= $this->blobSize) return 'C';
+
+ case 'TEXT':
+ case 'LONGTEXT':
+ case 'MEDIUMTEXT':
+ return 'X';
+
+ // php_mysql extension always returns 'blob' even if 'text'
+ // so we have to check whether binary...
+ case 'IMAGE':
+ case 'LONGBLOB':
+ case 'BLOB':
+ case 'MEDIUMBLOB':
+ return !empty($fieldobj->binary) ? 'B' : 'X';
+
+ case 'YEAR':
+ case 'DATE': return 'D';
+
+ case 'TIME':
+ case 'DATETIME':
+ case 'TIMESTAMP': return 'T';
+
+ case 'FLOAT':
+ case 'DOUBLE':
+ return 'F';
+
+ case 'INT':
+ case 'INTEGER': return (!empty($fieldobj->primary_key)) ? 'R' : 'I';
+ case 'TINYINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I1';
+ case 'SMALLINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I2';
+ case 'MEDIUMINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I4';
+ case 'BIGINT': return (!empty($fieldobj->primary_key)) ? 'R' : 'I8';
+ default: return 'N';
+ }
+ }
+
+ function ActualType($meta)
+ {
+ switch(strtoupper($meta)) {
+ case 'C': return 'VARCHAR';
+ case 'XL':
+ case 'X': return 'LONGTEXT';
+
+ case 'C2': return 'VARCHAR';
+ case 'X2': return 'LONGTEXT';
+
+ case 'B': return 'LONGBLOB';
+
+ case 'D': return 'DATE';
+ case 'T': return 'DATETIME';
+ case 'L': return 'TINYINT';
+
+ case 'R':
+ case 'I': return 'INTEGER';
+ case 'I1': return 'TINYINT';
+ case 'I2': return 'SMALLINT';
+ case 'I4': return 'MEDIUMINT';
+ case 'I8': return 'BIGINT';
+
+ case 'F': return 'DOUBLE';
+ case 'N': return 'NUMERIC';
+ default:
+ return $meta;
+ }
+ }
+
+ // return string must begin with space
+ function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
+ {
+ $suffix = '';
+ if ($funsigned) $suffix .= ' UNSIGNED';
+ if ($fnotnull) $suffix .= ' NOT NULL';
+ if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
+ if ($fautoinc) $suffix .= ' AUTO_INCREMENT';
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+ return $suffix;
+ }
+
+ /*
+ CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
+ [table_options] [select_statement]
+ create_definition:
+ col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
+ [PRIMARY KEY] [reference_definition]
+ or PRIMARY KEY (index_col_name,...)
+ or KEY [index_name] (index_col_name,...)
+ or INDEX [index_name] (index_col_name,...)
+ or UNIQUE [INDEX] [index_name] (index_col_name,...)
+ or FULLTEXT [INDEX] [index_name] (index_col_name,...)
+ or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
+ [reference_definition]
+ or CHECK (expr)
+ */
+
+ /*
+ CREATE [UNIQUE|FULLTEXT] INDEX index_name
+ ON tbl_name (col_name[(length)],... )
+ */
+
+ function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
+ {
+ $sql = array();
+
+ if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
+ if ($this->alterTableAddIndex) $sql[] = "ALTER TABLE $tabname DROP INDEX $idxname";
+ else $sql[] = sprintf($this->dropIndex, $idxname, $tabname);
+
+ if ( isset($idxoptions['DROP']) )
+ return $sql;
+ }
+
+ if ( empty ($flds) ) {
+ return $sql;
+ }
+
+ if (isset($idxoptions['FULLTEXT'])) {
+ $unique = ' FULLTEXT';
+ } elseif (isset($idxoptions['UNIQUE'])) {
+ $unique = ' UNIQUE';
+ } else {
+ $unique = '';
+ }
+
+ if ( is_array($flds) ) $flds = implode(', ',$flds);
+
+ if ($this->alterTableAddIndex) $s = "ALTER TABLE $tabname ADD $unique INDEX $idxname ";
+ else $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname;
+
+ $s .= ' (' . $flds . ')';
+
+ if ( isset($idxoptions[$this->upperName]) )
+ $s .= $idxoptions[$this->upperName];
+
+ $sql[] = $s;
+
+ return $sql;
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-oci8.inc.php b/lib/adodb/datadict/datadict-oci8.inc.php
index cd038f7931..3eda52ac0e 100644
--- a/lib/adodb/datadict/datadict-oci8.inc.php
+++ b/lib/adodb/datadict/datadict-oci8.inc.php
@@ -1,263 +1,277 @@
-type;
- $len = $fieldobj->max_length;
- }
- switch (strtoupper($t)) {
- case 'VARCHAR':
- case 'VARCHAR2':
- case 'CHAR':
- case 'VARBINARY':
- case 'BINARY':
- if (isset($this) && $len <= $this->blobSize) return 'C';
- return 'X';
-
- case 'NCHAR':
- case 'NVARCHAR2':
- case 'NVARCHAR':
- if (isset($this) && $len <= $this->blobSize) return 'C2';
- return 'X2';
-
- case 'NCLOB':
- case 'CLOB':
- return 'XL';
-
- case 'LONG RAW':
- case 'LONG VARBINARY':
- case 'BLOB':
- return 'B';
-
- case 'DATE':
- return 'T';
-
- case 'INT':
- case 'SMALLINT':
- case 'INTEGER':
- return 'I';
-
- default:
- return 'N';
- }
- }
-
- function ActualType($meta)
- {
- switch($meta) {
- case 'C': return 'VARCHAR';
- case 'X': return 'VARCHAR(4000)';
- case 'XL': return 'CLOB';
-
- case 'C2': return 'NVARCHAR';
- case 'X2': return 'NVARCHAR(2000)';
-
- case 'B': return 'BLOB';
-
- case 'D':
- case 'T': return 'DATE';
- case 'L': return 'DECIMAL(1)';
- case 'I1': return 'DECIMAL(3)';
- case 'I2': return 'DECIMAL(5)';
- case 'I':
- case 'I4': return 'DECIMAL(10)';
-
- case 'I8': return 'DECIMAL(20)';
- case 'F': return 'DECIMAL';
- case 'N': return 'DECIMAL';
- default:
- return $meta;
- }
- }
-
- function CreateDatabase($dbname, $options=false)
- {
- $options = $this->_Options($options);
- $password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger';
- $tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : '';
- $sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace;
- $sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname";
-
- return $sql;
- }
-
- function AddColumnSQL($tabname, $flds)
- {
- $f = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- $s = "ALTER TABLE $tabname ADD (";
- foreach($lines as $v) {
- $f[] = "\n $v";
- }
-
- $s .= implode(',',$f).')';
- $sql[] = $s;
- return $sql;
- }
-
- function AlterColumnSQL($tabname, $flds)
- {
- $f = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- $s = "ALTER TABLE $tabname MODIFY(";
- foreach($lines as $v) {
- $f[] = "\n $v";
- }
- $s .= implode(',',$f).')';
- $sql[] = $s;
- return $sql;
- }
-
- function DropColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("DropColumnSQL not supported for Oracle");
- return array();
- }
-
- function _DropAutoIncrement($t)
- {
- if (strpos($t,'.') !== false) {
- $tarr = explode('.',$t);
- return "drop sequence ".$tarr[0].".seq_".$tarr[1];
- }
- return "drop sequence seq_".$t;
- }
-
- // return string must begin with space
- function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
- {
- $suffix = '';
-
- if ($fdefault == "''" && $fnotnull) {// this is null in oracle
- $fnotnull = false;
- if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle");
- }
-
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fnotnull) $suffix .= ' NOT NULL';
-
- if ($fautoinc) $this->seqField = $fname;
- if ($fconstraint) $suffix .= ' '.$fconstraint;
-
- return $suffix;
- }
-
-/*
-CREATE or replace TRIGGER jaddress_insert
-before insert on jaddress
-for each row
-begin
-select seqaddress.nextval into :new.A_ID from dual;
-end;
-*/
- function _Triggers($tabname,$tableoptions)
- {
- if (!$this->seqField) return array();
-
- if ($this->schema) {
- $t = strpos($tabname,'.');
- if ($t !== false) $tab = substr($tabname,$t+1);
- else $tab = $tabname;
- $seqname = $this->schema.'.'.$this->seqPrefix.$tab;
- $trigname = $this->schema.'.TRIG_'.$this->seqPrefix.$tab;
- } else {
- $seqname = $this->seqPrefix.$tabname;
- $trigname = "TRIG_$seqname";
- }
- if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname";
- $sql[] = "CREATE SEQUENCE $seqname";
- $sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;";
-
- $this->seqField = false;
- return $sql;
- }
-
- /*
- CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
- [table_options] [select_statement]
- create_definition:
- col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
- [PRIMARY KEY] [reference_definition]
- or PRIMARY KEY (index_col_name,...)
- or KEY [index_name] (index_col_name,...)
- or INDEX [index_name] (index_col_name,...)
- or UNIQUE [INDEX] [index_name] (index_col_name,...)
- or FULLTEXT [INDEX] [index_name] (index_col_name,...)
- or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
- [reference_definition]
- or CHECK (expr)
- */
-
-
-
- function _IndexSQL($idxname, $tabname, $flds,$idxoptions)
- {
- $sql = array();
-
- if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
- $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
- if ( isset($idxoptions['DROP']) )
- return $sql;
- }
-
- if ( empty ($flds) ) {
- return $sql;
- }
-
- if (isset($idxoptions['BITMAP'])) {
- $unique = ' BITMAP';
- } elseif (isset($idxoptions['UNIQUE'])) {
- $unique = ' UNIQUE';
- } else {
- $unique = '';
- }
-
- if ( is_array($flds) )
- $flds = implode(', ',$flds);
- $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
-
- if ( isset($idxoptions[$this->upperName]) )
- $s .= $idxoptions[$this->upperName];
-
- if (isset($idxoptions['oci8']))
- $s .= $idxoptions['oci8'];
-
-
- $sql[] = $s;
-
- return $sql;
- }
-
- function GetCommentSQL($table,$col)
- {
- $table = $this->connection->qstr($table);
- $col = $this->connection->qstr($col);
- return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col";
- }
-
- function SetCommentSQL($table,$col,$cmt)
- {
- $cmt = $this->connection->qstr($cmt);
- return "COMMENT ON COLUMN $table.$col IS $cmt";
- }
-}
+type;
+ $len = $fieldobj->max_length;
+ }
+ switch (strtoupper($t)) {
+ case 'VARCHAR':
+ case 'VARCHAR2':
+ case 'CHAR':
+ case 'VARBINARY':
+ case 'BINARY':
+ if (isset($this) && $len <= $this->blobSize) return 'C';
+ return 'X';
+
+ case 'NCHAR':
+ case 'NVARCHAR2':
+ case 'NVARCHAR':
+ if (isset($this) && $len <= $this->blobSize) return 'C2';
+ return 'X2';
+
+ case 'NCLOB':
+ case 'CLOB':
+ return 'XL';
+
+ case 'LONG RAW':
+ case 'LONG VARBINARY':
+ case 'BLOB':
+ return 'B';
+
+ case 'DATE':
+ return 'T';
+
+ case 'INT':
+ case 'SMALLINT':
+ case 'INTEGER':
+ return 'I';
+
+ default:
+ return 'N';
+ }
+ }
+
+ function ActualType($meta)
+ {
+ switch($meta) {
+ case 'C': return 'VARCHAR';
+ case 'X': return 'VARCHAR(4000)';
+ case 'XL': return 'CLOB';
+
+ case 'C2': return 'NVARCHAR';
+ case 'X2': return 'NVARCHAR(2000)';
+
+ case 'B': return 'BLOB';
+
+ case 'D':
+ case 'T': return 'DATE';
+ case 'L': return 'DECIMAL(1)';
+ case 'I1': return 'DECIMAL(3)';
+ case 'I2': return 'DECIMAL(5)';
+ case 'I':
+ case 'I4': return 'DECIMAL(10)';
+
+ case 'I8': return 'DECIMAL(20)';
+ case 'F': return 'DECIMAL';
+ case 'N': return 'DECIMAL';
+ default:
+ return $meta;
+ }
+ }
+
+ function CreateDatabase($dbname, $options=false)
+ {
+ $options = $this->_Options($options);
+ $password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger';
+ $tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : '';
+ $sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace;
+ $sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname";
+
+ return $sql;
+ }
+
+ function AddColumnSQL($tabname, $flds)
+ {
+ $f = array();
+ list($lines,$pkey) = $this->_GenFields($flds);
+ $s = "ALTER TABLE $tabname ADD (";
+ foreach($lines as $v) {
+ $f[] = "\n $v";
+ }
+
+ $s .= implode(',',$f).')';
+ $sql[] = $s;
+ return $sql;
+ }
+
+ function AlterColumnSQL($tabname, $flds)
+ {
+ $f = array();
+ list($lines,$pkey) = $this->_GenFields($flds);
+ $s = "ALTER TABLE $tabname MODIFY(";
+ foreach($lines as $v) {
+ $f[] = "\n $v";
+ }
+ $s .= implode(',',$f).')';
+ $sql[] = $s;
+ return $sql;
+ }
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ if (!is_array($flds)) $flds = explode(',',$flds);
+ $sql = array();
+ $s = "ALTER TABLE $tabname DROP(";
+ $s .= implode(',',$flds).') CASCADE COSTRAINTS';
+ $sql[] = $s;
+ return $sql;
+ }
+
+ function _DropAutoIncrement($t)
+ {
+ if (strpos($t,'.') !== false) {
+ $tarr = explode('.',$t);
+ return "drop sequence ".$tarr[0].".seq_".$tarr[1];
+ }
+ return "drop sequence seq_".$t;
+ }
+
+ // return string must begin with space
+ function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
+ {
+ $suffix = '';
+
+ if ($fdefault == "''" && $fnotnull) {// this is null in oracle
+ $fnotnull = false;
+ if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle");
+ }
+
+ if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
+ if ($fnotnull) $suffix .= ' NOT NULL';
+
+ if ($fautoinc) $this->seqField = $fname;
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+
+ return $suffix;
+ }
+
+/*
+CREATE or replace TRIGGER jaddress_insert
+before insert on jaddress
+for each row
+begin
+select seqaddress.nextval into :new.A_ID from dual;
+end;
+*/
+ function _Triggers($tabname,$tableoptions)
+ {
+ if (!$this->seqField) return array();
+
+ if ($this->schema) {
+ $t = strpos($tabname,'.');
+ if ($t !== false) $tab = substr($tabname,$t+1);
+ else $tab = $tabname;
+ $seqname = $this->schema.'.'.$this->seqPrefix.$tab;
+ $trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab;
+ } else {
+ $seqname = $this->seqPrefix.$tabname;
+ $trigname = $this->trigPrefix.$seqname;
+ }
+ if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname";
+ $seqCache = '';
+ if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];}
+ $seqIncr = '';
+ if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];}
+ $seqStart = '';
+ if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];}
+ $sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache";
+ $sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;";
+
+ $this->seqField = false;
+ return $sql;
+ }
+
+ /*
+ CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
+ [table_options] [select_statement]
+ create_definition:
+ col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
+ [PRIMARY KEY] [reference_definition]
+ or PRIMARY KEY (index_col_name,...)
+ or KEY [index_name] (index_col_name,...)
+ or INDEX [index_name] (index_col_name,...)
+ or UNIQUE [INDEX] [index_name] (index_col_name,...)
+ or FULLTEXT [INDEX] [index_name] (index_col_name,...)
+ or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
+ [reference_definition]
+ or CHECK (expr)
+ */
+
+
+
+ function _IndexSQL($idxname, $tabname, $flds,$idxoptions)
+ {
+ $sql = array();
+
+ if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
+ $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
+ if ( isset($idxoptions['DROP']) )
+ return $sql;
+ }
+
+ if ( empty ($flds) ) {
+ return $sql;
+ }
+
+ if (isset($idxoptions['BITMAP'])) {
+ $unique = ' BITMAP';
+ } elseif (isset($idxoptions['UNIQUE'])) {
+ $unique = ' UNIQUE';
+ } else {
+ $unique = '';
+ }
+
+ if ( is_array($flds) )
+ $flds = implode(', ',$flds);
+ $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
+
+ if ( isset($idxoptions[$this->upperName]) )
+ $s .= $idxoptions[$this->upperName];
+
+ if (isset($idxoptions['oci8']))
+ $s .= $idxoptions['oci8'];
+
+
+ $sql[] = $s;
+
+ return $sql;
+ }
+
+ function GetCommentSQL($table,$col)
+ {
+ $table = $this->connection->qstr($table);
+ $col = $this->connection->qstr($col);
+ return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col";
+ }
+
+ function SetCommentSQL($table,$col,$cmt)
+ {
+ $cmt = $this->connection->qstr($cmt);
+ return "COMMENT ON COLUMN $table.$col IS $cmt";
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-postgres.inc.php b/lib/adodb/datadict/datadict-postgres.inc.php
index 9005ac5594..2243a6b573 100644
--- a/lib/adodb/datadict/datadict-postgres.inc.php
+++ b/lib/adodb/datadict/datadict-postgres.inc.php
@@ -1,214 +1,217 @@
-type;
- $len = $fieldobj->max_length;
- }
- switch (strtoupper($t)) {
- case 'INTERVAL':
- case 'CHAR':
- case 'CHARACTER':
- case 'VARCHAR':
- case 'NAME':
- case 'BPCHAR':
- if ($len <= $this->blobSize) return 'C';
-
- case 'TEXT':
- return 'X';
-
- case 'IMAGE': // user defined type
- case 'BLOB': // user defined type
- case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
- case 'VARBIT':
- case 'BYTEA':
- return 'B';
-
- case 'BOOL':
- case 'BOOLEAN':
- return 'L';
-
- case 'DATE':
- return 'D';
-
- case 'TIME':
- case 'DATETIME':
- case 'TIMESTAMP':
- case 'TIMESTAMPTZ':
- return 'T';
-
- case 'INTEGER': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I' : 'R';
- case 'SMALLINT':
- case 'INT2': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I2' : 'R';
- case 'INT4': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I4' : 'R';
- case 'BIGINT':
- case 'INT8': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I8' : 'R';
-
- case 'OID':
- case 'SERIAL':
- return 'R';
-
- case 'FLOAT4':
- case 'FLOAT8':
- case 'DOUBLE PRECISION':
- case 'REAL':
- return 'F';
-
- default:
- return 'N';
- }
- }
-
- function ActualType($meta)
- {
- switch($meta) {
- case 'C': return 'VARCHAR';
- case 'XL':
- case 'X': return 'TEXT';
-
- case 'C2': return 'VARCHAR';
- case 'X2': return 'TEXT';
-
- case 'B': return 'BYTEA';
-
- case 'D': return 'DATE';
- case 'T': return 'TIMESTAMP';
-
- case 'L': return 'SMALLINT';
- case 'I': return 'INTEGER';
- case 'I1': return 'SMALLINT';
- case 'I2': return 'INT2';
- case 'I4': return 'INT4';
- case 'I8': return 'INT8';
-
- case 'F': return 'FLOAT8';
- case 'N': return 'NUMERIC';
- default:
- return $meta;
- }
- }
-
- /* The following does not work in Pg 6.0 - does anyone want to contribute code?
-
- //"ALTER TABLE table ALTER COLUMN column SET DEFAULT mydef" and
- //"ALTER TABLE table ALTER COLUMN column DROP DEFAULT mydef"
- //"ALTER TABLE table ALTER COLUMN column SET NOT NULL" and
- //"ALTER TABLE table ALTER COLUMN column DROP NOT NULL"*/
- function AlterColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported for PostgreSQL");
- return array();
- }
-
-
- function DropColumnSQL($tabname, $flds)
- {
- if ($this->debug) ADOConnection::outp("DropColumnSQL only works with PostgreSQL 7.3+");
- return ADODB_DataDict::DropColumnSQL($tabname, $flds)."/* only works for PostgreSQL 7.3+ */";
- }
-
- // return string must begin with space
- function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
- {
- if ($fautoinc) {
- $ftype = 'SERIAL';
- return '';
- }
- $suffix = '';
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fnotnull) $suffix .= ' NOT NULL';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
- function _DropAutoIncrement($t)
- {
- return "drop sequence ".$t."_m_id_seq";
- }
-
- /*
- CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
- { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
- | table_constraint } [, ... ]
- )
- [ INHERITS ( parent_table [, ... ] ) ]
- [ WITH OIDS | WITHOUT OIDS ]
- where column_constraint is:
- [ CONSTRAINT constraint_name ]
- { NOT NULL | NULL | UNIQUE | PRIMARY KEY |
- CHECK (expression) |
- REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]
- [ ON DELETE action ] [ ON UPDATE action ] }
- [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
- and table_constraint is:
- [ CONSTRAINT constraint_name ]
- { UNIQUE ( column_name [, ... ] ) |
- PRIMARY KEY ( column_name [, ... ] ) |
- CHECK ( expression ) |
- FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
- [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] }
- [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
- */
-
-
- /*
- CREATE [ UNIQUE ] INDEX index_name ON table
-[ USING acc_method ] ( column [ ops_name ] [, ...] )
-[ WHERE predicate ]
-CREATE [ UNIQUE ] INDEX index_name ON table
-[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] )
-[ WHERE predicate ]
- */
- function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
- {
- $sql = array();
-
- if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
- $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
- if ( isset($idxoptions['DROP']) )
- return $sql;
- }
-
- if ( empty ($flds) ) {
- return $sql;
- }
-
- $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
-
- $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
-
- if (isset($idxoptions['HASH']))
- $s .= 'USING HASH ';
-
- if ( isset($idxoptions[$this->upperName]) )
- $s .= $idxoptions[$this->upperName];
-
- if ( is_array($flds) )
- $flds = implode(', ',$flds);
- $s .= '(' . $flds . ')';
- $sql[] = $s;
-
- return $sql;
- }
-}
+type;
+ $len = $fieldobj->max_length;
+ }
+ switch (strtoupper($t)) {
+ case 'INTERVAL':
+ case 'CHAR':
+ case 'CHARACTER':
+ case 'VARCHAR':
+ case 'NAME':
+ case 'BPCHAR':
+ if ($len <= $this->blobSize) return 'C';
+
+ case 'TEXT':
+ return 'X';
+
+ case 'IMAGE': // user defined type
+ case 'BLOB': // user defined type
+ case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
+ case 'VARBIT':
+ case 'BYTEA':
+ return 'B';
+
+ case 'BOOL':
+ case 'BOOLEAN':
+ return 'L';
+
+ case 'DATE':
+ return 'D';
+
+ case 'TIME':
+ case 'DATETIME':
+ case 'TIMESTAMP':
+ case 'TIMESTAMPTZ':
+ return 'T';
+
+ case 'INTEGER': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I' : 'R';
+ case 'SMALLINT':
+ case 'INT2': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I2' : 'R';
+ case 'INT4': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I4' : 'R';
+ case 'BIGINT':
+ case 'INT8': return (empty($fieldobj->primary_key) && empty($fieldobj->unique))? 'I8' : 'R';
+
+ case 'OID':
+ case 'SERIAL':
+ return 'R';
+
+ case 'FLOAT4':
+ case 'FLOAT8':
+ case 'DOUBLE PRECISION':
+ case 'REAL':
+ return 'F';
+
+ default:
+ return 'N';
+ }
+ }
+
+ function ActualType($meta)
+ {
+ switch($meta) {
+ case 'C': return 'VARCHAR';
+ case 'XL':
+ case 'X': return 'TEXT';
+
+ case 'C2': return 'VARCHAR';
+ case 'X2': return 'TEXT';
+
+ case 'B': return 'BYTEA';
+
+ case 'D': return 'DATE';
+ case 'T': return 'TIMESTAMP';
+
+ case 'L': return 'SMALLINT';
+ case 'I': return 'INTEGER';
+ case 'I1': return 'SMALLINT';
+ case 'I2': return 'INT2';
+ case 'I4': return 'INT4';
+ case 'I8': return 'INT8';
+
+ case 'F': return 'FLOAT8';
+ case 'N': return 'NUMERIC';
+ default:
+ return $meta;
+ }
+ }
+
+ /* The following does not work in Pg 6.0 - does anyone want to contribute code?
+
+ //"ALTER TABLE table ALTER COLUMN column SET DEFAULT mydef" and
+ //"ALTER TABLE table ALTER COLUMN column DROP DEFAULT mydef"
+ //"ALTER TABLE table ALTER COLUMN column SET NOT NULL" and
+ //"ALTER TABLE table ALTER COLUMN column DROP NOT NULL"*/
+ function AlterColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("AlterColumnSQL not supported for PostgreSQL");
+ return array();
+ }
+
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ if ($this->debug) ADOConnection::outp("DropColumnSQL only works with PostgreSQL 7.3+");
+ return ADODB_DataDict::DropColumnSQL($tabname, $flds)."/* only works for PostgreSQL 7.3+ */";
+ }
+
+ // return string must begin with space
+ function _CreateSuffix($fname, &$ftype, $fnotnull,$fdefault,$fautoinc,$fconstraint)
+ {
+ if ($fautoinc) {
+ $ftype = 'SERIAL';
+ return '';
+ }
+ $suffix = '';
+ if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
+ if ($fnotnull) $suffix .= ' NOT NULL';
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+ return $suffix;
+ }
+
+ function _DropAutoIncrement($t)
+ {
+ return "drop sequence ".$t."_m_id_seq";
+ }
+
+ /*
+ CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
+ { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
+ | table_constraint } [, ... ]
+ )
+ [ INHERITS ( parent_table [, ... ] ) ]
+ [ WITH OIDS | WITHOUT OIDS ]
+ where column_constraint is:
+ [ CONSTRAINT constraint_name ]
+ { NOT NULL | NULL | UNIQUE | PRIMARY KEY |
+ CHECK (expression) |
+ REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL ]
+ [ ON DELETE action ] [ ON UPDATE action ] }
+ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
+ and table_constraint is:
+ [ CONSTRAINT constraint_name ]
+ { UNIQUE ( column_name [, ... ] ) |
+ PRIMARY KEY ( column_name [, ... ] ) |
+ CHECK ( expression ) |
+ FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
+ [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] }
+ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
+ */
+
+
+ /*
+ CREATE [ UNIQUE ] INDEX index_name ON table
+[ USING acc_method ] ( column [ ops_name ] [, ...] )
+[ WHERE predicate ]
+CREATE [ UNIQUE ] INDEX index_name ON table
+[ USING acc_method ] ( func_name( column [, ... ]) [ ops_name ] )
+[ WHERE predicate ]
+ */
+ function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
+ {
+ $sql = array();
+
+ if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
+ $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
+ if ( isset($idxoptions['DROP']) )
+ return $sql;
+ }
+
+ if ( empty ($flds) ) {
+ return $sql;
+ }
+
+ $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
+
+ $s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' ';
+
+ if (isset($idxoptions['HASH']))
+ $s .= 'USING HASH ';
+
+ if ( isset($idxoptions[$this->upperName]) )
+ $s .= $idxoptions[$this->upperName];
+
+ if ( is_array($flds) )
+ $flds = implode(', ',$flds);
+ $s .= '(' . $flds . ')';
+ $sql[] = $s;
+
+ return $sql;
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/datadict/datadict-sybase.inc.php b/lib/adodb/datadict/datadict-sybase.inc.php
index 50c7494dd7..7ab2d36084 100644
--- a/lib/adodb/datadict/datadict-sybase.inc.php
+++ b/lib/adodb/datadict/datadict-sybase.inc.php
@@ -1,225 +1,228 @@
-type;
- $len = $fieldobj->max_length;
- }
-
- $len = -1; // mysql max_length is not accurate
- switch (strtoupper($t)) {
-
- case 'INT':
- case 'INTEGER': return 'I';
- case 'BIT':
- case 'TINYINT': return 'I1';
- case 'SMALLINT': return 'I2';
- case 'BIGINT': return 'I8';
-
- case 'REAL':
- case 'FLOAT': return 'F';
- default: return parent::MetaType($t,$len,$fieldobj);
- }
- }
-
- function ActualType($meta)
- {
- switch(strtoupper($meta)) {
- case 'C': return 'VARCHAR';
- case 'XL':
- case 'X': return 'TEXT';
-
- case 'C2': return 'NVARCHAR';
- case 'X2': return 'NTEXT';
-
- case 'B': return 'IMAGE';
-
- case 'D': return 'DATETIME';
- case 'T': return 'DATETIME';
- case 'L': return 'BIT';
-
- case 'I': return 'INT';
- case 'I1': return 'TINYINT';
- case 'I2': return 'SMALLINT';
- case 'I4': return 'INT';
- case 'I8': return 'BIGINT';
-
- case 'F': return 'REAL';
- case 'N': return 'NUMERIC';
- default:
- return $meta;
- }
- }
-
-
- function AddColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- $f = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- $s = "ALTER TABLE $tabname $this->addCol";
- foreach($lines as $v) {
- $f[] = "\n $v";
- }
- $s .= implode(',',$f);
- $sql[] = $s;
- return $sql;
- }
-
- function AlterColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- $sql = array();
- list($lines,$pkey) = $this->_GenFields($flds);
- foreach($lines as $v) {
- $sql[] = "ALTER TABLE $tabname $this->alterCol $v";
- }
-
- return $sql;
- }
-
- function DropColumnSQL($tabname, $flds)
- {
- $tabname = $this->TableName ($tabname);
- if (!is_array($flds)) $flds = explode(',',$flds);
- $f = array();
- $s = "ALTER TABLE $tabname";
- foreach($flds as $v) {
- $f[] = "\n$this->dropCol $v";
- }
- $s .= implode(',',$f);
- $sql[] = $s;
- return $sql;
- }
-
- // return string must begin with space
- function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
- {
- $suffix = '';
- if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
- if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT';
- if ($fnotnull) $suffix .= ' NOT NULL';
- else if ($suffix == '') $suffix .= ' NULL';
- if ($fconstraint) $suffix .= ' '.$fconstraint;
- return $suffix;
- }
-
- /*
-CREATE TABLE
- [ database_name.[ owner ] . | owner. ] table_name
- ( { < column_definition >
- | column_name AS computed_column_expression
- | < table_constraint > ::= [ CONSTRAINT constraint_name ] }
-
- | [ { PRIMARY KEY | UNIQUE } [ ,...n ]
- )
-
-[ ON { filegroup | DEFAULT } ]
-[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
-
-< column_definition > ::= { column_name data_type }
- [ COLLATE < collation_name > ]
- [ [ DEFAULT constant_expression ]
- | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
- ]
- [ ROWGUIDCOL]
- [ < column_constraint > ] [ ...n ]
-
-< column_constraint > ::= [ CONSTRAINT constraint_name ]
- { [ NULL | NOT NULL ]
- | [ { PRIMARY KEY | UNIQUE }
- [ CLUSTERED | NONCLUSTERED ]
- [ WITH FILLFACTOR = fillfactor ]
- [ON {filegroup | DEFAULT} ] ]
- ]
- | [ [ FOREIGN KEY ]
- REFERENCES ref_table [ ( ref_column ) ]
- [ ON DELETE { CASCADE | NO ACTION } ]
- [ ON UPDATE { CASCADE | NO ACTION } ]
- [ NOT FOR REPLICATION ]
- ]
- | CHECK [ NOT FOR REPLICATION ]
- ( logical_expression )
- }
-
-< table_constraint > ::= [ CONSTRAINT constraint_name ]
- { [ { PRIMARY KEY | UNIQUE }
- [ CLUSTERED | NONCLUSTERED ]
- { ( column [ ASC | DESC ] [ ,...n ] ) }
- [ WITH FILLFACTOR = fillfactor ]
- [ ON { filegroup | DEFAULT } ]
- ]
- | FOREIGN KEY
- [ ( column [ ,...n ] ) ]
- REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
- [ ON DELETE { CASCADE | NO ACTION } ]
- [ ON UPDATE { CASCADE | NO ACTION } ]
- [ NOT FOR REPLICATION ]
- | CHECK [ NOT FOR REPLICATION ]
- ( search_conditions )
- }
-
-
- */
-
- /*
- CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
- ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
- [ WITH < index_option > [ ,...n] ]
- [ ON filegroup ]
- < index_option > :: =
- { PAD_INDEX |
- FILLFACTOR = fillfactor |
- IGNORE_DUP_KEY |
- DROP_EXISTING |
- STATISTICS_NORECOMPUTE |
- SORT_IN_TEMPDB
- }
-*/
- function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
- {
- $sql = array();
-
- if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
- $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
- if ( isset($idxoptions['DROP']) )
- return $sql;
- }
-
- if ( empty ($flds) ) {
- return $sql;
- }
-
- $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
- $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
-
- if ( is_array($flds) )
- $flds = implode(', ',$flds);
- $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
-
- if ( isset($idxoptions[$this->upperName]) )
- $s .= $idxoptions[$this->upperName];
-
- $sql[] = $s;
-
- return $sql;
- }
-}
+type;
+ $len = $fieldobj->max_length;
+ }
+
+ $len = -1; // mysql max_length is not accurate
+ switch (strtoupper($t)) {
+
+ case 'INT':
+ case 'INTEGER': return 'I';
+ case 'BIT':
+ case 'TINYINT': return 'I1';
+ case 'SMALLINT': return 'I2';
+ case 'BIGINT': return 'I8';
+
+ case 'REAL':
+ case 'FLOAT': return 'F';
+ default: return parent::MetaType($t,$len,$fieldobj);
+ }
+ }
+
+ function ActualType($meta)
+ {
+ switch(strtoupper($meta)) {
+ case 'C': return 'VARCHAR';
+ case 'XL':
+ case 'X': return 'TEXT';
+
+ case 'C2': return 'NVARCHAR';
+ case 'X2': return 'NTEXT';
+
+ case 'B': return 'IMAGE';
+
+ case 'D': return 'DATETIME';
+ case 'T': return 'DATETIME';
+ case 'L': return 'BIT';
+
+ case 'I': return 'INT';
+ case 'I1': return 'TINYINT';
+ case 'I2': return 'SMALLINT';
+ case 'I4': return 'INT';
+ case 'I8': return 'BIGINT';
+
+ case 'F': return 'REAL';
+ case 'N': return 'NUMERIC';
+ default:
+ return $meta;
+ }
+ }
+
+
+ function AddColumnSQL($tabname, $flds)
+ {
+ $tabname = $this->TableName ($tabname);
+ $f = array();
+ list($lines,$pkey) = $this->_GenFields($flds);
+ $s = "ALTER TABLE $tabname $this->addCol";
+ foreach($lines as $v) {
+ $f[] = "\n $v";
+ }
+ $s .= implode(',',$f);
+ $sql[] = $s;
+ return $sql;
+ }
+
+ function AlterColumnSQL($tabname, $flds)
+ {
+ $tabname = $this->TableName ($tabname);
+ $sql = array();
+ list($lines,$pkey) = $this->_GenFields($flds);
+ foreach($lines as $v) {
+ $sql[] = "ALTER TABLE $tabname $this->alterCol $v";
+ }
+
+ return $sql;
+ }
+
+ function DropColumnSQL($tabname, $flds)
+ {
+ $tabname = $this->TableName ($tabname);
+ if (!is_array($flds)) $flds = explode(',',$flds);
+ $f = array();
+ $s = "ALTER TABLE $tabname";
+ foreach($flds as $v) {
+ $f[] = "\n$this->dropCol $v";
+ }
+ $s .= implode(',',$f);
+ $sql[] = $s;
+ return $sql;
+ }
+
+ // return string must begin with space
+ function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint)
+ {
+ $suffix = '';
+ if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
+ if ($fautoinc) $suffix .= ' DEFAULT AUTOINCREMENT';
+ if ($fnotnull) $suffix .= ' NOT NULL';
+ else if ($suffix == '') $suffix .= ' NULL';
+ if ($fconstraint) $suffix .= ' '.$fconstraint;
+ return $suffix;
+ }
+
+ /*
+CREATE TABLE
+ [ database_name.[ owner ] . | owner. ] table_name
+ ( { < column_definition >
+ | column_name AS computed_column_expression
+ | < table_constraint > ::= [ CONSTRAINT constraint_name ] }
+
+ | [ { PRIMARY KEY | UNIQUE } [ ,...n ]
+ )
+
+[ ON { filegroup | DEFAULT } ]
+[ TEXTIMAGE_ON { filegroup | DEFAULT } ]
+
+< column_definition > ::= { column_name data_type }
+ [ COLLATE < collation_name > ]
+ [ [ DEFAULT constant_expression ]
+ | [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
+ ]
+ [ ROWGUIDCOL]
+ [ < column_constraint > ] [ ...n ]
+
+< column_constraint > ::= [ CONSTRAINT constraint_name ]
+ { [ NULL | NOT NULL ]
+ | [ { PRIMARY KEY | UNIQUE }
+ [ CLUSTERED | NONCLUSTERED ]
+ [ WITH FILLFACTOR = fillfactor ]
+ [ON {filegroup | DEFAULT} ] ]
+ ]
+ | [ [ FOREIGN KEY ]
+ REFERENCES ref_table [ ( ref_column ) ]
+ [ ON DELETE { CASCADE | NO ACTION } ]
+ [ ON UPDATE { CASCADE | NO ACTION } ]
+ [ NOT FOR REPLICATION ]
+ ]
+ | CHECK [ NOT FOR REPLICATION ]
+ ( logical_expression )
+ }
+
+< table_constraint > ::= [ CONSTRAINT constraint_name ]
+ { [ { PRIMARY KEY | UNIQUE }
+ [ CLUSTERED | NONCLUSTERED ]
+ { ( column [ ASC | DESC ] [ ,...n ] ) }
+ [ WITH FILLFACTOR = fillfactor ]
+ [ ON { filegroup | DEFAULT } ]
+ ]
+ | FOREIGN KEY
+ [ ( column [ ,...n ] ) ]
+ REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
+ [ ON DELETE { CASCADE | NO ACTION } ]
+ [ ON UPDATE { CASCADE | NO ACTION } ]
+ [ NOT FOR REPLICATION ]
+ | CHECK [ NOT FOR REPLICATION ]
+ ( search_conditions )
+ }
+
+
+ */
+
+ /*
+ CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
+ ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
+ [ WITH < index_option > [ ,...n] ]
+ [ ON filegroup ]
+ < index_option > :: =
+ { PAD_INDEX |
+ FILLFACTOR = fillfactor |
+ IGNORE_DUP_KEY |
+ DROP_EXISTING |
+ STATISTICS_NORECOMPUTE |
+ SORT_IN_TEMPDB
+ }
+*/
+ function _IndexSQL($idxname, $tabname, $flds, $idxoptions)
+ {
+ $sql = array();
+
+ if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
+ $sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
+ if ( isset($idxoptions['DROP']) )
+ return $sql;
+ }
+
+ if ( empty ($flds) ) {
+ return $sql;
+ }
+
+ $unique = isset($idxoptions['UNIQUE']) ? ' UNIQUE' : '';
+ $clustered = isset($idxoptions['CLUSTERED']) ? ' CLUSTERED' : '';
+
+ if ( is_array($flds) )
+ $flds = implode(', ',$flds);
+ $s = 'CREATE' . $unique . $clustered . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
+
+ if ( isset($idxoptions[$this->upperName]) )
+ $s .= $idxoptions[$this->upperName];
+
+ $sql[] = $s;
+
+ return $sql;
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-access.inc.php b/lib/adodb/drivers/adodb-access.inc.php
index 9e418b7fde..086a9e8832 100644
--- a/lib/adodb/drivers/adodb-access.inc.php
+++ b/lib/adodb/drivers/adodb-access.inc.php
@@ -1,79 +1,86 @@
-ADODB_odbc();
- }
-
- function BeginTrans() { return false;}
-
- function IfNull( $field, $ifNull )
- {
- return " IIF(IsNull($field), $ifNull, $field) "; // if Access
- }
-/*
- function &MetaTables()
- {
- global $ADODB_FETCH_MODE;
-
- $savem = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $qid = odbc_tables($this->_connectionID);
- $rs = new ADORecordSet_odbc($qid);
- $ADODB_FETCH_MODE = $savem;
- if (!$rs) return false;
-
- $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
-
- $arr = &$rs->GetArray();
- //print_pre($arr);
- $arr2 = array();
- for ($i=0; $i < sizeof($arr); $i++) {
- if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE')
- $arr2[] = $arr[$i][2];
- }
- return $arr2;
- }*/
-}
-
-
-class ADORecordSet_access extends ADORecordSet_odbc {
-
- var $databaseType = "access";
-
- function ADORecordSet_access($id,$mode=false)
- {
- return $this->ADORecordSet_odbc($id,$mode);
- }
-}// class
-}
+ADODB_odbc();
+ }
+
+ function Time()
+ {
+ return time();
+ }
+
+ function BeginTrans() { return false;}
+
+ function IfNull( $field, $ifNull )
+ {
+ return " IIF(IsNull($field), $ifNull, $field) "; // if Access
+ }
+/*
+ function &MetaTables()
+ {
+ global $ADODB_FETCH_MODE;
+
+ $savem = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ $qid = odbc_tables($this->_connectionID);
+ $rs = new ADORecordSet_odbc($qid);
+ $ADODB_FETCH_MODE = $savem;
+ if (!$rs) return false;
+
+ $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
+
+ $arr = &$rs->GetArray();
+ //print_pre($arr);
+ $arr2 = array();
+ for ($i=0; $i < sizeof($arr); $i++) {
+ if ($arr[$i][2] && $arr[$i][3] != 'SYSTEM TABLE')
+ $arr2[] = $arr[$i][2];
+ }
+ return $arr2;
+ }*/
+}
+
+
+class ADORecordSet_access extends ADORecordSet_odbc {
+
+ var $databaseType = "access";
+
+ function ADORecordSet_access($id,$mode=false)
+ {
+ return $this->ADORecordSet_odbc($id,$mode);
+ }
+}// class
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ado.inc.php b/lib/adodb/drivers/adodb-ado.inc.php
index 68ea5056ab..07e28d4e39 100644
--- a/lib/adodb/drivers/adodb-ado.inc.php
+++ b/lib/adodb/drivers/adodb-ado.inc.php
@@ -1,613 +1,620 @@
-_affectedRows = new VARIANT;
- }
-
- function ServerInfo()
- {
- if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
- return array('description' => $desc, 'version' => '');
- }
-
- function _affectedrows()
- {
- return $this->_affectedRows->value;
- }
-
- // you can also pass a connection string like this:
- //
- // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
- function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')
- {
- $u = 'UID';
- $p = 'PWD';
-
- if (!empty($this->charPage))
- $dbc = new COM('ADODB.Connection',null,$this->charPage);
- else
- $dbc = new COM('ADODB.Connection');
-
- if (! $dbc) return false;
-
- /* special support if provider is mssql or access */
- if ($argProvider=='mssql') {
- $u = 'User Id'; //User parameter name for OLEDB
- $p = 'Password';
- $argProvider = "SQLOLEDB"; // SQL Server Provider
-
- // not yet
- //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
-
- //use trusted conection for SQL if username not specified
- if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
- } else if ($argProvider=='access')
- $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
-
- if ($argProvider) $dbc->Provider = $argProvider;
-
- if ($argUsername) $argHostname .= ";$u=$argUsername";
- if ($argPassword)$argHostname .= ";$p=$argPassword";
-
- if ($this->debug) ADOConnection::outp( "Host=".$argHostname."
\n version=$dbc->version");
- // @ added below for php 4.0.1 and earlier
- @$dbc->Open((string) $argHostname);
-
- $this->_connectionID = $dbc;
-
- $dbc->CursorLocation = $this->_cursor_location;
- return $dbc->State > 0;
- }
-
- // returns true or false
- function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
- {
- return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
- }
-
-/*
- adSchemaCatalogs = 1,
- adSchemaCharacterSets = 2,
- adSchemaCollations = 3,
- adSchemaColumns = 4,
- adSchemaCheckConstraints = 5,
- adSchemaConstraintColumnUsage = 6,
- adSchemaConstraintTableUsage = 7,
- adSchemaKeyColumnUsage = 8,
- adSchemaReferentialContraints = 9,
- adSchemaTableConstraints = 10,
- adSchemaColumnsDomainUsage = 11,
- adSchemaIndexes = 12,
- adSchemaColumnPrivileges = 13,
- adSchemaTablePrivileges = 14,
- adSchemaUsagePrivileges = 15,
- adSchemaProcedures = 16,
- adSchemaSchemata = 17,
- adSchemaSQLLanguages = 18,
- adSchemaStatistics = 19,
- adSchemaTables = 20,
- adSchemaTranslations = 21,
- adSchemaProviderTypes = 22,
- adSchemaViews = 23,
- adSchemaViewColumnUsage = 24,
- adSchemaViewTableUsage = 25,
- adSchemaProcedureParameters = 26,
- adSchemaForeignKeys = 27,
- adSchemaPrimaryKeys = 28,
- adSchemaProcedureColumns = 29,
- adSchemaDBInfoKeywords = 30,
- adSchemaDBInfoLiterals = 31,
- adSchemaCubes = 32,
- adSchemaDimensions = 33,
- adSchemaHierarchies = 34,
- adSchemaLevels = 35,
- adSchemaMeasures = 36,
- adSchemaProperties = 37,
- adSchemaMembers = 38
-
-*/
-
- function &MetaTables()
- {
- $arr= array();
- $dbc = $this->_connectionID;
-
- $adors=@$dbc->OpenSchema(20);//tables
- if ($adors){
- $f = $adors->Fields(2);//table/view name
- $t = $adors->Fields(3);//table type
- while (!$adors->EOF){
- $tt=substr($t->value,0,6);
- if ($tt!='SYSTEM' && $tt !='ACCESS')
- $arr[]=$f->value;
- //print $f->value . ' ' . $t->value.'
';
- $adors->MoveNext();
- }
- $adors->Close();
- }
-
- return $arr;
- }
-
- function &MetaColumns($table)
- {
- $table = strtoupper($table);
- $arr= array();
- $dbc = $this->_connectionID;
-
- $adors=@$dbc->OpenSchema(4);//tables
-
- if ($adors){
- $t = $adors->Fields(2);//table/view name
- while (!$adors->EOF){
-
-
- if (strtoupper($t->Value) == $table) {
-
- $fld = new ADOFieldObject();
- $c = $adors->Fields(3);
- $fld->name = $c->Value;
- $fld->type = 'CHAR'; // cannot discover type in ADO!
- $fld->max_length = -1;
- $arr[strtoupper($fld->name)]=$fld;
- }
-
- $adors->MoveNext();
- }
- $adors->Close();
- }
-
- return $arr;
- }
-
-
-
-
- /* returns queryID or false */
- function &_query($sql,$inputarr=false)
- {
-
- $dbc = $this->_connectionID;
-
- // return rs
- if ($inputarr) {
-
- if (!empty($this->charPage))
- $oCmd = new COM('ADODB.Command',null,$this->charPage);
- else
- $oCmd = new COM('ADODB.Command');
- $oCmd->ActiveConnection = $dbc;
- $oCmd->CommandText = $sql;
- $oCmd->CommandType = 1;
-
- foreach($inputarr as $val) {
- // name, type, direction 1 = input, len,
- $this->adoParameterType = 130;
- $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
- //print $p->Type.' '.$p->value;
- $oCmd->Parameters->Append($p);
- }
- $p = false;
- $rs = $oCmd->Execute();
- $e = $dbc->Errors;
- if ($dbc->Errors->Count > 0) return false;
- return $rs;
- }
-
- $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
- /*
- $rs = new COM('ADODB.Recordset');
- if ($rs) {
- $rs->Open ($sql, $dbc, $this->_cursor_type,$this->_lock_type, $this->_execute_option);
- }
- */
- if ($dbc->Errors->Count > 0) return false;
- if (! $rs) return false;
-
- if ($rs->State == 0) return true; // 0 = adStateClosed means no records returned
- return $rs;
- }
-
-
- function BeginTrans()
- {
- if ($this->transOff) return true;
-
- if (isset($this->_thisTransactions))
- if (!$this->_thisTransactions) return false;
- else {
- $o = $this->_connectionID->Properties("Transaction DDL");
- $this->_thisTransactions = $o ? true : false;
- if (!$o) return false;
- }
- @$this->_connectionID->BeginTrans();
- $this->transCnt += 1;
- return true;
- }
- function CommitTrans($ok=true)
- {
- if (!$ok) return $this->RollbackTrans();
- if ($this->transOff) return true;
-
- @$this->_connectionID->CommitTrans();
- if ($this->transCnt) @$this->transCnt -= 1;
- return true;
- }
- function RollbackTrans() {
- if ($this->transOff) return true;
- @$this->_connectionID->RollbackTrans();
- if ($this->transCnt) @$this->transCnt -= 1;
- return true;
- }
-
- /* Returns: the last error message from previous database operation */
-
- function ErrorMsg()
- {
- $errc = $this->_connectionID->Errors;
- if ($errc->Count == 0) return '';
- $err = $errc->Item($errc->Count-1);
- return $err->Description;
- }
-
- function ErrorNo()
- {
- $errc = $this->_connectionID->Errors;
- if ($errc->Count == 0) return 0;
- $err = $errc->Item($errc->Count-1);
- return $err->NativeError;
- }
-
- // returns true or false
- function _close()
- {
- if ($this->_connectionID) $this->_connectionID->Close();
- $this->_connectionID = false;
- return true;
- }
-
-
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordSet_ado extends ADORecordSet {
-
- var $bind = false;
- var $databaseType = "ado";
- var $dataProvider = "ado";
- var $_tarr = false; // caches the types
- var $_flds; // and field objects
- var $canSeek = true;
- var $hideErrors = true;
-
- function ADORecordSet_ado($id,$mode=false)
- {
- if ($mode === false) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- }
- $this->fetchMode = $mode;
- return $this->ADORecordSet($id,$mode);
- }
-
-
- // returns the field object
- function FetchField($fieldOffset = -1) {
- $off=$fieldOffset+1; // offsets begin at 1
-
- $o= new ADOFieldObject();
- $rs = $this->_queryID;
- $f = $rs->Fields($fieldOffset);
- $o->name = $f->Name;
- $t = $f->Type;
- $o->type = $this->MetaType($t);
- $o->max_length = $f->DefinedSize;
- $o->ado_type = $t;
-
-
- //print "off=$off name=$o->name type=$o->type len=$o->max_length
";
- return $o;
- }
-
- /* Use associative array to get fields array */
- function Fields($colname)
- {
- if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
- if (!$this->bind) {
- $this->bind = array();
- for ($i=0; $i < $this->_numOfFields; $i++) {
- $o = $this->FetchField($i);
- $this->bind[strtoupper($o->name)] = $i;
- }
- }
-
- return $this->fields[$this->bind[strtoupper($colname)]];
- }
-
-
- function _initrs()
- {
- $rs = $this->_queryID;
- $this->_numOfRows = $rs->RecordCount;
-
- $f = $rs->Fields;
- $this->_numOfFields = $f->Count;
- }
-
-
- // should only be used to move forward as we normally use forward-only cursors
- function _seek($row)
- {
- $rs = $this->_queryID;
- // absoluteposition doesn't work -- my maths is wrong ?
- // $rs->AbsolutePosition->$row-2;
- // return true;
- if ($this->_currentRow > $row) return false;
- @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
- return true;
- }
-
-/*
- OLEDB types
-
- enum DBTYPEENUM
- { DBTYPE_EMPTY = 0,
- DBTYPE_NULL = 1,
- DBTYPE_I2 = 2,
- DBTYPE_I4 = 3,
- DBTYPE_R4 = 4,
- DBTYPE_R8 = 5,
- DBTYPE_CY = 6,
- DBTYPE_DATE = 7,
- DBTYPE_BSTR = 8,
- DBTYPE_IDISPATCH = 9,
- DBTYPE_ERROR = 10,
- DBTYPE_BOOL = 11,
- DBTYPE_VARIANT = 12,
- DBTYPE_IUNKNOWN = 13,
- DBTYPE_DECIMAL = 14,
- DBTYPE_UI1 = 17,
- DBTYPE_ARRAY = 0x2000,
- DBTYPE_BYREF = 0x4000,
- DBTYPE_I1 = 16,
- DBTYPE_UI2 = 18,
- DBTYPE_UI4 = 19,
- DBTYPE_I8 = 20,
- DBTYPE_UI8 = 21,
- DBTYPE_GUID = 72,
- DBTYPE_VECTOR = 0x1000,
- DBTYPE_RESERVED = 0x8000,
- DBTYPE_BYTES = 128,
- DBTYPE_STR = 129,
- DBTYPE_WSTR = 130,
- DBTYPE_NUMERIC = 131,
- DBTYPE_UDT = 132,
- DBTYPE_DBDATE = 133,
- DBTYPE_DBTIME = 134,
- DBTYPE_DBTIMESTAMP = 135
-
- ADO Types
-
- adEmpty = 0,
- adTinyInt = 16,
- adSmallInt = 2,
- adInteger = 3,
- adBigInt = 20,
- adUnsignedTinyInt = 17,
- adUnsignedSmallInt = 18,
- adUnsignedInt = 19,
- adUnsignedBigInt = 21,
- adSingle = 4,
- adDouble = 5,
- adCurrency = 6,
- adDecimal = 14,
- adNumeric = 131,
- adBoolean = 11,
- adError = 10,
- adUserDefined = 132,
- adVariant = 12,
- adIDispatch = 9,
- adIUnknown = 13,
- adGUID = 72,
- adDate = 7,
- adDBDate = 133,
- adDBTime = 134,
- adDBTimeStamp = 135,
- adBSTR = 8,
- adChar = 129,
- adVarChar = 200,
- adLongVarChar = 201,
- adWChar = 130,
- adVarWChar = 202,
- adLongVarWChar = 203,
- adBinary = 128,
- adVarBinary = 204,
- adLongVarBinary = 205,
- adChapter = 136,
- adFileTime = 64,
- adDBFileTime = 137,
- adPropVariant = 138,
- adVarNumeric = 139
-*/
- function MetaType($t,$len=-1,$fieldobj=false)
- {
- if (is_object($t)) {
- $fieldobj = $t;
- $t = $fieldobj->type;
- $len = $fieldobj->max_length;
- }
-
- if (!is_numeric($t)) return $t;
-
- switch ($t) {
- case 0:
- case 12: // variant
- case 8: // bstr
- case 129: //char
- case 130: //wc
- case 200: // varc
- case 202:// varWC
- case 128: // bin
- case 204: // varBin
- case 72: // guid
- if ($len <= $this->blobSize) return 'C';
-
- case 201:
- case 203:
- return 'X';
- case 128:
- case 204:
- case 205:
- return 'B';
- case 7:
- case 133: return 'D';
-
- case 134:
- case 135: return 'T';
-
- case 11: return 'L';
-
- case 16:// adTinyInt = 16,
- case 2://adSmallInt = 2,
- case 3://adInteger = 3,
- case 4://adBigInt = 20,
- case 17://adUnsignedTinyInt = 17,
- case 18://adUnsignedSmallInt = 18,
- case 19://adUnsignedInt = 19,
- case 20://adUnsignedBigInt = 21,
- return 'I';
- default: return 'N';
- }
- }
-
- // time stamp not supported yet
- function _fetch()
- {
- $rs = $this->_queryID;
- if (!$rs or $rs->EOF) {
- $this->fields = false;
- return false;
- }
- $this->fields = array();
-
- if (!$this->_tarr) {
- $tarr = array();
- $flds = array();
- for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
- $f = $rs->Fields($i);
- $flds[] = $f;
- $tarr[] = $f->Type;
- }
- // bind types and flds only once
- $this->_tarr = $tarr;
- $this->_flds = $flds;
- }
- $t = reset($this->_tarr);
- $f = reset($this->_flds);
-
- if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
- for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
-
- switch($t) {
- case 135: // timestamp
- if (!strlen((string)$f->value)) $this->fields[] = false;
- else $this->fields[] = adodb_date('Y-m-d H:i:s',(float)$f->value);
- break;
- case 133:// A date value (yyyymmdd)
- if ($val = $f->value) {
- $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
- } else
- $this->fields[] = false;
- break;
- case 7: // adDate
- if (!strlen((string)$f->value)) $this->fields[] = false;
- else $this->fields[] = adodb_date('Y-m-d',(float)$f->value);
- break;
- case 1: // null
- $this->fields[] = false;
- break;
- case 6: // currency is not supported properly;
- ADOConnection::outp( ''.$f->Name.': currency type not supported by PHP');
- $this->fields[] = (float) $f->value;
- break;
- default:
- $this->fields[] = $f->value;
- break;
- }
- //print " $f->value $t, ";
- $f = next($this->_flds);
- $t = next($this->_tarr);
- } // for
- if ($this->hideErrors) error_reporting($olde);
- @$rs->MoveNext(); // @ needed for some versions of PHP!
-
- if ($this->fetchMode & ADODB_FETCH_ASSOC) {
- $this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
- }
- return true;
- }
-
- function NextRecordSet()
- {
- $rs = $this->_queryID;
- $this->_queryID = $rs->NextRecordSet();
- //$this->_queryID = $this->_QueryId->NextRecordSet();
- if ($this->_queryID == null) return false;
-
- $this->_currentRow = -1;
- $this->_currentPage = -1;
- $this->bind = false;
- $this->fields = false;
- $this->_flds = false;
- $this->_tarr = false;
-
- $this->_inited = false;
- $this->Init();
- return true;
- }
-
- function _close() {
- $this->_flds = false;
- @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
- $this->_queryID = false;
- }
-
-}
-
+_affectedRows = new VARIANT;
+ }
+
+ function ServerInfo()
+ {
+ if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;
+ return array('description' => $desc, 'version' => '');
+ }
+
+ function _affectedrows()
+ {
+ if (PHP_VERSION >= 5) return $this->_affectedRows;
+
+ return $this->_affectedRows->value;
+ }
+
+ // you can also pass a connection string like this:
+ //
+ // $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');
+ function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')
+ {
+ $u = 'UID';
+ $p = 'PWD';
+
+ if (!empty($this->charPage))
+ $dbc = new COM('ADODB.Connection',null,$this->charPage);
+ else
+ $dbc = new COM('ADODB.Connection');
+
+ if (! $dbc) return false;
+
+ /* special support if provider is mssql or access */
+ if ($argProvider=='mssql') {
+ $u = 'User Id'; //User parameter name for OLEDB
+ $p = 'Password';
+ $argProvider = "SQLOLEDB"; // SQL Server Provider
+
+ // not yet
+ //if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";
+
+ //use trusted conection for SQL if username not specified
+ if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";
+ } else if ($argProvider=='access')
+ $argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider
+
+ if ($argProvider) $dbc->Provider = $argProvider;
+
+ if ($argUsername) $argHostname .= ";$u=$argUsername";
+ if ($argPassword)$argHostname .= ";$p=$argPassword";
+
+ if ($this->debug) ADOConnection::outp( "Host=".$argHostname."
\n version=$dbc->version");
+ // @ added below for php 4.0.1 and earlier
+ @$dbc->Open((string) $argHostname);
+
+ $this->_connectionID = $dbc;
+
+ $dbc->CursorLocation = $this->_cursor_location;
+ return $dbc->State > 0;
+ }
+
+ // returns true or false
+ function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')
+ {
+ return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);
+ }
+
+/*
+ adSchemaCatalogs = 1,
+ adSchemaCharacterSets = 2,
+ adSchemaCollations = 3,
+ adSchemaColumns = 4,
+ adSchemaCheckConstraints = 5,
+ adSchemaConstraintColumnUsage = 6,
+ adSchemaConstraintTableUsage = 7,
+ adSchemaKeyColumnUsage = 8,
+ adSchemaReferentialContraints = 9,
+ adSchemaTableConstraints = 10,
+ adSchemaColumnsDomainUsage = 11,
+ adSchemaIndexes = 12,
+ adSchemaColumnPrivileges = 13,
+ adSchemaTablePrivileges = 14,
+ adSchemaUsagePrivileges = 15,
+ adSchemaProcedures = 16,
+ adSchemaSchemata = 17,
+ adSchemaSQLLanguages = 18,
+ adSchemaStatistics = 19,
+ adSchemaTables = 20,
+ adSchemaTranslations = 21,
+ adSchemaProviderTypes = 22,
+ adSchemaViews = 23,
+ adSchemaViewColumnUsage = 24,
+ adSchemaViewTableUsage = 25,
+ adSchemaProcedureParameters = 26,
+ adSchemaForeignKeys = 27,
+ adSchemaPrimaryKeys = 28,
+ adSchemaProcedureColumns = 29,
+ adSchemaDBInfoKeywords = 30,
+ adSchemaDBInfoLiterals = 31,
+ adSchemaCubes = 32,
+ adSchemaDimensions = 33,
+ adSchemaHierarchies = 34,
+ adSchemaLevels = 35,
+ adSchemaMeasures = 36,
+ adSchemaProperties = 37,
+ adSchemaMembers = 38
+
+*/
+
+ function &MetaTables()
+ {
+ $arr= array();
+ $dbc = $this->_connectionID;
+
+ $adors=@$dbc->OpenSchema(20);//tables
+ if ($adors){
+ $f = $adors->Fields(2);//table/view name
+ $t = $adors->Fields(3);//table type
+ while (!$adors->EOF){
+ $tt=substr($t->value,0,6);
+ if ($tt!='SYSTEM' && $tt !='ACCESS')
+ $arr[]=$f->value;
+ //print $f->value . ' ' . $t->value.'
';
+ $adors->MoveNext();
+ }
+ $adors->Close();
+ }
+
+ return $arr;
+ }
+
+ function &MetaColumns($table)
+ {
+ $table = strtoupper($table);
+ $arr= array();
+ $dbc = $this->_connectionID;
+
+ $adors=@$dbc->OpenSchema(4);//tables
+
+ if ($adors){
+ $t = $adors->Fields(2);//table/view name
+ while (!$adors->EOF){
+
+
+ if (strtoupper($t->Value) == $table) {
+
+ $fld = new ADOFieldObject();
+ $c = $adors->Fields(3);
+ $fld->name = $c->Value;
+ $fld->type = 'CHAR'; // cannot discover type in ADO!
+ $fld->max_length = -1;
+ $arr[strtoupper($fld->name)]=$fld;
+ }
+
+ $adors->MoveNext();
+ }
+ $adors->Close();
+ }
+
+ return $arr;
+ }
+
+
+
+
+ /* returns queryID or false */
+ function &_query($sql,$inputarr=false)
+ {
+
+ $dbc = $this->_connectionID;
+
+ // return rs
+ if ($inputarr) {
+
+ if (!empty($this->charPage))
+ $oCmd = new COM('ADODB.Command',null,$this->charPage);
+ else
+ $oCmd = new COM('ADODB.Command');
+ $oCmd->ActiveConnection = $dbc;
+ $oCmd->CommandText = $sql;
+ $oCmd->CommandType = 1;
+
+ foreach($inputarr as $val) {
+ // name, type, direction 1 = input, len,
+ $this->adoParameterType = 130;
+ $p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);
+ //print $p->Type.' '.$p->value;
+ $oCmd->Parameters->Append($p);
+ }
+ $p = false;
+ $rs = $oCmd->Execute();
+ $e = $dbc->Errors;
+ if ($dbc->Errors->Count > 0) return false;
+ return $rs;
+ }
+
+ $rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);
+ /*
+ $rs = new COM('ADODB.Recordset');
+ if ($rs) {
+ $rs->Open ($sql, $dbc, $this->_cursor_type,$this->_lock_type, $this->_execute_option);
+ }
+ */
+ if ($dbc->Errors->Count > 0) return false;
+ if (! $rs) return false;
+
+ if ($rs->State == 0) return true; // 0 = adStateClosed means no records returned
+ return $rs;
+ }
+
+
+ function BeginTrans()
+ {
+ if ($this->transOff) return true;
+
+ if (isset($this->_thisTransactions))
+ if (!$this->_thisTransactions) return false;
+ else {
+ $o = $this->_connectionID->Properties("Transaction DDL");
+ $this->_thisTransactions = $o ? true : false;
+ if (!$o) return false;
+ }
+ @$this->_connectionID->BeginTrans();
+ $this->transCnt += 1;
+ return true;
+ }
+ function CommitTrans($ok=true)
+ {
+ if (!$ok) return $this->RollbackTrans();
+ if ($this->transOff) return true;
+
+ @$this->_connectionID->CommitTrans();
+ if ($this->transCnt) @$this->transCnt -= 1;
+ return true;
+ }
+ function RollbackTrans() {
+ if ($this->transOff) return true;
+ @$this->_connectionID->RollbackTrans();
+ if ($this->transCnt) @$this->transCnt -= 1;
+ return true;
+ }
+
+ /* Returns: the last error message from previous database operation */
+
+ function ErrorMsg()
+ {
+ $errc = $this->_connectionID->Errors;
+ if ($errc->Count == 0) return '';
+ $err = $errc->Item($errc->Count-1);
+ return $err->Description;
+ }
+
+ function ErrorNo()
+ {
+ $errc = $this->_connectionID->Errors;
+ if ($errc->Count == 0) return 0;
+ $err = $errc->Item($errc->Count-1);
+ return $err->NativeError;
+ }
+
+ // returns true or false
+ function _close()
+ {
+ if ($this->_connectionID) $this->_connectionID->Close();
+ $this->_connectionID = false;
+ return true;
+ }
+
+
+}
+
+/*--------------------------------------------------------------------------------------
+ Class Name: Recordset
+--------------------------------------------------------------------------------------*/
+
+class ADORecordSet_ado extends ADORecordSet {
+
+ var $bind = false;
+ var $databaseType = "ado";
+ var $dataProvider = "ado";
+ var $_tarr = false; // caches the types
+ var $_flds; // and field objects
+ var $canSeek = true;
+ var $hideErrors = true;
+
+ function ADORecordSet_ado($id,$mode=false)
+ {
+ if ($mode === false) {
+ global $ADODB_FETCH_MODE;
+ $mode = $ADODB_FETCH_MODE;
+ }
+ $this->fetchMode = $mode;
+ return $this->ADORecordSet($id,$mode);
+ }
+
+
+ // returns the field object
+ function FetchField($fieldOffset = -1) {
+ $off=$fieldOffset+1; // offsets begin at 1
+
+ $o= new ADOFieldObject();
+ $rs = $this->_queryID;
+ $f = $rs->Fields($fieldOffset);
+ $o->name = $f->Name;
+ $t = $f->Type;
+ $o->type = $this->MetaType($t);
+ $o->max_length = $f->DefinedSize;
+ $o->ado_type = $t;
+
+
+ //print "off=$off name=$o->name type=$o->type len=$o->max_length
";
+ return $o;
+ }
+
+ /* Use associative array to get fields array */
+ function Fields($colname)
+ {
+ if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
+ if (!$this->bind) {
+ $this->bind = array();
+ for ($i=0; $i < $this->_numOfFields; $i++) {
+ $o = $this->FetchField($i);
+ $this->bind[strtoupper($o->name)] = $i;
+ }
+ }
+
+ return $this->fields[$this->bind[strtoupper($colname)]];
+ }
+
+
+ function _initrs()
+ {
+ $rs = $this->_queryID;
+ $this->_numOfRows = $rs->RecordCount;
+
+ $f = $rs->Fields;
+ $this->_numOfFields = $f->Count;
+ }
+
+
+ // should only be used to move forward as we normally use forward-only cursors
+ function _seek($row)
+ {
+ $rs = $this->_queryID;
+ // absoluteposition doesn't work -- my maths is wrong ?
+ // $rs->AbsolutePosition->$row-2;
+ // return true;
+ if ($this->_currentRow > $row) return false;
+ @$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst
+ return true;
+ }
+
+/*
+ OLEDB types
+
+ enum DBTYPEENUM
+ { DBTYPE_EMPTY = 0,
+ DBTYPE_NULL = 1,
+ DBTYPE_I2 = 2,
+ DBTYPE_I4 = 3,
+ DBTYPE_R4 = 4,
+ DBTYPE_R8 = 5,
+ DBTYPE_CY = 6,
+ DBTYPE_DATE = 7,
+ DBTYPE_BSTR = 8,
+ DBTYPE_IDISPATCH = 9,
+ DBTYPE_ERROR = 10,
+ DBTYPE_BOOL = 11,
+ DBTYPE_VARIANT = 12,
+ DBTYPE_IUNKNOWN = 13,
+ DBTYPE_DECIMAL = 14,
+ DBTYPE_UI1 = 17,
+ DBTYPE_ARRAY = 0x2000,
+ DBTYPE_BYREF = 0x4000,
+ DBTYPE_I1 = 16,
+ DBTYPE_UI2 = 18,
+ DBTYPE_UI4 = 19,
+ DBTYPE_I8 = 20,
+ DBTYPE_UI8 = 21,
+ DBTYPE_GUID = 72,
+ DBTYPE_VECTOR = 0x1000,
+ DBTYPE_RESERVED = 0x8000,
+ DBTYPE_BYTES = 128,
+ DBTYPE_STR = 129,
+ DBTYPE_WSTR = 130,
+ DBTYPE_NUMERIC = 131,
+ DBTYPE_UDT = 132,
+ DBTYPE_DBDATE = 133,
+ DBTYPE_DBTIME = 134,
+ DBTYPE_DBTIMESTAMP = 135
+
+ ADO Types
+
+ adEmpty = 0,
+ adTinyInt = 16,
+ adSmallInt = 2,
+ adInteger = 3,
+ adBigInt = 20,
+ adUnsignedTinyInt = 17,
+ adUnsignedSmallInt = 18,
+ adUnsignedInt = 19,
+ adUnsignedBigInt = 21,
+ adSingle = 4,
+ adDouble = 5,
+ adCurrency = 6,
+ adDecimal = 14,
+ adNumeric = 131,
+ adBoolean = 11,
+ adError = 10,
+ adUserDefined = 132,
+ adVariant = 12,
+ adIDispatch = 9,
+ adIUnknown = 13,
+ adGUID = 72,
+ adDate = 7,
+ adDBDate = 133,
+ adDBTime = 134,
+ adDBTimeStamp = 135,
+ adBSTR = 8,
+ adChar = 129,
+ adVarChar = 200,
+ adLongVarChar = 201,
+ adWChar = 130,
+ adVarWChar = 202,
+ adLongVarWChar = 203,
+ adBinary = 128,
+ adVarBinary = 204,
+ adLongVarBinary = 205,
+ adChapter = 136,
+ adFileTime = 64,
+ adDBFileTime = 137,
+ adPropVariant = 138,
+ adVarNumeric = 139
+*/
+ function MetaType($t,$len=-1,$fieldobj=false)
+ {
+ if (is_object($t)) {
+ $fieldobj = $t;
+ $t = $fieldobj->type;
+ $len = $fieldobj->max_length;
+ }
+
+ if (!is_numeric($t)) return $t;
+
+ switch ($t) {
+ case 0:
+ case 12: // variant
+ case 8: // bstr
+ case 129: //char
+ case 130: //wc
+ case 200: // varc
+ case 202:// varWC
+ case 128: // bin
+ case 204: // varBin
+ case 72: // guid
+ if ($len <= $this->blobSize) return 'C';
+
+ case 201:
+ case 203:
+ return 'X';
+ case 128:
+ case 204:
+ case 205:
+ return 'B';
+ case 7:
+ case 133: return 'D';
+
+ case 134:
+ case 135: return 'T';
+
+ case 11: return 'L';
+
+ case 16:// adTinyInt = 16,
+ case 2://adSmallInt = 2,
+ case 3://adInteger = 3,
+ case 4://adBigInt = 20,
+ case 17://adUnsignedTinyInt = 17,
+ case 18://adUnsignedSmallInt = 18,
+ case 19://adUnsignedInt = 19,
+ case 20://adUnsignedBigInt = 21,
+ return 'I';
+ default: return 'N';
+ }
+ }
+
+ // time stamp not supported yet
+ function _fetch()
+ {
+ $rs = $this->_queryID;
+ if (!$rs or $rs->EOF) {
+ $this->fields = false;
+ return false;
+ }
+ $this->fields = array();
+
+ if (!$this->_tarr) {
+ $tarr = array();
+ $flds = array();
+ for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
+ $f = $rs->Fields($i);
+ $flds[] = $f;
+ $tarr[] = $f->Type;
+ }
+ // bind types and flds only once
+ $this->_tarr = $tarr;
+ $this->_flds = $flds;
+ }
+ $t = reset($this->_tarr);
+ $f = reset($this->_flds);
+
+ if ($this->hideErrors) $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null
+ for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {
+
+ switch($t) {
+ case 135: // timestamp
+ if (!strlen((string)$f->value)) $this->fields[] = false;
+ else $this->fields[] = adodb_date('Y-m-d H:i:s',(float)$f->value);
+ break;
+ case 133:// A date value (yyyymmdd)
+ if ($val = $f->value) {
+ $this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);
+ } else
+ $this->fields[] = false;
+ break;
+ case 7: // adDate
+ if (!strlen((string)$f->value)) $this->fields[] = false;
+ else $this->fields[] = adodb_date('Y-m-d',(float)$f->value);
+ break;
+ case 1: // null
+ $this->fields[] = false;
+ break;
+ case 6: // currency is not supported properly;
+ ADOConnection::outp( ''.$f->Name.': currency type not supported by PHP');
+ $this->fields[] = (float) $f->value;
+ break;
+ default:
+ $this->fields[] = $f->value;
+ break;
+ }
+ //print " $f->value $t, ";
+ $f = next($this->_flds);
+ $t = next($this->_tarr);
+ } // for
+ if ($this->hideErrors) error_reporting($olde);
+ @$rs->MoveNext(); // @ needed for some versions of PHP!
+
+ if ($this->fetchMode & ADODB_FETCH_ASSOC) {
+ $this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);
+ }
+ return true;
+ }
+
+ function NextRecordSet()
+ {
+ $rs = $this->_queryID;
+ $this->_queryID = $rs->NextRecordSet();
+ //$this->_queryID = $this->_QueryId->NextRecordSet();
+ if ($this->_queryID == null) return false;
+
+ $this->_currentRow = -1;
+ $this->_currentPage = -1;
+ $this->bind = false;
+ $this->fields = false;
+ $this->_flds = false;
+ $this->_tarr = false;
+
+ $this->_inited = false;
+ $this->Init();
+ return true;
+ }
+
+ function _close() {
+ $this->_flds = false;
+ @$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)
+ $this->_queryID = false;
+ }
+
+}
+
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ado_access.inc.php b/lib/adodb/drivers/adodb-ado_access.inc.php
index 74b37a5776..955fc6d80e 100644
--- a/lib/adodb/drivers/adodb-ado_access.inc.php
+++ b/lib/adodb/drivers/adodb-ado_access.inc.php
@@ -1,46 +1,49 @@
-ADODB_ado();
- }
-
- function BeginTrans() { return false;}
-
-}
-
-
-class ADORecordSet_ado_access extends ADORecordSet_ado {
-
- var $databaseType = "ado_access";
-
- function ADORecordSet_ado_access($id,$mode=false)
- {
- return $this->ADORecordSet_ado($id,$mode);
- }
-}
+ADODB_ado();
+ }
+
+ function BeginTrans() { return false;}
+
+}
+
+
+class ADORecordSet_ado_access extends ADORecordSet_ado {
+
+ var $databaseType = "ado_access";
+
+ function ADORecordSet_ado_access($id,$mode=false)
+ {
+ return $this->ADORecordSet_ado($id,$mode);
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ado_mssql.inc.php b/lib/adodb/drivers/adodb-ado_mssql.inc.php
index fec181abc8..e18440bc3e 100644
--- a/lib/adodb/drivers/adodb-ado_mssql.inc.php
+++ b/lib/adodb/drivers/adodb-ado_mssql.inc.php
@@ -1,62 +1,97 @@
-ADODB_ado();
- }
-
- function _insertid()
- {
- return $this->GetOne('select @@identity');
- }
-
- function _affectedrows()
- {
- return $this->GetOne('select @@rowcount');
- }
-
-}
-
-class ADORecordSet_ado_mssql extends ADORecordSet_ado {
-
- var $databaseType = 'ado_mssql';
-
- function ADORecordSet_ado_mssql($id,$mode=false)
- {
- return $this->ADORecordSet_ado($id,$mode);
- }
-}
+ADODB_ado();
+ }
+
+ function _insertid()
+ {
+ return $this->GetOne('select @@identity');
+ }
+
+ function _affectedrows()
+ {
+ return $this->GetOne('select @@rowcount');
+ }
+
+ function MetaColumns($table)
+ {
+ $table = strtoupper($table);
+ $arr= array();
+ $dbc = $this->_connectionID;
+
+ $osoptions = array();
+ $osoptions[0] = null;
+ $osoptions[1] = null;
+ $osoptions[2] = $table;
+ $osoptions[3] = null;
+
+ $adors=@$dbc->OpenSchema(4, $osoptions);//tables
+
+ if ($adors){
+ while (!$adors->EOF){
+ $fld = new ADOFieldObject();
+ $c = $adors->Fields(3);
+ $fld->name = $c->Value;
+ $fld->type = 'CHAR'; // cannot discover type in ADO!
+ $fld->max_length = -1;
+ $arr[strtoupper($fld->name)]=$fld;
+
+ $adors->MoveNext();
+ }
+ $adors->Close();
+ }
+
+ return $arr;
+ }
+ }
+
+ class ADORecordSet_ado_mssql extends ADORecordSet_ado {
+
+ var $databaseType = 'ado_mssql';
+
+ function ADORecordSet_ado_mssql($id,$mode=false)
+ {
+ return $this->ADORecordSet_ado($id,$mode);
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-borland_ibase.inc.php b/lib/adodb/drivers/adodb-borland_ibase.inc.php
index 4030c7189b..410f61adbe 100644
--- a/lib/adodb/drivers/adodb-borland_ibase.inc.php
+++ b/lib/adodb/drivers/adodb-borland_ibase.inc.php
@@ -1,79 +1,91 @@
-ADODB_ibase();
- }
-
- function ServerInfo()
- {
- $arr['dialect'] = $this->dialect;
- switch($arr['dialect']) {
- case '':
- case '1': $s = 'Interbase 6.5, Dialect 1'; break;
- case '2': $s = 'Interbase 6.5, Dialect 2'; break;
- default:
- case '3': $s = 'Interbase 6.5, Dialect 3'; break;
- }
- $arr['version'] = '6.5';
- $arr['description'] = $s;
- return $arr;
- }
-
- // Note that Interbase 6.5 uses ROWS instead - don't you love forking wars!
- // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
- // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
- // Firebird uses
- // SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE
- function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
- {
- if ($nrows > 0) {
- if ($offset <= 0) $str = " ROWS $nrows ";
- else {
- $a = $offset+1;
- $b = $offset+$nrows;
- $str = " ROWS $a TO $b";
- }
- } else {
- // ok, skip
- $a = $offset + 1;
- $str = " ROWS $a TO 999999999"; // 999 million
- }
- $sql .= $str;
-
- return ($secs2cache) ?
- $this->CacheExecute($secs2cache,$sql,$inputarr)
- :
- $this->Execute($sql,$inputarr);
- }
-
-};
-
-
-class ADORecordSet_borland_ibase extends ADORecordSet_ibase {
-
- var $databaseType = "borland_ibase";
-
- function ADORecordSet_borland_ibase($id,$mode=false)
- {
- $this->ADORecordSet_ibase($id,$mode);
- }
-}
+ADODB_ibase();
+ }
+
+ function BeginTrans()
+ {
+ if ($this->transOff) return true;
+ $this->transCnt += 1;
+ $this->autoCommit = false;
+ $this->_transactionID = ibase_trans($this->ibasetrans, $this->_connectionID);
+ return $this->_transactionID;
+ }
+
+ function ServerInfo()
+ {
+ $arr['dialect'] = $this->dialect;
+ switch($arr['dialect']) {
+ case '':
+ case '1': $s = 'Interbase 6.5, Dialect 1'; break;
+ case '2': $s = 'Interbase 6.5, Dialect 2'; break;
+ default:
+ case '3': $s = 'Interbase 6.5, Dialect 3'; break;
+ }
+ $arr['version'] = '6.5';
+ $arr['description'] = $s;
+ return $arr;
+ }
+
+ // Note that Interbase 6.5 uses ROWS instead - don't you love forking wars!
+ // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
+ // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
+ // Firebird uses
+ // SELECT FIRST 5 SKIP 2 col1, col2 FROM TABLE
+ function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
+ {
+ if ($nrows > 0) {
+ if ($offset <= 0) $str = " ROWS $nrows ";
+ else {
+ $a = $offset+1;
+ $b = $offset+$nrows;
+ $str = " ROWS $a TO $b";
+ }
+ } else {
+ // ok, skip
+ $a = $offset + 1;
+ $str = " ROWS $a TO 999999999"; // 999 million
+ }
+ $sql .= $str;
+
+ return ($secs2cache) ?
+ $this->CacheExecute($secs2cache,$sql,$inputarr)
+ :
+ $this->Execute($sql,$inputarr);
+ }
+
+};
+
+
+class ADORecordSet_borland_ibase extends ADORecordSet_ibase {
+
+ var $databaseType = "borland_ibase";
+
+ function ADORecordSet_borland_ibase($id,$mode=false)
+ {
+ $this->ADORecordSet_ibase($id,$mode);
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-csv.inc.php b/lib/adodb/drivers/adodb-csv.inc.php
index a444d9e0f9..75c5760817 100644
--- a/lib/adodb/drivers/adodb-csv.inc.php
+++ b/lib/adodb/drivers/adodb-csv.inc.php
@@ -1,200 +1,203 @@
-_insertid;
- }
-
- function _affectedrows()
- {
- return $this->_affectedrows;
- }
-
- function &MetaDatabases()
- {
- return false;
- }
-
-
- // returns true or false
- function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
- $this->_url = $argHostname;
- return true;
- }
-
- // returns true or false
- function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
- $this->_url = $argHostname;
- return true;
- }
-
- function &MetaColumns($table)
- {
- return false;
- }
-
-
- // parameters use PostgreSQL convention, not MySQL
- function &SelectLimit($sql,$nrows=-1,$offset=-1)
- {
- global $ADODB_FETCH_MODE;
-
- $url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=".
- (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE).
- "&offset=$offset";
- $err = false;
- $rs = csv2rs($url,$err,false);
-
- if ($this->debug) print "$url
$err
";
-
- $at = strpos($err,'::::');
- if ($at === false) {
- $this->_errorMsg = $err;
- $this->_errorNo = (integer)$err;
- } else {
- $this->_errorMsg = substr($err,$at+4,1024);
- $this->_errorNo = -9999;
- }
- if ($this->_errorNo)
- if ($fn = $this->raiseErrorFn) {
- $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,'');
- }
-
- if (is_object($rs)) {
-
- $rs->databaseType='csv';
- $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
- $rs->connection = &$this;
- }
- return $rs;
- }
-
- // returns queryID or false
- function &_Execute($sql,$inputarr=false)
- {
- global $ADODB_FETCH_MODE;
-
- if (!$this->_bindInputArray && $inputarr) {
- $sqlarr = explode('?',$sql);
- $sql = '';
- $i = 0;
- foreach($inputarr as $v) {
-
- $sql .= $sqlarr[$i];
- if (gettype($v) == 'string')
- $sql .= $this->qstr($v);
- else if ($v === null)
- $sql .= 'NULL';
- else
- $sql .= $v;
- $i += 1;
-
- }
- $sql .= $sqlarr[$i];
- if ($i+1 != sizeof($sqlarr))
- print "Input Array does not match ?: ".htmlspecialchars($sql);
- $inputarr = false;
- }
-
- $url = $this->_url.'?sql='.urlencode($sql)."&fetch=".
- (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE);
- $err = false;
-
-
- $rs = csv2rs($url,$err,false);
- if ($this->debug) print urldecode($url)."
$err
";
- $at = strpos($err,'::::');
- if ($at === false) {
- $this->_errorMsg = $err;
- $this->_errorNo = (integer)$err;
- } else {
- $this->_errorMsg = substr($err,$at+4,1024);
- $this->_errorNo = -9999;
- }
-
- if ($this->_errorNo)
- if ($fn = $this->raiseErrorFn) {
- $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr);
- }
- if (is_object($rs)) {
- $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
-
- $this->_affectedrows = $rs->affectedrows;
- $this->_insertid = $rs->insertid;
- $rs->databaseType='csv';
- $rs->connection = &$this;
- }
- return $rs;
- }
-
- /* Returns: the last error message from previous database operation */
- function ErrorMsg()
- {
- return $this->_errorMsg;
- }
-
- /* Returns: the last error number from previous database operation */
- function ErrorNo()
- {
- return $this->_errorNo;
- }
-
- // returns true or false
- function _close()
- {
- return true;
- }
-} // class
-
-class ADORecordset_csv extends ADORecordset {
- function ADORecordset_csv($id,$mode=false)
- {
- $this->ADORecordset($id,$mode);
- }
-
- function _close()
- {
- return true;
- }
-}
-
-} // define
-
+_insertid;
+ }
+
+ function _affectedrows()
+ {
+ return $this->_affectedrows;
+ }
+
+ function &MetaDatabases()
+ {
+ return false;
+ }
+
+
+ // returns true or false
+ function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
+ {
+ if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
+ $this->_url = $argHostname;
+ return true;
+ }
+
+ // returns true or false
+ function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
+ {
+ if (strtolower(substr($argHostname,0,7)) !== 'http://') return false;
+ $this->_url = $argHostname;
+ return true;
+ }
+
+ function &MetaColumns($table)
+ {
+ return false;
+ }
+
+
+ // parameters use PostgreSQL convention, not MySQL
+ function &SelectLimit($sql,$nrows=-1,$offset=-1)
+ {
+ global $ADODB_FETCH_MODE;
+
+ $url = $this->_url.'?sql='.urlencode($sql)."&nrows=$nrows&fetch=".
+ (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE).
+ "&offset=$offset";
+ $err = false;
+ $rs = csv2rs($url,$err,false);
+
+ if ($this->debug) print "$url
$err
";
+
+ $at = strpos($err,'::::');
+ if ($at === false) {
+ $this->_errorMsg = $err;
+ $this->_errorNo = (integer)$err;
+ } else {
+ $this->_errorMsg = substr($err,$at+4,1024);
+ $this->_errorNo = -9999;
+ }
+ if ($this->_errorNo)
+ if ($fn = $this->raiseErrorFn) {
+ $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,'');
+ }
+
+ if (is_object($rs)) {
+
+ $rs->databaseType='csv';
+ $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
+ $rs->connection = &$this;
+ }
+ return $rs;
+ }
+
+ // returns queryID or false
+ function &_Execute($sql,$inputarr=false)
+ {
+ global $ADODB_FETCH_MODE;
+
+ if (!$this->_bindInputArray && $inputarr) {
+ $sqlarr = explode('?',$sql);
+ $sql = '';
+ $i = 0;
+ foreach($inputarr as $v) {
+
+ $sql .= $sqlarr[$i];
+ if (gettype($v) == 'string')
+ $sql .= $this->qstr($v);
+ else if ($v === null)
+ $sql .= 'NULL';
+ else
+ $sql .= $v;
+ $i += 1;
+
+ }
+ $sql .= $sqlarr[$i];
+ if ($i+1 != sizeof($sqlarr))
+ print "Input Array does not match ?: ".htmlspecialchars($sql);
+ $inputarr = false;
+ }
+
+ $url = $this->_url.'?sql='.urlencode($sql)."&fetch=".
+ (($this->fetchMode !== false)?$this->fetchMode : $ADODB_FETCH_MODE);
+ $err = false;
+
+
+ $rs = csv2rs($url,$err,false);
+ if ($this->debug) print urldecode($url)."
$err
";
+ $at = strpos($err,'::::');
+ if ($at === false) {
+ $this->_errorMsg = $err;
+ $this->_errorNo = (integer)$err;
+ } else {
+ $this->_errorMsg = substr($err,$at+4,1024);
+ $this->_errorNo = -9999;
+ }
+
+ if ($this->_errorNo)
+ if ($fn = $this->raiseErrorFn) {
+ $fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr);
+ }
+ if (is_object($rs)) {
+ $rs->fetchMode = ($this->fetchMode !== false) ? $this->fetchMode : $ADODB_FETCH_MODE;
+
+ $this->_affectedrows = $rs->affectedrows;
+ $this->_insertid = $rs->insertid;
+ $rs->databaseType='csv';
+ $rs->connection = &$this;
+ }
+ return $rs;
+ }
+
+ /* Returns: the last error message from previous database operation */
+ function ErrorMsg()
+ {
+ return $this->_errorMsg;
+ }
+
+ /* Returns: the last error number from previous database operation */
+ function ErrorNo()
+ {
+ return $this->_errorNo;
+ }
+
+ // returns true or false
+ function _close()
+ {
+ return true;
+ }
+} // class
+
+class ADORecordset_csv extends ADORecordset {
+ function ADORecordset_csv($id,$mode=false)
+ {
+ $this->ADORecordset($id,$mode);
+ }
+
+ function _close()
+ {
+ return true;
+ }
+}
+
+} // define
+
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-db2.inc.php b/lib/adodb/drivers/adodb-db2.inc.php
index d901abf8aa..8d7b973d75 100644
--- a/lib/adodb/drivers/adodb-db2.inc.php
+++ b/lib/adodb/drivers/adodb-db2.inc.php
@@ -1,313 +1,316 @@
-curMode = SQL_CUR_USE_ODBC;
-$db->Connect($dsn, $userid, $pwd);
-
-
-
-USING CLI INTERFACE
-===================
-
-I have had reports that the $host and $database params have to be reversed in
-Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu:
-
-> The symptom is that if I change the database engine from postgres or any other to DB2 then the following
-> connection command becomes wrong despite being described this version to be correct in the docs.
->
-> $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME )
->
-> In case of DB2 I had to swap the first and last arguments in order to connect properly.
-
-
-*/
-
-if (!defined('_ADODB_ODBC_LAYER')) {
- include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
-}
-if (!defined('ADODB_DB2')){
-define('ADODB_DB2',1);
-
-class ADODB_DB2 extends ADODB_odbc {
- var $databaseType = "db2";
- var $concat_operator = '||';
- var $sysDate = 'CURRENT_DATE';
- var $sysTimeStamp = 'CURRENT TIMESTAMP';
- // The complete string representation of a timestamp has the form
- // yyyy-mm-dd-hh.mm.ss.nnnnnn.
- var $fmtTimeStamp = "'Y-m-d-H.i.s'";
- var $ansiOuter = true;
- var $identitySQL = 'values IDENTITY_VAL_LOCAL()';
- var $_bindInputArray = false;
- var $upperCase = 'upper';
-
-
- function ADODB_DB2()
- {
- if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
- $this->ADODB_odbc();
- }
-
- function IfNull( $field, $ifNull )
- {
- return " COALESCE($field, $ifNull) "; // if DB2 UDB
- }
-
- function ServerInfo()
- {
- //odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/);
- $vers = $this->GetOne('select versionnumber from sysibm.sysversions');
- //odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/);
- return array('description'=>'DB2 ODBC driver', 'version'=>$vers);
- }
-
- function _insertid()
- {
- return $this->GetOne($this->identitySQL);
- }
-
- function RowLock($tables,$where)
- {
- if ($this->_autocommit) $this->BeginTrans();
- return $this->GetOne("select 1 as ignore from $tables where $where for update");
- }
-
- function &MetaTables($ttype=false,$showSchema=false)
- {
- global $ADODB_FETCH_MODE;
-
- $savem = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $qid = odbc_tables($this->_connectionID);
-
- $rs = new ADORecordSet_odbc($qid);
-
- $ADODB_FETCH_MODE = $savem;
- if (!$rs) return false;
-
- $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
-
- $arr =& $rs->GetArray();
- //print_r($arr);
-
- $rs->Close();
- $arr2 = array();
-
- if ($ttype) {
- $isview = strncmp($ttype,'V',1) === 0;
- }
- for ($i=0; $i < sizeof($arr); $i++) {
-
- if (!$arr[$i][2]) continue;
- if (strncmp($arr[$i][1],'SYS',3) === 0) continue;
-
- $type = $arr[$i][3];
-
- if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2];
-
- if ($ttype) {
- if ($isview) {
- if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
- } else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2];
- } else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2];
- }
- return $arr2;
- }
-
- // Format date column in sql string given an input format that understands Y M D
- function SQLDate($fmt, $col=false)
- {
- // use right() and replace() ?
- if (!$col) $col = $this->sysDate;
- $s = '';
-
- $len = strlen($fmt);
- for ($i=0; $i < $len; $i++) {
- if ($s) $s .= '||';
- $ch = $fmt[$i];
- switch($ch) {
- case 'Y':
- case 'y':
- $s .= "char(year($col))";
- break;
- case 'M':
- $s .= "substr(monthname($col),1,3)";
- break;
- case 'm':
- $s .= "right(digits(month($col)),2)";
- break;
- case 'D':
- case 'd':
- $s .= "right(digits(day($col)),2)";
- break;
- case 'H':
- case 'h':
- if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
- else $s .= "''";
- break;
- case 'i':
- case 'I':
- if ($col != $this->sysDate)
- $s .= "right(digits(minute($col)),2)";
- else $s .= "''";
- break;
- case 'S':
- case 's':
- if ($col != $this->sysDate)
- $s .= "right(digits(second($col)),2)";
- else $s .= "''";
- break;
- default:
- if ($ch == '\\') {
- $i++;
- $ch = substr($fmt,$i,1);
- }
- $s .= $this->qstr($ch);
- }
- }
- return $s;
- }
-
-
- function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false)
- {
- if ($offset <= 0) {
- // could also use " OPTIMIZE FOR $nrows ROWS "
- if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY ";
- $rs =& $this->Execute($sql,$inputArr);
- } else {
- if ($offset > 0 && $nrows < 0);
- else {
- $nrows += $offset;
- $sql .= " FETCH FIRST $nrows ROWS ONLY ";
- }
- $rs =& ADOConnection::SelectLimit($sql,-1,$offset,$inputArr);
- }
-
- return $rs;
- }
-
-};
-
-
-class ADORecordSet_db2 extends ADORecordSet_odbc {
-
- var $databaseType = "db2";
-
- function ADORecordSet_db2($id,$mode=false)
- {
- $this->ADORecordSet_odbc($id,$mode);
- }
-
- function MetaType($t,$len=-1,$fieldobj=false)
- {
- if (is_object($t)) {
- $fieldobj = $t;
- $t = $fieldobj->type;
- $len = $fieldobj->max_length;
- }
-
- switch (strtoupper($t)) {
- case 'VARCHAR':
- case 'CHAR':
- case 'CHARACTER':
- if ($len <= $this->blobSize) return 'C';
-
- case 'LONGCHAR':
- case 'TEXT':
- case 'CLOB':
- case 'DBCLOB': // double-byte
- return 'X';
-
- case 'BLOB':
- case 'GRAPHIC':
- case 'VARGRAPHIC':
- return 'B';
-
- case 'DATE':
- return 'D';
-
- case 'TIME':
- case 'TIMESTAMP':
- return 'T';
-
- //case 'BOOLEAN':
- //case 'BIT':
- // return 'L';
-
- //case 'COUNTER':
- // return 'R';
-
- case 'INT':
- case 'INTEGER':
- case 'BIGINT':
- case 'SMALLINT':
- return 'I';
-
- default: return 'N';
- }
- }
-}
-
-} //define
+curMode = SQL_CUR_USE_ODBC;
+$db->Connect($dsn, $userid, $pwd);
+
+
+
+USING CLI INTERFACE
+===================
+
+I have had reports that the $host and $database params have to be reversed in
+Connect() when using the CLI interface. From Halmai Csongor csongor.halmai#nexum.hu:
+
+> The symptom is that if I change the database engine from postgres or any other to DB2 then the following
+> connection command becomes wrong despite being described this version to be correct in the docs.
+>
+> $connection_object->Connect( $DATABASE_HOST, $DATABASE_AUTH_USER_NAME, $DATABASE_AUTH_PASSWORD, $DATABASE_NAME )
+>
+> In case of DB2 I had to swap the first and last arguments in order to connect properly.
+
+
+*/
+
+// security - hide paths
+if (!defined('ADODB_DIR')) die();
+
+if (!defined('_ADODB_ODBC_LAYER')) {
+ include(ADODB_DIR."/drivers/adodb-odbc.inc.php");
+}
+if (!defined('ADODB_DB2')){
+define('ADODB_DB2',1);
+
+class ADODB_DB2 extends ADODB_odbc {
+ var $databaseType = "db2";
+ var $concat_operator = '||';
+ var $sysDate = 'CURRENT_DATE';
+ var $sysTimeStamp = 'CURRENT TIMESTAMP';
+ // The complete string representation of a timestamp has the form
+ // yyyy-mm-dd-hh.mm.ss.nnnnnn.
+ var $fmtTimeStamp = "'Y-m-d-H.i.s'";
+ var $ansiOuter = true;
+ var $identitySQL = 'values IDENTITY_VAL_LOCAL()';
+ var $_bindInputArray = false;
+ var $upperCase = 'upper';
+
+
+ function ADODB_DB2()
+ {
+ if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
+ $this->ADODB_odbc();
+ }
+
+ function IfNull( $field, $ifNull )
+ {
+ return " COALESCE($field, $ifNull) "; // if DB2 UDB
+ }
+
+ function ServerInfo()
+ {
+ //odbc_setoption($this->_connectionID,1,101 /*SQL_ATTR_ACCESS_MODE*/, 1 /*SQL_MODE_READ_ONLY*/);
+ $vers = $this->GetOne('select versionnumber from sysibm.sysversions');
+ //odbc_setoption($this->_connectionID,1,101, 0 /*SQL_MODE_READ_WRITE*/);
+ return array('description'=>'DB2 ODBC driver', 'version'=>$vers);
+ }
+
+ function _insertid()
+ {
+ return $this->GetOne($this->identitySQL);
+ }
+
+ function RowLock($tables,$where)
+ {
+ if ($this->_autocommit) $this->BeginTrans();
+ return $this->GetOne("select 1 as ignore from $tables where $where for update");
+ }
+
+ function &MetaTables($ttype=false,$showSchema=false)
+ {
+ global $ADODB_FETCH_MODE;
+
+ $savem = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ $qid = odbc_tables($this->_connectionID);
+
+ $rs = new ADORecordSet_odbc($qid);
+
+ $ADODB_FETCH_MODE = $savem;
+ if (!$rs) return false;
+
+ $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
+
+ $arr =& $rs->GetArray();
+ //print_r($arr);
+
+ $rs->Close();
+ $arr2 = array();
+
+ if ($ttype) {
+ $isview = strncmp($ttype,'V',1) === 0;
+ }
+ for ($i=0; $i < sizeof($arr); $i++) {
+
+ if (!$arr[$i][2]) continue;
+ if (strncmp($arr[$i][1],'SYS',3) === 0) continue;
+
+ $type = $arr[$i][3];
+
+ if ($showSchema) $arr[$i][2] = $arr[$i][1].'.'.$arr[$i][2];
+
+ if ($ttype) {
+ if ($isview) {
+ if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
+ } else if (strncmp($type,'T',1) === 0) $arr2[] = $arr[$i][2];
+ } else if (strncmp($type,'S',1) !== 0) $arr2[] = $arr[$i][2];
+ }
+ return $arr2;
+ }
+
+ // Format date column in sql string given an input format that understands Y M D
+ function SQLDate($fmt, $col=false)
+ {
+ // use right() and replace() ?
+ if (!$col) $col = $this->sysDate;
+ $s = '';
+
+ $len = strlen($fmt);
+ for ($i=0; $i < $len; $i++) {
+ if ($s) $s .= '||';
+ $ch = $fmt[$i];
+ switch($ch) {
+ case 'Y':
+ case 'y':
+ $s .= "char(year($col))";
+ break;
+ case 'M':
+ $s .= "substr(monthname($col),1,3)";
+ break;
+ case 'm':
+ $s .= "right(digits(month($col)),2)";
+ break;
+ case 'D':
+ case 'd':
+ $s .= "right(digits(day($col)),2)";
+ break;
+ case 'H':
+ case 'h':
+ if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
+ else $s .= "''";
+ break;
+ case 'i':
+ case 'I':
+ if ($col != $this->sysDate)
+ $s .= "right(digits(minute($col)),2)";
+ else $s .= "''";
+ break;
+ case 'S':
+ case 's':
+ if ($col != $this->sysDate)
+ $s .= "right(digits(second($col)),2)";
+ else $s .= "''";
+ break;
+ default:
+ if ($ch == '\\') {
+ $i++;
+ $ch = substr($fmt,$i,1);
+ }
+ $s .= $this->qstr($ch);
+ }
+ }
+ return $s;
+ }
+
+
+ function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputArr=false)
+ {
+ if ($offset <= 0) {
+ // could also use " OPTIMIZE FOR $nrows ROWS "
+ if ($nrows >= 0) $sql .= " FETCH FIRST $nrows ROWS ONLY ";
+ $rs =& $this->Execute($sql,$inputArr);
+ } else {
+ if ($offset > 0 && $nrows < 0);
+ else {
+ $nrows += $offset;
+ $sql .= " FETCH FIRST $nrows ROWS ONLY ";
+ }
+ $rs =& ADOConnection::SelectLimit($sql,-1,$offset,$inputArr);
+ }
+
+ return $rs;
+ }
+
+};
+
+
+class ADORecordSet_db2 extends ADORecordSet_odbc {
+
+ var $databaseType = "db2";
+
+ function ADORecordSet_db2($id,$mode=false)
+ {
+ $this->ADORecordSet_odbc($id,$mode);
+ }
+
+ function MetaType($t,$len=-1,$fieldobj=false)
+ {
+ if (is_object($t)) {
+ $fieldobj = $t;
+ $t = $fieldobj->type;
+ $len = $fieldobj->max_length;
+ }
+
+ switch (strtoupper($t)) {
+ case 'VARCHAR':
+ case 'CHAR':
+ case 'CHARACTER':
+ if ($len <= $this->blobSize) return 'C';
+
+ case 'LONGCHAR':
+ case 'TEXT':
+ case 'CLOB':
+ case 'DBCLOB': // double-byte
+ return 'X';
+
+ case 'BLOB':
+ case 'GRAPHIC':
+ case 'VARGRAPHIC':
+ return 'B';
+
+ case 'DATE':
+ return 'D';
+
+ case 'TIME':
+ case 'TIMESTAMP':
+ return 'T';
+
+ //case 'BOOLEAN':
+ //case 'BIT':
+ // return 'L';
+
+ //case 'COUNTER':
+ // return 'R';
+
+ case 'INT':
+ case 'INTEGER':
+ case 'BIGINT':
+ case 'SMALLINT':
+ return 'I';
+
+ default: return 'N';
+ }
+ }
+}
+
+} //define
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-fbsql.inc.php b/lib/adodb/drivers/adodb-fbsql.inc.php
index 4221070cd2..308ebca3a4 100644
--- a/lib/adodb/drivers/adodb-fbsql.inc.php
+++ b/lib/adodb/drivers/adodb-fbsql.inc.php
@@ -1,262 +1,265 @@
-.
- Set tabs to 8.
-*/
-
-if (! defined("_ADODB_FBSQL_LAYER")) {
- define("_ADODB_FBSQL_LAYER", 1 );
-
-class ADODB_fbsql extends ADOConnection {
- var $databaseType = 'fbsql';
- var $hasInsertID = true;
- var $hasAffectedRows = true;
- var $metaTablesSQL = "SHOW TABLES";
- var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
- var $fmtTimeStamp = "'Y-m-d H:i:s'";
- var $hasLimit = false;
-
- function ADODB_fbsql()
- {
- }
-
- function _insertid()
- {
- return fbsql_insert_id($this->_connectionID);
- }
-
- function _affectedrows()
- {
- return fbsql_affected_rows($this->_connectionID);
- }
-
- function &MetaDatabases()
- {
- $qid = fbsql_list_dbs($this->_connectionID);
- $arr = array();
- $i = 0;
- $max = fbsql_num_rows($qid);
- while ($i < $max) {
- $arr[] = fbsql_tablename($qid,$i);
- $i += 1;
- }
- return $arr;
- }
-
- // returns concatenated string
- function Concat()
- {
- $s = "";
- $arr = func_get_args();
- $first = true;
-
- $s = implode(',',$arr);
- if (sizeof($arr) > 0) return "CONCAT($s)";
- else return '';
- }
-
- // returns true or false
- function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- $this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword);
- if ($this->_connectionID === false) return false;
- if ($argDatabasename) return $this->SelectDB($argDatabasename);
- return true;
- }
-
- // returns true or false
- function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- $this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword);
- if ($this->_connectionID === false) return false;
- if ($argDatabasename) return $this->SelectDB($argDatabasename);
- return true;
- }
-
- function &MetaColumns($table)
- {
- if ($this->metaColumnsSQL) {
-
- $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
-
- if ($rs === false) return false;
-
- $retarr = array();
- while (!$rs->EOF){
- $fld = new ADOFieldObject();
- $fld->name = $rs->fields[0];
- $fld->type = $rs->fields[1];
-
- // split type into type(length):
- if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) {
- $fld->type = $query_array[1];
- $fld->max_length = $query_array[2];
- } else {
- $fld->max_length = -1;
- }
- $fld->not_null = ($rs->fields[2] != 'YES');
- $fld->primary_key = ($rs->fields[3] == 'PRI');
- $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
- $fld->binary = (strpos($fld->type,'blob') !== false);
-
- $retarr[strtoupper($fld->name)] = $fld;
- $rs->MoveNext();
- }
- $rs->Close();
- return $retarr;
- }
- return false;
- }
-
- // returns true or false
- function SelectDB($dbName)
- {
- $this->databaseName = $dbName;
- if ($this->_connectionID) {
- return @fbsql_select_db($dbName,$this->_connectionID);
- }
- else return false;
- }
-
-
- // returns queryID or false
- function _query($sql,$inputarr)
- {
- return fbsql_query("$sql;",$this->_connectionID);
- }
-
- /* Returns: the last error message from previous database operation */
- function ErrorMsg()
- {
- $this->_errorMsg = @fbsql_error($this->_connectionID);
- return $this->_errorMsg;
- }
-
- /* Returns: the last error number from previous database operation */
- function ErrorNo()
- {
- return @fbsql_errno($this->_connectionID);
- }
-
- // returns true or false
- function _close()
- {
- return @fbsql_close($this->_connectionID);
- }
-
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordSet_fbsql extends ADORecordSet{
-
- var $databaseType = "fbsql";
- var $canSeek = true;
-
- function ADORecordSet_fbsql($queryID,$mode=false)
- {
- if (!$mode) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- }
- switch ($mode) {
- case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break;
- default:
- case ADODB_FETCH_BOTH: $this->fetchMode = FBSQL_BOTH; break;
- case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break;
- }
- return $this->ADORecordSet($queryID);
- }
-
- function _initrs()
- {
- GLOBAL $ADODB_COUNTRECS;
- $this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1;
- $this->_numOfFields = @fbsql_num_fields($this->_queryID);
- }
-
-
-
- function &FetchField($fieldOffset = -1) {
- if ($fieldOffset != -1) {
- $o = @fbsql_fetch_field($this->_queryID, $fieldOffset);
- //$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable
- $f = @fbsql_field_flags($this->_queryID,$fieldOffset);
- $o->binary = (strpos($f,'binary')!== false);
- }
- else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
- $o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable
- //$o->max_length = -1;
- }
-
- return $o;
- }
-
- function _seek($row)
- {
- return @fbsql_data_seek($this->_queryID,$row);
- }
-
- function _fetch($ignore_fields=false)
- {
- $this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode);
- return ($this->fields == true);
- }
-
- function _close() {
- return @fbsql_free_result($this->_queryID);
- }
-
- function MetaType($t,$len=-1,$fieldobj=false)
- {
- if (is_object($t)) {
- $fieldobj = $t;
- $t = $fieldobj->type;
- $len = $fieldobj->max_length;
- }
- $len = -1; // fbsql max_length is not accurate
- switch (strtoupper($t)) {
- case 'CHARACTER':
- case 'CHARACTER VARYING':
- case 'BLOB':
- case 'CLOB':
- case 'BIT':
- case 'BIT VARYING':
- if ($len <= $this->blobSize) return 'C';
-
- // so we have to check whether binary...
- case 'IMAGE':
- case 'LONGBLOB':
- case 'BLOB':
- case 'MEDIUMBLOB':
- return !empty($fieldobj->binary) ? 'B' : 'X';
-
- case 'DATE': return 'D';
-
- case 'TIME':
- case 'TIME WITH TIME ZONE':
- case 'TIMESTAMP':
- case 'TIMESTAMP WITH TIME ZONE': return 'T';
-
- case 'PRIMARY_KEY':
- return 'R';
- case 'INTEGER':
- case 'SMALLINT':
- case 'BOOLEAN':
-
- if (!empty($fieldobj->primary_key)) return 'R';
- else return 'I';
-
- default: return 'N';
- }
- }
-
-} //class
-} // defined
+.
+ Set tabs to 8.
+*/
+
+// security - hide paths
+if (!defined('ADODB_DIR')) die();
+
+if (! defined("_ADODB_FBSQL_LAYER")) {
+ define("_ADODB_FBSQL_LAYER", 1 );
+
+class ADODB_fbsql extends ADOConnection {
+ var $databaseType = 'fbsql';
+ var $hasInsertID = true;
+ var $hasAffectedRows = true;
+ var $metaTablesSQL = "SHOW TABLES";
+ var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
+ var $fmtTimeStamp = "'Y-m-d H:i:s'";
+ var $hasLimit = false;
+
+ function ADODB_fbsql()
+ {
+ }
+
+ function _insertid()
+ {
+ return fbsql_insert_id($this->_connectionID);
+ }
+
+ function _affectedrows()
+ {
+ return fbsql_affected_rows($this->_connectionID);
+ }
+
+ function &MetaDatabases()
+ {
+ $qid = fbsql_list_dbs($this->_connectionID);
+ $arr = array();
+ $i = 0;
+ $max = fbsql_num_rows($qid);
+ while ($i < $max) {
+ $arr[] = fbsql_tablename($qid,$i);
+ $i += 1;
+ }
+ return $arr;
+ }
+
+ // returns concatenated string
+ function Concat()
+ {
+ $s = "";
+ $arr = func_get_args();
+ $first = true;
+
+ $s = implode(',',$arr);
+ if (sizeof($arr) > 0) return "CONCAT($s)";
+ else return '';
+ }
+
+ // returns true or false
+ function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
+ {
+ $this->_connectionID = fbsql_connect($argHostname,$argUsername,$argPassword);
+ if ($this->_connectionID === false) return false;
+ if ($argDatabasename) return $this->SelectDB($argDatabasename);
+ return true;
+ }
+
+ // returns true or false
+ function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
+ {
+ $this->_connectionID = fbsql_pconnect($argHostname,$argUsername,$argPassword);
+ if ($this->_connectionID === false) return false;
+ if ($argDatabasename) return $this->SelectDB($argDatabasename);
+ return true;
+ }
+
+ function &MetaColumns($table)
+ {
+ if ($this->metaColumnsSQL) {
+
+ $rs = $this->Execute(sprintf($this->metaColumnsSQL,$table));
+
+ if ($rs === false) return false;
+
+ $retarr = array();
+ while (!$rs->EOF){
+ $fld = new ADOFieldObject();
+ $fld->name = $rs->fields[0];
+ $fld->type = $rs->fields[1];
+
+ // split type into type(length):
+ if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) {
+ $fld->type = $query_array[1];
+ $fld->max_length = $query_array[2];
+ } else {
+ $fld->max_length = -1;
+ }
+ $fld->not_null = ($rs->fields[2] != 'YES');
+ $fld->primary_key = ($rs->fields[3] == 'PRI');
+ $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
+ $fld->binary = (strpos($fld->type,'blob') !== false);
+
+ $retarr[strtoupper($fld->name)] = $fld;
+ $rs->MoveNext();
+ }
+ $rs->Close();
+ return $retarr;
+ }
+ return false;
+ }
+
+ // returns true or false
+ function SelectDB($dbName)
+ {
+ $this->databaseName = $dbName;
+ if ($this->_connectionID) {
+ return @fbsql_select_db($dbName,$this->_connectionID);
+ }
+ else return false;
+ }
+
+
+ // returns queryID or false
+ function _query($sql,$inputarr)
+ {
+ return fbsql_query("$sql;",$this->_connectionID);
+ }
+
+ /* Returns: the last error message from previous database operation */
+ function ErrorMsg()
+ {
+ $this->_errorMsg = @fbsql_error($this->_connectionID);
+ return $this->_errorMsg;
+ }
+
+ /* Returns: the last error number from previous database operation */
+ function ErrorNo()
+ {
+ return @fbsql_errno($this->_connectionID);
+ }
+
+ // returns true or false
+ function _close()
+ {
+ return @fbsql_close($this->_connectionID);
+ }
+
+}
+
+/*--------------------------------------------------------------------------------------
+ Class Name: Recordset
+--------------------------------------------------------------------------------------*/
+
+class ADORecordSet_fbsql extends ADORecordSet{
+
+ var $databaseType = "fbsql";
+ var $canSeek = true;
+
+ function ADORecordSet_fbsql($queryID,$mode=false)
+ {
+ if (!$mode) {
+ global $ADODB_FETCH_MODE;
+ $mode = $ADODB_FETCH_MODE;
+ }
+ switch ($mode) {
+ case ADODB_FETCH_NUM: $this->fetchMode = FBSQL_NUM; break;
+ default:
+ case ADODB_FETCH_BOTH: $this->fetchMode = FBSQL_BOTH; break;
+ case ADODB_FETCH_ASSOC: $this->fetchMode = FBSQL_ASSOC; break;
+ }
+ return $this->ADORecordSet($queryID);
+ }
+
+ function _initrs()
+ {
+ GLOBAL $ADODB_COUNTRECS;
+ $this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID):-1;
+ $this->_numOfFields = @fbsql_num_fields($this->_queryID);
+ }
+
+
+
+ function &FetchField($fieldOffset = -1) {
+ if ($fieldOffset != -1) {
+ $o = @fbsql_fetch_field($this->_queryID, $fieldOffset);
+ //$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable
+ $f = @fbsql_field_flags($this->_queryID,$fieldOffset);
+ $o->binary = (strpos($f,'binary')!== false);
+ }
+ else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
+ $o = @fbsql_fetch_field($this->_queryID);// fbsql returns the max length less spaces -- so it is unrealiable
+ //$o->max_length = -1;
+ }
+
+ return $o;
+ }
+
+ function _seek($row)
+ {
+ return @fbsql_data_seek($this->_queryID,$row);
+ }
+
+ function _fetch($ignore_fields=false)
+ {
+ $this->fields = @fbsql_fetch_array($this->_queryID,$this->fetchMode);
+ return ($this->fields == true);
+ }
+
+ function _close() {
+ return @fbsql_free_result($this->_queryID);
+ }
+
+ function MetaType($t,$len=-1,$fieldobj=false)
+ {
+ if (is_object($t)) {
+ $fieldobj = $t;
+ $t = $fieldobj->type;
+ $len = $fieldobj->max_length;
+ }
+ $len = -1; // fbsql max_length is not accurate
+ switch (strtoupper($t)) {
+ case 'CHARACTER':
+ case 'CHARACTER VARYING':
+ case 'BLOB':
+ case 'CLOB':
+ case 'BIT':
+ case 'BIT VARYING':
+ if ($len <= $this->blobSize) return 'C';
+
+ // so we have to check whether binary...
+ case 'IMAGE':
+ case 'LONGBLOB':
+ case 'BLOB':
+ case 'MEDIUMBLOB':
+ return !empty($fieldobj->binary) ? 'B' : 'X';
+
+ case 'DATE': return 'D';
+
+ case 'TIME':
+ case 'TIME WITH TIME ZONE':
+ case 'TIMESTAMP':
+ case 'TIMESTAMP WITH TIME ZONE': return 'T';
+
+ case 'PRIMARY_KEY':
+ return 'R';
+ case 'INTEGER':
+ case 'SMALLINT':
+ case 'BOOLEAN':
+
+ if (!empty($fieldobj->primary_key)) return 'R';
+ else return 'I';
+
+ default: return 'N';
+ }
+ }
+
+} //class
+} // defined
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-firebird.inc.php b/lib/adodb/drivers/adodb-firebird.inc.php
index b5f10be2d6..f622263cec 100644
--- a/lib/adodb/drivers/adodb-firebird.inc.php
+++ b/lib/adodb/drivers/adodb-firebird.inc.php
@@ -1,69 +1,75 @@
-ADODB_ibase();
- }
-
- function ServerInfo()
- {
- $arr['dialect'] = $this->dialect;
- switch($arr['dialect']) {
- case '':
- case '1': $s = 'Firebird Dialect 1'; break;
- case '2': $s = 'Firebird Dialect 2'; break;
- default:
- case '3': $s = 'Firebird Dialect 3'; break;
- }
- $arr['version'] = ADOConnection::_findvers($s);
- $arr['description'] = $s;
- return $arr;
- }
-
- // Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars!
- // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
- // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
- function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0)
- {
- $str = 'SELECT ';
- if ($nrows >= 0) $str .= "FIRST $nrows ";
- $str .=($offset>=0) ? "SKIP $offset " : '';
-
- $sql = preg_replace('/^[ \t]*select/i',$str,$sql);
- if ($secs)
- $rs =& $this->CacheExecute($secs,$sql,$inputarr);
- else
- $rs =& $this->Execute($sql,$inputarr);
-
- return $rs;
- }
-
-
-};
-
-
-class ADORecordSet_firebird extends ADORecordSet_ibase {
-
- var $databaseType = "firebird";
-
- function ADORecordSet_firebird($id,$mode=false)
- {
- $this->ADORecordSet_ibase($id,$mode);
- }
-}
+ADODB_ibase();
+ }
+
+ function ServerInfo()
+ {
+ $arr['dialect'] = $this->dialect;
+ switch($arr['dialect']) {
+ case '':
+ case '1': $s = 'Firebird Dialect 1'; break;
+ case '2': $s = 'Firebird Dialect 2'; break;
+ default:
+ case '3': $s = 'Firebird Dialect 3'; break;
+ }
+ $arr['version'] = ADOConnection::_findvers($s);
+ $arr['description'] = $s;
+ return $arr;
+ }
+
+ // Note that Interbase 6.5 uses this ROWS instead - don't you love forking wars!
+ // SELECT col1, col2 FROM table ROWS 5 -- get 5 rows
+ // SELECT col1, col2 FROM TABLE ORDER BY col1 ROWS 3 TO 7 -- first 5 skip 2
+ function &SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false, $secs=0)
+ {
+ $str = 'SELECT ';
+ if ($nrows >= 0) $str .= "FIRST $nrows ";
+ $str .=($offset>=0) ? "SKIP $offset " : '';
+
+ $sql = preg_replace('/^[ \t]*select/i',$str,$sql);
+ if ($secs)
+ $rs =& $this->CacheExecute($secs,$sql,$inputarr);
+ else
+ $rs =& $this->Execute($sql,$inputarr);
+
+ return $rs;
+ }
+
+
+};
+
+
+class ADORecordSet_firebird extends ADORecordSet_ibase {
+
+ var $databaseType = "firebird";
+
+ function ADORecordSet_firebird($id,$mode=false)
+ {
+ $this->ADORecordSet_ibase($id,$mode);
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-ibase.inc.php b/lib/adodb/drivers/adodb-ibase.inc.php
index e9e7c94eea..f0b52a6f89 100644
--- a/lib/adodb/drivers/adodb-ibase.inc.php
+++ b/lib/adodb/drivers/adodb-ibase.inc.php
@@ -1,812 +1,859 @@
-
- changed transaction handling and added experimental blob stuff
-
- Docs to interbase at the website
- http://www.synectics.co.za/php3/tutorial/IB_PHP3_API.html
-
- To use gen_id(), see
- http://www.volny.cz/iprenosil/interbase/ip_ib_code.htm#_code_creategen
-
- $rs = $conn->Execute('select gen_id(adodb,1) from rdb$database');
- $id = $rs->fields[0];
- $conn->Execute("insert into table (id, col1,...) values ($id, $val1,...)");
-*/
-
-
-class ADODB_ibase extends ADOConnection {
- var $databaseType = "ibase";
- var $dataProvider = "ibase";
- var $replaceQuote = "''"; // string to use to replace quotes
- var $ibase_timefmt = '%Y-%m-%d'; // For hours,mins,secs change to '%Y-%m-%d %H:%M:%S';
- var $fmtDate = "'Y-m-d'";
- var $fmtTimeStamp = "'Y-m-d, H:i:s'";
- var $concat_operator='||';
- var $_transactionID;
- var $metaTablesSQL = "select rdb\$relation_name from rdb\$relations where rdb\$relation_name not like 'RDB\$%'";
- //OPN STUFF start
- var $metaColumnsSQL = "select a.rdb\$field_name, a.rdb\$null_flag, a.rdb\$default_source, b.rdb\$field_length, b.rdb\$field_scale, b.rdb\$field_sub_type, b.rdb\$field_precision, b.rdb\$field_type from rdb\$relation_fields a, rdb\$fields b where a.rdb\$field_source = b.rdb\$field_name and a.rdb\$relation_name = '%s' order by a.rdb\$field_position asc";
- //OPN STUFF end
- var $ibasetrans;
- var $hasGenID = true;
- var $_bindInputArray = true;
- var $buffers = 0;
- var $dialect = 1;
- var $sysDate = "cast('TODAY' as date)";
- var $sysTimeStamp = "cast('NOW' as timestamp)";
- var $ansiOuter = true;
- var $hasAffectedRows = false;
- var $poorAffectedRows = true;
- var $blobEncodeType = 'C';
-
- function ADODB_ibase()
- {
- if (defined('IBASE_DEFAULT')) $this->ibasetrans = IBASE_DEFAULT;
- }
-
- function MetaPrimaryKeys($table,$owner_notused=false,$internalKey=false)
- {
- if ($internalKey) return array('RDB$DB_KEY');
-
- $table = strtoupper($table);
-
- $sql = 'SELECT S.RDB$FIELD_NAME AFIELDNAME
- FROM RDB$INDICES I JOIN RDB$INDEX_SEGMENTS S ON I.RDB$INDEX_NAME=S.RDB$INDEX_NAME
- WHERE I.RDB$RELATION_NAME=\''.$table.'\' and I.RDB$INDEX_NAME like \'RDB$PRIMARY%\'
- ORDER BY I.RDB$INDEX_NAME,S.RDB$FIELD_POSITION';
-
- $a = $this->GetCol($sql,false,true);
- if ($a && sizeof($a)>0) return $a;
- return false;
- }
-
- function ServerInfo()
- {
- $arr['dialect'] = $this->dialect;
- switch($arr['dialect']) {
- case '':
- case '1': $s = 'Interbase 5.5 or earlier'; break;
- case '2': $s = 'Interbase 5.6'; break;
- default:
- case '3': $s = 'Interbase 6.0'; break;
- }
- $arr['version'] = ADOConnection::_findvers($s);
- $arr['description'] = $s;
- return $arr;
- }
-
- function BeginTrans()
- {
- if ($this->transOff) return true;
- $this->transCnt += 1;
- $this->autoCommit = false;
- $this->_transactionID = $this->_connectionID;//ibase_trans($this->ibasetrans, $this->_connectionID);
- return $this->_transactionID;
- }
-
- function CommitTrans($ok=true)
- {
- if (!$ok) return $this->RollbackTrans();
- if ($this->transOff) return true;
- if ($this->transCnt) $this->transCnt -= 1;
- $ret = false;
- $this->autoCommit = true;
- if ($this->_transactionID) {
- //print ' commit ';
- $ret = ibase_commit($this->_transactionID);
- }
- $this->_transactionID = false;
- return $ret;
- }
-
- function RollbackTrans()
- {
- if ($this->transOff) return true;
- if ($this->transCnt) $this->transCnt -= 1;
- $ret = false;
- $this->autoCommit = true;
- if ($this->_transactionID)
- $ret = ibase_rollback($this->_transactionID);
- $this->_transactionID = false;
-
- return $ret;
- }
-
- function &MetaIndexes ($table, $primary = FALSE, $owner=false)
- {
- // save old fetch mode
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- if ($this->fetchMode !== FALSE) {
- $savem = $this->SetFetchMode(FALSE);
- }
- $table = strtoupper($table);
- $sql = "SELECT * FROM RDB\$INDICES WHERE RDB\$RELATION_NAME = '".$table."'";
- if (!$primary) {
- $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$%'";
- } else {
- $sql .= " AND RDB\$INDEX_NAME NOT LIKE 'RDB\$FOREIGN%'";
- }
- // get index details
- $rs = $this->Execute($sql);
- if (!is_object($rs)) {
- // restore fetchmode
- if (isset($savem)) {
- $this->SetFetchMode($savem);
- }
- $ADODB_FETCH_MODE = $save;
- return FALSE;
- }
-
- $indexes = array ();
- while ($row = $rs->FetchRow()) {
- $index = $row[0];
- if (!isset($indexes[$index])) {
- if (is_null($row[3])) {$row[3] = 0;}
- $indexes[$index] = array(
- 'unique' => ($row[3] == 1),
- 'columns' => array()
- );
- }
- $sql = "SELECT * FROM RDB\$INDEX_SEGMENTS WHERE RDB\$INDEX_NAME = '".$name."' ORDER BY RDB\$FIELD_POSITION ASC";
- $rs1 = $this->Execute($sql);
- while ($row1 = $rs1->FetchRow()) {
- $indexes[$index]['columns'][$row1[2]] = $row1[1];
- }
- }
- // restore fetchmode
- if (isset($savem)) {
- $this->SetFetchMode($savem);
- }
- $ADODB_FETCH_MODE = $save;
-
- return $indexes;
- }
-
-
- // See http://community.borland.com/article/0,1410,25844,00.html
- function RowLock($tables,$where,$col)
- {
- if ($this->autoCommit) $this->BeginTrans();
- $this->Execute("UPDATE $table SET $col=$col WHERE $where "); // is this correct - jlim?
- return 1;
- }
-
-
- function CreateSequence($seqname,$startID=1)
- {
- $ok = $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
- if (!$ok) return false;
- return $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
- }
-
- function DropSequence($seqname)
- {
- $seqname = strtoupper($seqname);
- $this->Execute("delete from RDB\$GENERATORS where RDB\$GENERATOR_NAME='$seqname'");
- }
-
- function GenID($seqname='adodbseq',$startID=1)
- {
- $getnext = ("SELECT Gen_ID($seqname,1) FROM RDB\$DATABASE");
- $rs = @$this->Execute($getnext);
- if (!$rs) {
- $this->Execute(("INSERT INTO RDB\$GENERATORS (RDB\$GENERATOR_NAME) VALUES (UPPER('$seqname'))" ));
- $this->Execute("SET GENERATOR $seqname TO ".($startID-1).';');
- $rs = $this->Execute($getnext);
- }
- if ($rs && !$rs->EOF) $this->genID = (integer) reset($rs->fields);
- else $this->genID = 0; // false
-
- if ($rs) $rs->Close();
-
- return $this->genID;
- }
-
- function SelectDB($dbName)
- {
- return false;
- }
-
- function _handleerror()
- {
- $this->_errorMsg = ibase_errmsg();
- }
-
- function ErrorNo()
- {
- if (preg_match('/error code = ([\-0-9]*)/i', $this->_errorMsg,$arr)) return (integer) $arr[1];
- else return 0;
- }
-
- function ErrorMsg()
- {
- return $this->_errorMsg;
- }
-
- // returns true or false
- function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- if (!function_exists('ibase_pconnect')) return false;
- if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
- $this->_connectionID = ibase_connect($argHostname,$argUsername,$argPassword,$this->charSet,$this->buffers,$this->dialect);
- if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html
- $this->replaceQuote = "''";
- }
- if ($this->_connectionID === false) {
- $this->_handleerror();
- return false;
- }
-
- ibase_timefmt($this->ibase_timefmt);
- return true;
- }
- // returns true or false
- function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
- {
- if (!function_exists('ibase_pconnect')) return false;
- if ($argDatabasename) $argHostname .= ':'.$argDatabasename;
- $this->_connectionID = ibase_pconnect($argHostname,$argUsername,$argPassword,$this->charSet,$this->buffers,$this->dialect);
- if ($this->dialect != 1) { // http://www.ibphoenix.com/ibp_60_del_id_ds.html
- $this->replaceQuote = "''";
- }
- if ($this->_connectionID === false) {
- $this->_handleerror();
- return false;
- }
-
- ibase_timefmt($this->ibase_timefmt);
- return true;
- }
-
- function Prepare($sql)
- {
- $stmt = ibase_prepare($this->_connectionID,$sql);
- if (!$stmt) return false;
- return array($sql,$stmt);
- }
-
- // returns query ID if successful, otherwise false
- // there have been reports of problems with nested queries - the code is probably not re-entrant?
- function _query($sql,$iarr=false)
- {
-
- if (!$this->autoCommit && $this->_transactionID) {
- $conn = $this->_transactionID;
- $docommit = false;
- } else {
- $conn = $this->_connectionID;
- $docommit = true;
- }
- if (is_array($sql)) {
- $fn = 'ibase_execute';
- $sql = $sql[1];
-
- if (is_array($iarr)) {
- if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
- $fnarr =& array_merge( array($sql) , $iarr);
- $ret = call_user_func_array($fn,$fnarr);
- } else {
- switch(sizeof($iarr)) {
- case 1: $ret = $fn($sql,$iarr[0]); break;
- case 2: $ret = $fn($sql,$iarr[0],$iarr[1]); break;
- case 3: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2]); break;
- case 4: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
- case 5: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
- case 6: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
- case 7: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
- default: ADOConnection::outp( "Too many parameters to ibase query $sql");
- case 8: $ret = $fn($sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
- }
- }
- } else $ret = $fn($sql);
- } else {
- $fn = 'ibase_query';
-
- if (is_array($iarr)) {
- if (ADODB_PHPVER >= 0x4050) { // actually 4.0.4
- $fnarr =& array_merge( array($conn,$sql) , $iarr);
- $ret = call_user_func_array($fn,$fnarr);
- } else {
- switch(sizeof($iarr)) {
- case 1: $ret = $fn($conn,$sql,$iarr[0]); break;
- case 2: $ret = $fn($conn,$sql,$iarr[0],$iarr[1]); break;
- case 3: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2]); break;
- case 4: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3]); break;
- case 5: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4]); break;
- case 6: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5]); break;
- case 7: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6]); break;
- default: ADOConnection::outp( "Too many parameters to ibase query $sql");
- case 8: $ret = $fn($conn,$sql,$iarr[0],$iarr[1],$iarr[2],$iarr[3],$iarr[4],$iarr[5],$iarr[6],$iarr[7]); break;
- }
- }
- } else $ret = $fn($conn,$sql);
- }
- if ($docommit && $ret === true) ibase_commit($this->_connectionID);
-
- $this->_handleerror();
- return $ret;
- }
-
- // returns true or false
- function _close()
- {
- if (!$this->autoCommit) @ibase_rollback($this->_connectionID);
- return @ibase_close($this->_connectionID);
- }
-
- //OPN STUFF start
- function _ConvertFieldType(&$fld, $ftype, $flen, $fscale, $fsubtype, $fprecision, $isInterbase6)
- {
- $fscale = abs($fscale);
- $fld->max_length = $flen;
- $fld->scale = null;
- switch($ftype){
- case 7:
- case 8:
- if ($isInterbase6) {
- switch($fsubtype){
- case 0:
- $fld->type = ($ftype == 7 ? 'smallint' : 'integer');
- break;
- case 1:
- $fld->type = 'numeric';
- $fld->max_length = $fprecision;
- $fld->scale = $fscale;
- break;
- case 2:
- $fld->type = 'decimal';
- $fld->max_length = $fprecision;
- $fld->scale = $fscale;
- break;
- } // switch
- } else {
- if ($fscale !=0) {
- $fld->type = 'decimal';
- $fld->scale = $fscale;
- $fld->max_length = ($ftype == 7 ? 4 : 9);
- } else {
- $fld->type = ($ftype == 7 ? 'smallint' : 'integer');
- }
- }
- break;
- case 16:
- if ($isInterbase6) {
- switch($fsubtype){
- case 0:
- $fld->type = 'decimal';
- $fld->max_length = 18;
- $fld->scale = 0;
- break;
- case 1:
- $fld->type = 'numeric';
- $fld->max_length = $fprecision;
- $fld->scale = $fscale;
- break;
- case 2:
- $fld->type = 'decimal';
- $fld->max_length = $fprecision;
- $fld->scale = $fscale;
- break;
- } // switch
- }
- break;
- case 10:
- $fld->type = 'float';
- break;
- case 14:
- $fld->type = 'char';
- break;
- case 27:
- if ($fscale !=0) {
- $fld->type = 'decimal';
- $fld->max_length = 15;
- $fld->scale = 5;
- } else {
- $fld->type = 'double';
- }
- break;
- case 35:
- if ($isInterbase6) {
- $fld->type = 'timestamp';
- } else {
- $fld->type = 'date';
- }
- break;
- case 12:
- case 13:
- $fld->type = 'date';
- break;
- case 37:
- $fld->type = 'varchar';
- break;
- case 40:
- $fld->type = 'cstring';
- break;
- case 261:
- $fld->type = 'blob';
- $fld->max_length = -1;
- break;
- } // switch
- }
- //OPN STUFF end
- // returns array of ADOFieldObjects for current table
- function &MetaColumns($table)
- {
- global $ADODB_FETCH_MODE;
-
- if ($this->metaColumnsSQL) {
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
-
- $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
-
- $ADODB_FETCH_MODE = $save;
- if ($rs === false) return false;
-
- $retarr = array();
- //OPN STUFF start
- $isInterbase6 = ($this->dialect==3 ? true : false);
- //OPN STUFF end
- while (!$rs->EOF) { //print_r($rs->fields);
- $fld = new ADOFieldObject();
- $fld->name = trim($rs->fields[0]);
- //OPN STUFF start
- $this->_ConvertFieldType($fld, $rs->fields[7], $rs->fields[3], $rs->fields[4], $rs->fields[5], $rs->fields[6], $isInterbase6);
- if (isset($rs->fields[1]) && $rs->fields[1]) {
- $fld->not_null = true;
- }
- if (isset($rs->fields[2])) {
-
- $fld->has_default = true;
- $d = substr($rs->fields[2],strlen('default '));
- switch ($fld->type)
- {
- case 'smallint':
- case 'integer': $fld->default_value = (int) $d; break;
- case 'char':
- case 'blob':
- case 'text':
- case 'varchar': $fld->default_value = (string) substr($d,1,strlen($d)-2); break;
- case 'double':
- case 'float': $fld->default_value = (float) $d; break;
- default: $fld->default_value = $d; break;
- }
- // case 35:$tt = 'TIMESTAMP'; break;
- }
- if ((isset($rs->fields[5])) && ($fld->type == 'blob')) {
- $fld->sub_type = $rs->fields[5];
- } else {
- $fld->sub_type = null;
- }
- //OPN STUFF end
- if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
- else $retarr[strtoupper($fld->name)] = $fld;
-
- $rs->MoveNext();
- }
- $rs->Close();
- return $retarr;
- }
- return false;
- }
-
- function BlobEncode( $blob )
- {
- $blobid = ibase_blob_create( $this->_connectionID);
- ibase_blob_add( $blobid, $blob );
- return ibase_blob_close( $blobid );
- }
-
- // since we auto-decode all blob's since 2.42,
- // BlobDecode should not do any transforms
- function BlobDecode($blob)
- {
- return $blob;
- }
-
-
-
-
- // old blobdecode function
- // still used to auto-decode all blob's
- function _BlobDecode( $blob )
- {
- $blobid = ibase_blob_open( $blob );
- $realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet
';
- } else {
- $len = -1;
- if ($v === ' ') $len = 1;
- if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again
- $bindarr[$k] = $v;
- } else { // dynamic sql, so rebind every time
- OCIBindByName($stmt,":$k",$inputarr[$k],$len);
- }
- }
- }
- }
-
- $this->_errorMsg = false;
- $this->_errorCode = false;
- if (OCIExecute($stmt,$this->_commit)) {
-
- switch (@OCIStatementType($stmt)) {
- case "SELECT":
- return $stmt;
-
- case "BEGIN":
- if (is_array($sql) && !empty($sql[4])) {
- $cursor = $sql[4];
- if (is_resource($cursor)) {
- $ok = OCIExecute($cursor);
- return $cursor;
- }
- return $stmt;
- } else {
- if (is_resource($stmt)) {
- OCIFreeStatement($stmt);
- return true;
- }
- return $stmt;
- }
- break;
- default :
- // ociclose -- no because it could be used in a LOB?
- return true;
- }
- }
- return false;
- }
-
- // returns true or false
- function _close()
- {
- if (!$this->autoCommit) OCIRollback($this->_connectionID);
- OCILogoff($this->_connectionID);
- $this->_stmt = false;
- $this->_connectionID = false;
- }
-
- function MetaPrimaryKeys($table, $owner=false,$internalKey=false)
- {
- if ($internalKey) return array('ROWID');
-
- // tested with oracle 8.1.7
- $table = strtoupper($table);
- if ($owner) {
- $owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))";
- $ptab = 'ALL_';
- } else {
- $owner_clause = '';
- $ptab = 'USER_';
- }
- $sql = "
-SELECT /*+ RULE */ distinct b.column_name
- FROM {$ptab}CONSTRAINTS a
- , {$ptab}CONS_COLUMNS b
- WHERE ( UPPER(b.table_name) = ('$table'))
- AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P')
- $owner_clause
- AND (a.constraint_name = b.constraint_name)";
-
- $rs = $this->Execute($sql);
- if ($rs && !$rs->EOF) {
- $arr =& $rs->GetArray();
- $a = array();
- foreach($arr as $v) {
- $a[] = reset($v);
- }
- return $a;
- }
- else return false;
- }
-
- // http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html
- function MetaForeignKeys($table, $owner=false)
- {
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $table = $this->qstr(strtoupper($table));
- if (!$owner) {
- $owner = $this->user;
- $tabp = 'user_';
- } else
- $tabp = 'all_';
-
- $owner = ' and owner='.$this->qstr(strtoupper($owner));
-
- $sql =
-"select constraint_name,r_owner,r_constraint_name
- from {$tabp}constraints
- where constraint_type = 'R' and table_name = $table $owner";
-
- $constraints =& $this->GetArray($sql);
- $arr = false;
- foreach($constraints as $constr) {
- $cons = $this->qstr($constr[0]);
- $rowner = $this->qstr($constr[1]);
- $rcons = $this->qstr($constr[2]);
- $cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position");
- $tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position");
-
- if ($cols && $tabcol)
- for ($i=0, $max=sizeof($cols); $i < $max; $i++) {
- $arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1];
- }
- }
- $ADODB_FETCH_MODE = $save;
-
- return $arr;
- }
-
-
- function CharMax()
- {
- return 4000;
- }
-
- function TextMax()
- {
- return 4000;
- }
-
- /**
- * Quotes a string.
- * An example is $db->qstr("Don't bother",magic_quotes_runtime());
- *
- * @param s the string to quote
- * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc().
- * This undoes the stupidity of magic quotes for GPC.
- *
- * @return quoted string to be sent back to database
- */
- function qstr($s,$magic_quotes=false)
- {
- $nofixquotes=false;
-
- if (is_array($s)) adodb_backtrace();
- if ($this->noNullStrings && strlen($s)==0)$s = ' ';
- if (!$magic_quotes) {
- if ($this->replaceQuote[0] == '\\'){
- $s = str_replace('\\','\\\\',$s);
- }
- return "'".str_replace("'",$this->replaceQuote,$s)."'";
- }
-
- // undo magic quotes for "
- $s = str_replace('\\"','"',$s);
-
- if ($this->replaceQuote == "\\'") // ' already quoted, no need to change anything
- return "'$s'";
- else {// change \' to '' for sybase/mssql
- $s = str_replace('\\\\','\\',$s);
- return "'".str_replace("\\'",$this->replaceQuote,$s)."'";
- }
- }
-
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordset_oci8 extends ADORecordSet {
-
- var $databaseType = 'oci8';
- var $bind=false;
- var $_fieldobjs;
- //var $_arr = false;
-
- function ADORecordset_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 Init()
- {
- if ($this->_inited) return;
-
- $this->_inited = true;
- if ($this->_queryID) {
-
- $this->_currentRow = 0;
- @$this->_initrs();
- $this->EOF = !$this->_fetch();
-
- /*
- // based on idea by Gaetano Giunta to detect unusual oracle errors
- // see http://phplens.com/lens/lensforum/msgs.php?id=6771
- $err = OCIError($this->_queryID);
- if ($err && $this->connection->debug) ADOConnection::outp($err);
- */
-
- if (!is_array($this->fields)) {
- $this->_numOfRows = 0;
- $this->fields = array();
- }
- } else {
- $this->fields = array();
- $this->_numOfRows = 0;
- $this->_numOfFields = 0;
- $this->EOF = true;
- }
- }
-
- function _initrs()
- {
- $this->_numOfRows = -1;
- $this->_numOfFields = OCInumcols($this->_queryID);
- if ($this->_numOfFields>0) {
- $this->_fieldobjs = array();
- $max = $this->_numOfFields;
- for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i);
- }
- }
-
- /* Returns: an object containing field information.
- Get column information in the Recordset object. fetchField() can be used in order to obtain information about
- fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
- fetchField() is retrieved. */
-
- function &_FetchField($fieldOffset = -1)
- {
- $fld = new ADOFieldObject;
- $fieldOffset += 1;
- $fld->name =OCIcolumnname($this->_queryID, $fieldOffset);
- $fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
- $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
- if ($fld->type == 'NUMBER') {
- $p = OCIColumnPrecision($this->_queryID, $fieldOffset);
- $sc = OCIColumnScale($this->_queryID, $fieldOffset);
- if ($p != 0 && $sc == 0) $fld->type = 'INT';
- //echo " $this->name ($p.$sc) ";
- }
- return $fld;
- }
-
- /* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */
- function &FetchField($fieldOffset = -1)
- {
- return $this->_fieldobjs[$fieldOffset];
- }
-
-
- // 10% speedup to move MoveNext to child class
- function MoveNext()
- {
- //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this);
-
- if ($this->EOF) return false;
-
- $this->_currentRow++;
- if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode))
- return true;
- $this->EOF = true;
-
- return false;
- }
-
- /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
- function &GetArrayLimit($nrows,$offset=-1)
- {
- if ($offset <= 0) {
- $arr =& $this->GetArray($nrows);
- return $arr;
- }
- for ($i=1; $i < $offset; $i++)
- if (!@OCIFetch($this->_queryID)) return array();
-
- if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return array();
- $results = array();
- $cnt = 0;
- while (!$this->EOF && $nrows != $cnt) {
- $results[$cnt++] = $this->fields;
- $this->MoveNext();
- }
-
- return $results;
- }
-
-
- /* Use associative array to get fields array */
- function Fields($colname)
- {
- if (!$this->bind) {
- $this->bind = array();
- for ($i=0; $i < $this->_numOfFields; $i++) {
- $o = $this->FetchField($i);
- $this->bind[strtoupper($o->name)] = $i;
- }
- }
-
- return $this->fields[$this->bind[strtoupper($colname)]];
- }
-
-
-
- function _seek($row)
- {
- return false;
- }
-
- function _fetch()
- {
- return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
- }
-
- /* close() only needs to be called if you are worried about using too much memory while your script
- is running. All associated result memory for the specified result identifier will automatically be freed. */
-
- function _close()
- {
- if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false;
- OCIFreeStatement($this->_queryID);
- $this->_queryID = false;
-
- }
-
- function MetaType($t,$len=-1)
- {
- if (is_object($t)) {
- $fieldobj = $t;
- $t = $fieldobj->type;
- $len = $fieldobj->max_length;
- }
- switch (strtoupper($t)) {
- case 'VARCHAR':
- case 'VARCHAR2':
- case 'CHAR':
- case 'VARBINARY':
- case 'BINARY':
- case 'NCHAR':
- case 'NVARCHAR':
- case 'NVARCHAR2':
- if (isset($this) && $len <= $this->blobSize) return 'C';
-
- case 'NCLOB':
- case 'LONG':
- case 'LONG VARCHAR':
- case 'CLOB':
- return 'X';
-
- case 'LONG RAW':
- case 'LONG VARBINARY':
- case 'BLOB':
- return 'B';
-
- case 'DATE':
- return ($this->connection->datetime) ? 'T' : 'D';
-
-
- case 'TIMESTAMP': return 'T';
-
- case 'INT':
- case 'SMALLINT':
- case 'INTEGER':
- return 'I';
-
- default: return 'N';
- }
- }
-}
+
+
+ 13 Nov 2000 jlim - removed all ora_* references.
+*/
+
+// security - hide paths
+if (!defined('ADODB_DIR')) die();
+
+/*
+NLS_Date_Format
+Allows you to use a date format other than the Oracle Lite default. When a literal
+character string appears where a date value is expected, the Oracle Lite database
+tests the string to see if it matches the formats of Oracle, SQL-92, or the value
+specified for this parameter in the POLITE.INI file. Setting this parameter also
+defines the default format used in the TO_CHAR or TO_DATE functions when no
+other format string is supplied.
+
+For Oracle the default is dd-mon-yy or dd-mon-yyyy, and for SQL-92 the default is
+yy-mm-dd or yyyy-mm-dd.
+
+Using 'RR' in the format forces two-digit years less than or equal to 49 to be
+interpreted as years in the 21st century (2000–2049), and years over 50 as years in
+the 20th century (1950–1999). Setting the RR format as the default for all two-digit
+year entries allows you to become year-2000 compliant. For example:
+NLS_DATE_FORMAT='RR-MM-DD'
+
+You can also modify the date format using the ALTER SESSION command.
+*/
+
+# define the LOB descriptor type for the given type
+# returns false if no LOB descriptor
+function oci_lob_desc($type) {
+ switch ($type) {
+ case OCI_B_BFILE: $result = OCI_D_FILE; break;
+ case OCI_B_CFILEE: $result = OCI_D_FILE; break;
+ case OCI_B_CLOB: $result = OCI_D_LOB; break;
+ case OCI_B_BLOB: $result = OCI_D_LOB; break;
+ case OCI_B_ROWID: $result = OCI_D_ROWID; break;
+ default: $result = false; break;
+ }
+ return $result;
+}
+
+class ADODB_oci8 extends ADOConnection {
+ var $databaseType = 'oci8';
+ var $dataProvider = 'oci8';
+ var $replaceQuote = "''"; // string to use to replace quotes
+ var $concat_operator='||';
+ var $sysDate = "TRUNC(SYSDATE)";
+ var $sysTimeStamp = 'SYSDATE';
+ var $metaDatabasesSQL = "SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','OUTLN') ORDER BY 1";
+ var $_stmt;
+ var $_commit = OCI_COMMIT_ON_SUCCESS;
+ var $_initdate = true; // init date to YYYY-MM-DD
+ var $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW')";
+ var $metaColumnsSQL = "select cname,coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
+ var $_bindInputArray = true;
+ var $hasGenID = true;
+ var $_genIDSQL = "SELECT (%s.nextval) FROM DUAL";
+ var $_genSeqSQL = "CREATE SEQUENCE %s START WITH %s";
+ var $_dropSeqSQL = "DROP SEQUENCE %s";
+ var $hasAffectedRows = true;
+ var $random = "abs(mod(DBMS_RANDOM.RANDOM,10000001)/10000000)";
+ var $noNullStrings = false;
+ var $connectSID = false;
+ var $_bind = false;
+ var $_hasOCIFetchStatement = false;
+ var $_getarray = false; // currently not working
+ var $leftOuter = ''; // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER
+ var $session_sharing_force_blob = false; // alter session on updateblob if set to true
+ var $firstrows = true; // enable first rows optimization on SelectLimit()
+ var $selectOffsetAlg1 = 100; // when to use 1st algorithm of selectlimit.
+ var $NLS_DATE_FORMAT = 'YYYY-MM-DD'; // To include time, use 'RRRR-MM-DD HH24:MI:SS'
+ var $useDBDateFormatForTextInput=false;
+ var $datetime = false; // MetaType('DATE') returns 'D' (datetime==false) or 'T' (datetime == true)
+ var $_refLOBs = array();
+
+ // var $ansiOuter = true; // if oracle9
+
+ function ADODB_oci8()
+ {
+ $this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
+ }
+
+ /* Function &MetaColumns($table) added by smondino@users.sourceforge.net*/
+ function &MetaColumns($table)
+ {
+ global $ADODB_FETCH_MODE;
+
+ $save = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ if ($this->fetchMode !== false) $savem = $this->SetFetchMode(false);
+
+ $rs = $this->Execute(sprintf($this->metaColumnsSQL,strtoupper($table)));
+
+ if (isset($savem)) $this->SetFetchMode($savem);
+ $ADODB_FETCH_MODE = $save;
+ if (!$rs) return false;
+ $retarr = array();
+ while (!$rs->EOF) { //print_r($rs->fields);
+ $fld = new ADOFieldObject();
+ $fld->name = $rs->fields[0];
+ $fld->type = $rs->fields[1];
+ $fld->max_length = $rs->fields[2];
+ $fld->scale = $rs->fields[3];
+ if ($rs->fields[1] == 'NUMBER' && $rs->fields[3] == 0) {
+ $fld->type ='INT';
+ $fld->max_length = $rs->fields[4];
+ }
+ $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0);
+ $fld->binary = (strpos($fld->type,'BLOB') !== false);
+ $fld->default_value = $rs->fields[6];
+
+ if ($ADODB_FETCH_MODE == ADODB_FETCH_NUM) $retarr[] = $fld;
+ else $retarr[strtoupper($fld->name)] = $fld;
+ $rs->MoveNext();
+ }
+ $rs->Close();
+ return $retarr;
+ }
+
+ function Time()
+ {
+ $rs =& $this->Execute("select TO_CHAR($this->sysTimeStamp,'YYYY-MM-DD HH24:MI:SS') from dual");
+ if ($rs && !$rs->EOF) return $this->UnixTimeStamp(reset($rs->fields));
+
+ return false;
+ }
+
+/*
+
+ Multiple modes of connection are supported:
+
+ a. Local Database
+ $conn->Connect(false,'scott','tiger');
+
+ b. From tnsnames.ora
+ $conn->Connect(false,'scott','tiger',$tnsname);
+ $conn->Connect($tnsname,'scott','tiger');
+
+ c. Server + service name
+ $conn->Connect($serveraddress,'scott,'tiger',$service_name);
+
+ d. Server + SID
+ $conn->connectSID = true;
+ $conn->Connect($serveraddress,'scott,'tiger',$SID);
+
+
+Example TNSName:
+---------------
+NATSOFT.DOMAIN =
+ (DESCRIPTION =
+ (ADDRESS_LIST =
+ (ADDRESS = (PROTOCOL = TCP)(HOST = kermit)(PORT = 1523))
+ )
+ (CONNECT_DATA =
+ (SERVICE_NAME = natsoft.domain)
+ )
+ )
+
+ There are 3 connection modes, 0 = non-persistent, 1 = persistent, 2 = force new connection
+
+*/
+ function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$mode=0)
+ {
+ if (!function_exists('OCIPLogon')) return null;
+
+
+ $this->_errorMsg = false;
+ $this->_errorCode = false;
+
+ if($argHostname) { // added by Jorma Tuomainen
';
+ } else {
+ $len = -1;
+ if ($v === ' ') $len = 1;
+ if (isset($bindarr)) { // is prepared sql, so no need to ocibindbyname again
+ $bindarr[$k] = $v;
+ } else { // dynamic sql, so rebind every time
+ OCIBindByName($stmt,":$k",$inputarr[$k],$len);
+ }
+ }
+ }
+ }
+
+ $this->_errorMsg = false;
+ $this->_errorCode = false;
+ if (OCIExecute($stmt,$this->_commit)) {
+//OCIInternalDebug(1);
+ if (count($this -> _refLOBs) > 0) {
+
+ foreach ($this -> _refLOBs as $key => $value) {
+ if ($this -> _refLOBs[$key]['TYPE'] == true) {
+ $tmp = $this -> _refLOBs[$key]['LOB'] -> load();
+ if ($this -> debug) {
+ ADOConnection::outp("OUT LOB: LOB has been loaded.
");
+ }
+ //$_GLOBALS[$this -> _refLOBs[$key]['VAR']] = $tmp;
+ $this -> _refLOBs[$key]['VAR'] = $tmp;
+ }
+ $this -> _refLOBs[$key]['LOB'] -> free();
+ unset($this -> _refLOBs[$key]);
+ }
+ }
+
+ switch (@OCIStatementType($stmt)) {
+ case "SELECT":
+ return $stmt;
+
+ case "BEGIN":
+ if (is_array($sql) && !empty($sql[4])) {
+ $cursor = $sql[4];
+ if (is_resource($cursor)) {
+ $ok = OCIExecute($cursor);
+ return $cursor;
+ }
+ return $stmt;
+ } else {
+ if (is_resource($stmt)) {
+ OCIFreeStatement($stmt);
+ return true;
+ }
+ return $stmt;
+ }
+ break;
+ default :
+ // ociclose -- no because it could be used in a LOB?
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // returns true or false
+ function _close()
+ {
+ if (!$this->autoCommit) OCIRollback($this->_connectionID);
+ if (count($this -> _refLOBs) > 0) {
+ foreach ($this -> _refLOBs as $key => $value) {
+ $this -> _refLOBs[$key] -> free();
+ unset($this -> _refLOBs[$key]);
+ }
+ }
+ OCILogoff($this->_connectionID);
+ $this->_stmt = false;
+ $this->_connectionID = false;
+ }
+
+ function MetaPrimaryKeys($table, $owner=false,$internalKey=false)
+ {
+ if ($internalKey) return array('ROWID');
+
+ // tested with oracle 8.1.7
+ $table = strtoupper($table);
+ if ($owner) {
+ $owner_clause = "AND ((a.OWNER = b.OWNER) AND (a.OWNER = UPPER('$owner')))";
+ $ptab = 'ALL_';
+ } else {
+ $owner_clause = '';
+ $ptab = 'USER_';
+ }
+ $sql = "
+SELECT /*+ RULE */ distinct b.column_name
+ FROM {$ptab}CONSTRAINTS a
+ , {$ptab}CONS_COLUMNS b
+ WHERE ( UPPER(b.table_name) = ('$table'))
+ AND (UPPER(a.table_name) = ('$table') and a.constraint_type = 'P')
+ $owner_clause
+ AND (a.constraint_name = b.constraint_name)";
+
+ $rs = $this->Execute($sql);
+ if ($rs && !$rs->EOF) {
+ $arr =& $rs->GetArray();
+ $a = array();
+ foreach($arr as $v) {
+ $a[] = reset($v);
+ }
+ return $a;
+ }
+ else return false;
+ }
+
+ // http://gis.mit.edu/classes/11.521/sqlnotes/referential_integrity.html
+ function MetaForeignKeys($table, $owner=false)
+ {
+ global $ADODB_FETCH_MODE;
+
+ $save = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ $table = $this->qstr(strtoupper($table));
+ if (!$owner) {
+ $owner = $this->user;
+ $tabp = 'user_';
+ } else
+ $tabp = 'all_';
+
+ $owner = ' and owner='.$this->qstr(strtoupper($owner));
+
+ $sql =
+"select constraint_name,r_owner,r_constraint_name
+ from {$tabp}constraints
+ where constraint_type = 'R' and table_name = $table $owner";
+
+ $constraints =& $this->GetArray($sql);
+ $arr = false;
+ foreach($constraints as $constr) {
+ $cons = $this->qstr($constr[0]);
+ $rowner = $this->qstr($constr[1]);
+ $rcons = $this->qstr($constr[2]);
+ $cols = $this->GetArray("select column_name from {$tabp}cons_columns where constraint_name=$cons $owner order by position");
+ $tabcol = $this->GetArray("select table_name,column_name from {$tabp}cons_columns where owner=$rowner and constraint_name=$rcons order by position");
+
+ if ($cols && $tabcol)
+ for ($i=0, $max=sizeof($cols); $i < $max; $i++) {
+ $arr[$tabcol[$i][0]] = $cols[$i][0].'='.$tabcol[$i][1];
+ }
+ }
+ $ADODB_FETCH_MODE = $save;
+
+ return $arr;
+ }
+
+
+ function CharMax()
+ {
+ return 4000;
+ }
+
+ function TextMax()
+ {
+ return 4000;
+ }
+
+ /**
+ * Quotes a string.
+ * An example is $db->qstr("Don't bother",magic_quotes_runtime());
+ *
+ * @param s the string to quote
+ * @param [magic_quotes] if $s is GET/POST var, set to get_magic_quotes_gpc().
+ * This undoes the stupidity of magic quotes for GPC.
+ *
+ * @return quoted string to be sent back to database
+ */
+ function qstr($s,$magic_quotes=false)
+ {
+ $nofixquotes=false;
+
+ if ($this->noNullStrings && strlen($s)==0)$s = ' ';
+ if (!$magic_quotes) {
+ if ($this->replaceQuote[0] == '\\'){
+ $s = str_replace('\\','\\\\',$s);
+ }
+ return "'".str_replace("'",$this->replaceQuote,$s)."'";
+ }
+
+ // undo magic quotes for "
+ $s = str_replace('\\"','"',$s);
+
+ $s = str_replace('\\\\','\\',$s);
+ return "'".str_replace("\\'",$this->replaceQuote,$s)."'";
+
+ }
+
+}
+
+/*--------------------------------------------------------------------------------------
+ Class Name: Recordset
+--------------------------------------------------------------------------------------*/
+
+class ADORecordset_oci8 extends ADORecordSet {
+
+ var $databaseType = 'oci8';
+ var $bind=false;
+ var $_fieldobjs;
+ //var $_arr = false;
+
+ function ADORecordset_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 Init()
+ {
+ if ($this->_inited) return;
+
+ $this->_inited = true;
+ if ($this->_queryID) {
+
+ $this->_currentRow = 0;
+ @$this->_initrs();
+ $this->EOF = !$this->_fetch();
+
+ /*
+ // based on idea by Gaetano Giunta to detect unusual oracle errors
+ // see http://phplens.com/lens/lensforum/msgs.php?id=6771
+ $err = OCIError($this->_queryID);
+ if ($err && $this->connection->debug) ADOConnection::outp($err);
+ */
+
+ if (!is_array($this->fields)) {
+ $this->_numOfRows = 0;
+ $this->fields = array();
+ }
+ } else {
+ $this->fields = array();
+ $this->_numOfRows = 0;
+ $this->_numOfFields = 0;
+ $this->EOF = true;
+ }
+ }
+
+ function _initrs()
+ {
+ $this->_numOfRows = -1;
+ $this->_numOfFields = OCInumcols($this->_queryID);
+ if ($this->_numOfFields>0) {
+ $this->_fieldobjs = array();
+ $max = $this->_numOfFields;
+ for ($i=0;$i<$max; $i++) $this->_fieldobjs[] = $this->_FetchField($i);
+ }
+ }
+
+ /* Returns: an object containing field information.
+ Get column information in the Recordset object. fetchField() can be used in order to obtain information about
+ fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
+ fetchField() is retrieved. */
+
+ function &_FetchField($fieldOffset = -1)
+ {
+ $fld = new ADOFieldObject;
+ $fieldOffset += 1;
+ $fld->name =OCIcolumnname($this->_queryID, $fieldOffset);
+ $fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
+ $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
+ if ($fld->type == 'NUMBER') {
+ $p = OCIColumnPrecision($this->_queryID, $fieldOffset);
+ $sc = OCIColumnScale($this->_queryID, $fieldOffset);
+ if ($p != 0 && $sc == 0) $fld->type = 'INT';
+ //echo " $this->name ($p.$sc) ";
+ }
+ return $fld;
+ }
+
+ /* For some reason, OCIcolumnname fails when called after _initrs() so we cache it */
+ function &FetchField($fieldOffset = -1)
+ {
+ return $this->_fieldobjs[$fieldOffset];
+ }
+
+
+ // 10% speedup to move MoveNext to child class
+ function MoveNext()
+ {
+ //global $ADODB_EXTENSION;if ($ADODB_EXTENSION) return @adodb_movenext($this);
+
+ if ($this->EOF) return false;
+
+ $this->_currentRow++;
+ if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode))
+ return true;
+ $this->EOF = true;
+
+ return false;
+ }
+
+ /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
+ function &GetArrayLimit($nrows,$offset=-1)
+ {
+ if ($offset <= 0) {
+ $arr =& $this->GetArray($nrows);
+ return $arr;
+ }
+ for ($i=1; $i < $offset; $i++)
+ if (!@OCIFetch($this->_queryID)) return array();
+
+ if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return array();
+ $results = array();
+ $cnt = 0;
+ while (!$this->EOF && $nrows != $cnt) {
+ $results[$cnt++] = $this->fields;
+ $this->MoveNext();
+ }
+
+ return $results;
+ }
+
+
+ /* Use associative array to get fields array */
+ function Fields($colname)
+ {
+ if (!$this->bind) {
+ $this->bind = array();
+ for ($i=0; $i < $this->_numOfFields; $i++) {
+ $o = $this->FetchField($i);
+ $this->bind[strtoupper($o->name)] = $i;
+ }
+ }
+
+ return $this->fields[$this->bind[strtoupper($colname)]];
+ }
+
+
+
+ function _seek($row)
+ {
+ return false;
+ }
+
+ function _fetch()
+ {
+ return @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
+ }
+
+ /* close() only needs to be called if you are worried about using too much memory while your script
+ is running. All associated result memory for the specified result identifier will automatically be freed. */
+
+ function _close()
+ {
+ if ($this->connection->_stmt === $this->_queryID) $this->connection->_stmt = false;
+ OCIFreeStatement($this->_queryID);
+ $this->_queryID = false;
+
+ }
+
+ function MetaType($t,$len=-1)
+ {
+ if (is_object($t)) {
+ $fieldobj = $t;
+ $t = $fieldobj->type;
+ $len = $fieldobj->max_length;
+ }
+ switch (strtoupper($t)) {
+ case 'VARCHAR':
+ case 'VARCHAR2':
+ case 'CHAR':
+ case 'VARBINARY':
+ case 'BINARY':
+ case 'NCHAR':
+ case 'NVARCHAR':
+ case 'NVARCHAR2':
+ if (isset($this) && $len <= $this->blobSize) return 'C';
+
+ case 'NCLOB':
+ case 'LONG':
+ case 'LONG VARCHAR':
+ case 'CLOB':
+ return 'X';
+
+ case 'LONG RAW':
+ case 'LONG VARBINARY':
+ case 'BLOB':
+ return 'B';
+
+ case 'DATE':
+ return ($this->connection->datetime) ? 'T' : 'D';
+
+
+ case 'TIMESTAMP': return 'T';
+
+ case 'INT':
+ case 'SMALLINT':
+ case 'INTEGER':
+ return 'I';
+
+ default: return 'N';
+ }
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-oci805.inc.php b/lib/adodb/drivers/adodb-oci805.inc.php
index 51f61d44cc..5790fbefa3 100644
--- a/lib/adodb/drivers/adodb-oci805.inc.php
+++ b/lib/adodb/drivers/adodb-oci805.inc.php
@@ -1,56 +1,59 @@
-ADODB_oci8();
- }
-
- function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
- {
- // seems that oracle only supports 1 hint comment in 8i
- if (strpos($sql,'/*+') !== false)
- $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql);
- else
- $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql);
-
- /*
- The following is only available from 8.1.5 because order by in inline views not
- available before then...
- http://www.jlcomp.demon.co.uk/faq/top_sql.html
- if ($nrows > 0) {
- if ($offset > 0) $nrows += $offset;
- $sql = "select * from ($sql) where rownum <= $nrows";
- $nrows = -1;
- }
- */
-
- return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
- }
-}
-
-class ADORecordset_oci805 extends ADORecordset_oci8 {
- var $databaseType = "oci805";
- function ADORecordset_oci805($id,$mode=false)
- {
- $this->ADORecordset_oci8($id,$mode);
- }
-}
+ADODB_oci8();
+ }
+
+ function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)
+ {
+ // seems that oracle only supports 1 hint comment in 8i
+ if (strpos($sql,'/*+') !== false)
+ $sql = str_replace('/*+ ','/*+FIRST_ROWS ',$sql);
+ else
+ $sql = preg_replace('/^[ \t\n]*select/i','SELECT /*+FIRST_ROWS*/',$sql);
+
+ /*
+ The following is only available from 8.1.5 because order by in inline views not
+ available before then...
+ http://www.jlcomp.demon.co.uk/faq/top_sql.html
+ if ($nrows > 0) {
+ if ($offset > 0) $nrows += $offset;
+ $sql = "select * from ($sql) where rownum <= $nrows";
+ $nrows = -1;
+ }
+ */
+
+ return ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
+ }
+}
+
+class ADORecordset_oci805 extends ADORecordset_oci8 {
+ var $databaseType = "oci805";
+ function ADORecordset_oci805($id,$mode=false)
+ {
+ $this->ADORecordset_oci8($id,$mode);
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-oci8po.inc.php b/lib/adodb/drivers/adodb-oci8po.inc.php
index 1cccd8efe3..63a1280166 100644
--- a/lib/adodb/drivers/adodb-oci8po.inc.php
+++ b/lib/adodb/drivers/adodb-oci8po.inc.php
@@ -1,190 +1,193 @@
-
-
- Should some emulation of RecordCount() be implemented?
-
-*/
-
-include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
-
-class ADODB_oci8po extends ADODB_oci8 {
- var $databaseType = 'oci8po';
- var $dataProvider = 'oci8';
- var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
- var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')";
-
- function ADODB_oci8po()
- {
- $this->ADODB_oci8();
- }
-
- function Param($name)
- {
- return '?';
- }
-
- function Prepare($sql,$cursor=false)
- {
- $sqlarr = explode('?',$sql);
- $sql = $sqlarr[0];
- for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
- $sql .= ':'.($i-1) . $sqlarr[$i];
- }
- return ADODB_oci8::Prepare($sql,$cursor);
- }
-
- // emulate handling of parameters ? ?, replacing with :bind0 :bind1
- function _query($sql,$inputarr)
- {
- if (is_array($inputarr)) {
- $i = 0;
- if (is_array($sql)) {
- foreach($inputarr as $v) {
- $arr['bind'.$i++] = $v;
- }
- } else {
- $sqlarr = explode('?',$sql);
- $sql = $sqlarr[0];
- foreach($inputarr as $k => $v) {
- $sql .= ":$k" . $sqlarr[++$i];
- }
- }
- }
- return ADODB_oci8::_query($sql,$inputarr);
- }
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordset_oci8po extends ADORecordset_oci8 {
-
- var $databaseType = 'oci8po';
-
- function ADORecordset_oci8po($queryID,$mode=false)
- {
- $this->ADORecordset_oci8($queryID,$mode);
- }
-
- function Fields($colname)
- {
- if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname];
-
- if (!$this->bind) {
- $this->bind = array();
- for ($i=0; $i < $this->_numOfFields; $i++) {
- $o = $this->FetchField($i);
- $this->bind[strtoupper($o->name)] = $i;
- }
- }
- return $this->fields[$this->bind[strtoupper($colname)]];
- }
-
- // lowercase field names...
- function &_FetchField($fieldOffset = -1)
- {
- $fld = new ADOFieldObject;
- $fieldOffset += 1;
- $fld->name = strtolower(OCIcolumnname($this->_queryID, $fieldOffset));
- $fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
- $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
- if ($fld->type == 'NUMBER') {
- //$p = OCIColumnPrecision($this->_queryID, $fieldOffset);
- $sc = OCIColumnScale($this->_queryID, $fieldOffset);
- if ($sc == 0) $fld->type = 'INT';
- }
- return $fld;
- }
-
- // 10% speedup to move MoveNext to child class
- function MoveNext()
- {
-
- if (!$this->EOF) {
- $this->_currentRow++;
- if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
- global $ADODB_ANSI_PADDING_OFF;
-
- if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
- if (!empty($ADODB_ANSI_PADDING_OFF)) {
- foreach($this->fields as $k => $v) {
- if (is_string($v)) $this->fields[$k] = rtrim($v);
- }
- }
- return true;
- }
- $this->EOF = true;
- }
- return false;
- }
-
- /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
- function &GetArrayLimit($nrows,$offset=-1)
- {
- if ($offset <= 0) return $this->GetArray($nrows);
- for ($i=1; $i < $offset; $i++)
- if (!@OCIFetch($this->_queryID)) return array();
-
- if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return array();
- if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
- $results = array();
- $cnt = 0;
- while (!$this->EOF && $nrows != $cnt) {
- $results[$cnt++] = $this->fields;
- $this->MoveNext();
- }
-
- return $results;
- }
-
- // Create associative array
- function _updatefields()
- {
- if (ADODB_ASSOC_CASE == 2) return; // native
-
- $arr = array();
- $lowercase = (ADODB_ASSOC_CASE == 0);
-
- foreach($this->fields as $k => $v) {
- if (is_integer($k)) $arr[$k] = $v;
- else {
- if ($lowercase)
- $arr[strtolower($k)] = $v;
- else
- $arr[strtoupper($k)] = $v;
- }
- }
- $this->fields = $arr;
- }
-
- function _fetch()
- {
- $ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
- if ($ret) {
- global $ADODB_ANSI_PADDING_OFF;
-
- if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
- if (!empty($ADODB_ANSI_PADDING_OFF)) {
- foreach($this->fields as $k => $v) {
- if (is_string($v)) $this->fields[$k] = rtrim($v);
- }
- }
- }
- return $ret;
- }
-
-}
+
+
+ Should some emulation of RecordCount() be implemented?
+
+*/
+
+// security - hide paths
+if (!defined('ADODB_DIR')) die();
+
+include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');
+
+class ADODB_oci8po extends ADODB_oci8 {
+ var $databaseType = 'oci8po';
+ var $dataProvider = 'oci8';
+ var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
+ var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')";
+
+ function ADODB_oci8po()
+ {
+ $this->ADODB_oci8();
+ }
+
+ function Param($name)
+ {
+ return '?';
+ }
+
+ function Prepare($sql,$cursor=false)
+ {
+ $sqlarr = explode('?',$sql);
+ $sql = $sqlarr[0];
+ for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
+ $sql .= ':'.($i-1) . $sqlarr[$i];
+ }
+ return ADODB_oci8::Prepare($sql,$cursor);
+ }
+
+ // emulate handling of parameters ? ?, replacing with :bind0 :bind1
+ function _query($sql,$inputarr)
+ {
+ if (is_array($inputarr)) {
+ $i = 0;
+ if (is_array($sql)) {
+ foreach($inputarr as $v) {
+ $arr['bind'.$i++] = $v;
+ }
+ } else {
+ $sqlarr = explode('?',$sql);
+ $sql = $sqlarr[0];
+ foreach($inputarr as $k => $v) {
+ $sql .= ":$k" . $sqlarr[++$i];
+ }
+ }
+ }
+ return ADODB_oci8::_query($sql,$inputarr);
+ }
+}
+
+/*--------------------------------------------------------------------------------------
+ Class Name: Recordset
+--------------------------------------------------------------------------------------*/
+
+class ADORecordset_oci8po extends ADORecordset_oci8 {
+
+ var $databaseType = 'oci8po';
+
+ function ADORecordset_oci8po($queryID,$mode=false)
+ {
+ $this->ADORecordset_oci8($queryID,$mode);
+ }
+
+ function Fields($colname)
+ {
+ if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname];
+
+ if (!$this->bind) {
+ $this->bind = array();
+ for ($i=0; $i < $this->_numOfFields; $i++) {
+ $o = $this->FetchField($i);
+ $this->bind[strtoupper($o->name)] = $i;
+ }
+ }
+ return $this->fields[$this->bind[strtoupper($colname)]];
+ }
+
+ // lowercase field names...
+ function &_FetchField($fieldOffset = -1)
+ {
+ $fld = new ADOFieldObject;
+ $fieldOffset += 1;
+ $fld->name = strtolower(OCIcolumnname($this->_queryID, $fieldOffset));
+ $fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
+ $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
+ if ($fld->type == 'NUMBER') {
+ //$p = OCIColumnPrecision($this->_queryID, $fieldOffset);
+ $sc = OCIColumnScale($this->_queryID, $fieldOffset);
+ if ($sc == 0) $fld->type = 'INT';
+ }
+ return $fld;
+ }
+
+ // 10% speedup to move MoveNext to child class
+ function MoveNext()
+ {
+
+ if (!$this->EOF) {
+ $this->_currentRow++;
+ if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
+ global $ADODB_ANSI_PADDING_OFF;
+
+ if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
+ if (!empty($ADODB_ANSI_PADDING_OFF)) {
+ foreach($this->fields as $k => $v) {
+ if (is_string($v)) $this->fields[$k] = rtrim($v);
+ }
+ }
+ return true;
+ }
+ $this->EOF = true;
+ }
+ return false;
+ }
+
+ /* Optimize SelectLimit() by using OCIFetch() instead of OCIFetchInto() */
+ function &GetArrayLimit($nrows,$offset=-1)
+ {
+ if ($offset <= 0) return $this->GetArray($nrows);
+ for ($i=1; $i < $offset; $i++)
+ if (!@OCIFetch($this->_queryID)) return array();
+
+ if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) return array();
+ if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
+ $results = array();
+ $cnt = 0;
+ while (!$this->EOF && $nrows != $cnt) {
+ $results[$cnt++] = $this->fields;
+ $this->MoveNext();
+ }
+
+ return $results;
+ }
+
+ // Create associative array
+ function _updatefields()
+ {
+ if (ADODB_ASSOC_CASE == 2) return; // native
+
+ $arr = array();
+ $lowercase = (ADODB_ASSOC_CASE == 0);
+
+ foreach($this->fields as $k => $v) {
+ if (is_integer($k)) $arr[$k] = $v;
+ else {
+ if ($lowercase)
+ $arr[strtolower($k)] = $v;
+ else
+ $arr[strtoupper($k)] = $v;
+ }
+ }
+ $this->fields = $arr;
+ }
+
+ function _fetch()
+ {
+ $ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
+ if ($ret) {
+ global $ADODB_ANSI_PADDING_OFF;
+
+ if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
+ if (!empty($ADODB_ANSI_PADDING_OFF)) {
+ foreach($this->fields as $k => $v) {
+ if (is_string($v)) $this->fields[$k] = rtrim($v);
+ }
+ }
+ }
+ return $ret;
+ }
+
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-odbc.inc.php b/lib/adodb/drivers/adodb-odbc.inc.php
index 79aadef54b..930f0c201b 100644
--- a/lib/adodb/drivers/adodb-odbc.inc.php
+++ b/lib/adodb/drivers/adodb-odbc.inc.php
@@ -1,710 +1,714 @@
-_haserrorfunctions = ADODB_PHPVER >= 0x4050;
- $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
- }
-
- function ServerInfo()
- {
-
- if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
- $dsn = strtoupper($this->host);
- $first = true;
- $found = false;
-
- if (!function_exists('odbc_data_source')) return false;
-
- while(true) {
-
- $rez = odbc_data_source($this->_connectionID,
- $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
- $first = false;
- if (!is_array($rez)) break;
- if (strtoupper($rez['server']) == $dsn) {
- $found = true;
- break;
- }
- }
- if (!$found) return ADOConnection::ServerInfo();
- if (!isset($rez['version'])) $rez['version'] = '';
- return $rez;
- } else {
- return ADOConnection::ServerInfo();
- }
- }
-
-
- function CreateSequence($seqname='adodbseq',$start=1)
- {
- if (empty($this->_genSeqSQL)) return false;
- $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
- if (!$ok) return false;
- $start -= 1;
- return $this->Execute("insert into $seqname values($start)");
- }
-
- var $_dropSeqSQL = 'drop table %s';
- function DropSequence($seqname)
- {
- if (empty($this->_dropSeqSQL)) return false;
- return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
- }
-
- /*
- This algorithm is not very efficient, but works even if table locking
- is not available.
-
- Will return false if unable to generate an ID after $MAXLOOPS attempts.
- */
- function GenID($seq='adodbseq',$start=1)
- {
- // if you have to modify the parameter below, your database is overloaded,
- // or you need to implement generation of id's yourself!
- $MAXLOOPS = 100;
- //$this->debug=1;
- while (--$MAXLOOPS>=0) {
- $num = $this->GetOne("select id from $seq");
- if ($num === false) {
- $this->Execute(sprintf($this->_genSeqSQL ,$seq));
- $start -= 1;
- $num = '0';
- $ok = $this->Execute("insert into $seq values($start)");
- if (!$ok) return false;
- }
- $this->Execute("update $seq set id=id+1 where id=$num");
-
- if ($this->affected_rows() > 0) {
- $num += 1;
- $this->genID = $num;
- return $num;
- }
- }
- if ($fn = $this->raiseErrorFn) {
- $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
- }
- return false;
- }
-
-
- function ErrorMsg()
- {
- if ($this->_haserrorfunctions) {
- if ($this->_errorMsg !== false) return $this->_errorMsg;
- if (empty($this->_connectionID)) return @odbc_errormsg();
- return @odbc_errormsg($this->_connectionID);
- } else return ADOConnection::ErrorMsg();
- }
-
- function ErrorNo()
- {
-
- if ($this->_haserrorfunctions) {
- if ($this->_errorCode !== false) {
- // bug in 4.0.6, error number can be corrupted string (should be 6 digits)
- return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
- }
-
- if (empty($this->_connectionID)) $e = @odbc_error();
- else $e = @odbc_error($this->_connectionID);
-
- // bug in 4.0.6, error number can be corrupted string (should be 6 digits)
- // so we check and patch
- if (strlen($e)<=2) return 0;
- return $e;
- } else return ADOConnection::ErrorNo();
- }
-
-
- // returns true or false
- function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
- {
- global $php_errormsg;
-
- if (!function_exists('odbc_connect')) return false;
-
- if ($this->debug && $argDatabasename) {
- ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter.");
- }
- $php_errormsg = '';
- if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
- else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode);
- $this->_errorMsg = $php_errormsg;
- if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
-
- //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
- return $this->_connectionID != false;
- }
-
- // returns true or false
- function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
- {
- global $php_errormsg;
-
- if (!function_exists('odbc_connect')) return false;
-
- $php_errormsg = '';
- if ($this->debug && $argDatabasename) {
- ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter.");
- }
- // print "dsn=$argDSN u=$argUsername p=$argPassword
"; flush();
- if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
- else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode);
-
- $this->_errorMsg = $php_errormsg;
- if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID);
- if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
-
- return $this->_connectionID != false;
- }
-
- function BeginTrans()
- {
- if (!$this->hasTransactions) return false;
- if ($this->transOff) return true;
- $this->transCnt += 1;
- $this->_autocommit = false;
- return odbc_autocommit($this->_connectionID,false);
- }
-
- function CommitTrans($ok=true)
- {
- if ($this->transOff) return true;
- if (!$ok) return $this->RollbackTrans();
- if ($this->transCnt) $this->transCnt -= 1;
- $this->_autocommit = true;
- $ret = odbc_commit($this->_connectionID);
- odbc_autocommit($this->_connectionID,true);
- return $ret;
- }
-
- function RollbackTrans()
- {
- if ($this->transOff) return true;
- if ($this->transCnt) $this->transCnt -= 1;
- $this->_autocommit = true;
- $ret = odbc_rollback($this->_connectionID);
- odbc_autocommit($this->_connectionID,true);
- return $ret;
- }
-
- function MetaPrimaryKeys($table)
- {
- global $ADODB_FETCH_MODE;
-
- $savem = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $qid = @odbc_primarykeys($this->_connectionID,'','',$table);
-
- if (!$qid) {
- $ADODB_FETCH_MODE = $savem;
- return false;
- }
- $rs = new ADORecordSet_odbc($qid);
- $ADODB_FETCH_MODE = $savem;
-
- if (!$rs) return false;
- $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
-
- $arr =& $rs->GetArray();
- $rs->Close();
- //print_r($arr);
- $arr2 = array();
- for ($i=0; $i < sizeof($arr); $i++) {
- if ($arr[$i][3]) $arr2[] = $arr[$i][3];
- }
- return $arr2;
- }
-
-
-
- function &MetaTables($ttype=false)
- {
- global $ADODB_FETCH_MODE;
-
- $savem = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $qid = odbc_tables($this->_connectionID);
-
- $rs = new ADORecordSet_odbc($qid);
-
- $ADODB_FETCH_MODE = $savem;
- if (!$rs) return false;
-
- $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
-
- $arr =& $rs->GetArray();
- //print_r($arr);
-
- $rs->Close();
- $arr2 = array();
-
- if ($ttype) {
- $isview = strncmp($ttype,'V',1) === 0;
- }
- for ($i=0; $i < sizeof($arr); $i++) {
- if (!$arr[$i][2]) continue;
- $type = $arr[$i][3];
- if ($ttype) {
- if ($isview) {
- if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
- } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
- } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
- }
- return $arr2;
- }
-
-/*
-/ SQL data type codes /
-#define SQL_UNKNOWN_TYPE 0
-#define SQL_CHAR 1
-#define SQL_NUMERIC 2
-#define SQL_DECIMAL 3
-#define SQL_INTEGER 4
-#define SQL_SMALLINT 5
-#define SQL_FLOAT 6
-#define SQL_REAL 7
-#define SQL_DOUBLE 8
-#if (ODBCVER >= 0x0300)
-#define SQL_DATETIME 9
-#endif
-#define SQL_VARCHAR 12
-
-/ One-parameter shortcuts for date/time data types /
-#if (ODBCVER >= 0x0300)
-#define SQL_TYPE_DATE 91
-#define SQL_TYPE_TIME 92
-#define SQL_TYPE_TIMESTAMP 93
-
-#define SQL_UNICODE (-95)
-#define SQL_UNICODE_VARCHAR (-96)
-#define SQL_UNICODE_LONGVARCHAR (-97)
-*/
- function ODBCTypes($t)
- {
- switch ((integer)$t) {
- case 1:
- case 12:
- case 0:
- case -95:
- case -96:
- return 'C';
- case -97:
- case -1: //text
- return 'X';
- case -4: //image
- return 'B';
-
- case 91:
- case 11:
- return 'D';
-
- case 92:
- case 93:
- case 9: return 'T';
- case 4:
- case 5:
- case -6:
- return 'I';
-
- case -11: // uniqidentifier
- return 'R';
- case -7: //bit
- return 'L';
-
- default:
- return 'N';
- }
- }
-
- function &MetaColumns($table)
- {
- global $ADODB_FETCH_MODE;
-
- $table = strtoupper($table);
- $schema = false;
- $this->_findschema($table,$schema);
-
- $savem = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
-
- if (false) { // after testing, confirmed that the following does not work becoz of a bug
- $qid2 = odbc_tables($this->_connectionID);
- $rs = new ADORecordSet_odbc($qid2);
- $ADODB_FETCH_MODE = $savem;
- if (!$rs) return false;
- $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
- $rs->_fetch();
-
- while (!$rs->EOF) {
- if ($table == strtoupper($rs->fields[2])) {
- $q = $rs->fields[0];
- $o = $rs->fields[1];
- break;
- }
- $rs->MoveNext();
- }
- $rs->Close();
-
- $qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%');
- } else switch ($this->databaseType) {
- case 'access':
- case 'vfp':
- case 'db2':
- $qid = odbc_columns($this->_connectionID);
- break;
-
- default:
- $qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%');
- if (empty($qid)) $qid = odbc_columns($this->_connectionID);
- break;
- }
- if (empty($qid)) return false;
-
- $rs = new ADORecordSet_odbc($qid);
- $ADODB_FETCH_MODE = $savem;
-
- if (!$rs) return false;
-
- $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
- $rs->_fetch();
- $retarr = array();
-
- /*
- $rs->fields indices
- 0 TABLE_QUALIFIER
- 1 TABLE_SCHEM
- 2 TABLE_NAME
- 3 COLUMN_NAME
- 4 DATA_TYPE
- 5 TYPE_NAME
- 6 PRECISION
- 7 LENGTH
- 8 SCALE
- 9 RADIX
- 10 NULLABLE
- 11 REMARKS
- */
- while (!$rs->EOF) {
- //adodb_pr($rs->fields);
- if (strtoupper($rs->fields[2]) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
- $fld = new ADOFieldObject();
- $fld->name = $rs->fields[3];
- $fld->type = $this->ODBCTypes($rs->fields[4]);
-
- // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
- // access uses precision to store length for char/varchar
- if ($fld->type == 'C' or $fld->type == 'X') {
- if ($this->databaseType == 'access')
- $fld->max_length = $rs->fields[6];
- else if ($rs->fields[4] <= -95) // UNICODE
- $fld->max_length = $rs->fields[7]/2;
- else
- $fld->max_length = $rs->fields[7];
- } else
- $fld->max_length = $rs->fields[7];
- $fld->not_null = !empty($rs->fields[10]);
- $fld->scale = $rs->fields[8];
- $retarr[strtoupper($fld->name)] = $fld;
- } else if (sizeof($retarr)>0)
- break;
- $rs->MoveNext();
- }
- $rs->Close(); //-- crashes 4.03pl1 -- why?
-
- return $retarr;
- }
-
- function Prepare($sql)
- {
- if (! $this->_bindInputArray) return $sql; // no binding
- $stmt = odbc_prepare($this->_connectionID,$sql);
- if (!$stmt) {
- // we don't know whether odbc driver is parsing prepared stmts, so just return sql
- return $sql;
- }
- return array($sql,$stmt,false);
- }
-
- /* returns queryID or false */
- function _query($sql,$inputarr=false)
- {
- GLOBAL $php_errormsg;
- $php_errormsg = '';
- $this->_error = '';
-
- if ($inputarr) {
- if (is_array($sql)) {
- $stmtid = $sql[1];
- } else {
- $stmtid = odbc_prepare($this->_connectionID,$sql);
-
- if ($stmtid == false) {
- $this->_errorMsg = $php_errormsg;
- return false;
- }
- }
-
- if (! odbc_execute($stmtid,$inputarr)) {
- //@odbc_free_result($stmtid);
- if ($this->_haserrorfunctions) {
- $this->_errorMsg = odbc_errormsg();
- $this->_errorCode = odbc_error();
- }
- return false;
- }
-
- } else if (is_array($sql)) {
- $stmtid = $sql[1];
- if (!odbc_execute($stmtid)) {
- //@odbc_free_result($stmtid);
- if ($this->_haserrorfunctions) {
- $this->_errorMsg = odbc_errormsg();
- $this->_errorCode = odbc_error();
- }
- return false;
- }
- } else
- $stmtid = odbc_exec($this->_connectionID,$sql);
-
- $this->_lastAffectedRows = 0;
- if ($stmtid) {
- if (@odbc_num_fields($stmtid) == 0) {
- $this->_lastAffectedRows = odbc_num_rows($stmtid);
- $stmtid = true;
- } else {
- $this->_lastAffectedRows = 0;
- odbc_binmode($stmtid,$this->binmode);
- odbc_longreadlen($stmtid,$this->maxblobsize);
- }
-
- if ($this->_haserrorfunctions) {
- $this->_errorMsg = '';
- $this->_errorCode = 0;
- } else
- $this->_errorMsg = $php_errormsg;
- } else {
- if ($this->_haserrorfunctions) {
- $this->_errorMsg = odbc_errormsg();
- $this->_errorCode = odbc_error();
- } else
- $this->_errorMsg = $php_errormsg;
- }
- return $stmtid;
- }
-
- /*
- Insert a null into the blob field of the table first.
- Then use UpdateBlob to store the blob.
-
- Usage:
-
- $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
- $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
- */
- function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
- {
- return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
- }
-
- // returns true or false
- function _close()
- {
- $ret = @odbc_close($this->_connectionID);
- $this->_connectionID = false;
- return $ret;
- }
-
- function _affectedrows()
- {
- return $this->_lastAffectedRows;
- }
-
-}
-
-/*--------------------------------------------------------------------------------------
- Class Name: Recordset
---------------------------------------------------------------------------------------*/
-
-class ADORecordSet_odbc extends ADORecordSet {
-
- var $bind = false;
- var $databaseType = "odbc";
- var $dataProvider = "odbc";
- var $useFetchArray;
- var $_has_stupid_odbc_fetch_api_change;
-
- function ADORecordSet_odbc($id,$mode=false)
- {
- if ($mode === false) {
- global $ADODB_FETCH_MODE;
- $mode = $ADODB_FETCH_MODE;
- }
- $this->fetchMode = $mode;
-
- $this->_queryID = $id;
-
- // the following is required for mysql odbc driver in 4.3.1 -- why?
- $this->EOF = false;
- $this->_currentRow = -1;
- //$this->ADORecordSet($id);
- }
-
-
- // returns the field object
- function &FetchField($fieldOffset = -1)
- {
-
- $off=$fieldOffset+1; // offsets begin at 1
-
- $o= new ADOFieldObject();
- $o->name = @odbc_field_name($this->_queryID,$off);
- $o->type = @odbc_field_type($this->_queryID,$off);
- $o->max_length = @odbc_field_len($this->_queryID,$off);
- if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
- else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
- return $o;
- }
-
- /* Use associative array to get fields array */
- function Fields($colname)
- {
- if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
- if (!$this->bind) {
- $this->bind = array();
- for ($i=0; $i < $this->_numOfFields; $i++) {
- $o = $this->FetchField($i);
- $this->bind[strtoupper($o->name)] = $i;
- }
- }
-
- return $this->fields[$this->bind[strtoupper($colname)]];
- }
-
-
- function _initrs()
- {
- global $ADODB_COUNTRECS;
- $this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1;
- $this->_numOfFields = @odbc_num_fields($this->_queryID);
- // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
- if ($this->_numOfRows == 0) $this->_numOfRows = -1;
- //$this->useFetchArray = $this->connection->useFetchArray;
- $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
- }
-
- function _seek($row)
- {
- return false;
- }
-
- // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
- function &GetArrayLimit($nrows,$offset=-1)
- {
- if ($offset <= 0) {
- $rs =& $this->GetArray($nrows);
- return $rs;
- }
- $savem = $this->fetchMode;
- $this->fetchMode = ADODB_FETCH_NUM;
- $this->Move($offset);
- $this->fetchMode = $savem;
-
- if ($this->fetchMode & ADODB_FETCH_ASSOC) {
- $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
- }
-
- $results = array();
- $cnt = 0;
- while (!$this->EOF && $nrows != $cnt) {
- $results[$cnt++] = $this->fields;
- $this->MoveNext();
- }
-
- return $results;
- }
-
-
- function MoveNext()
- {
- if ($this->_numOfRows != 0 && !$this->EOF) {
- $this->_currentRow++;
- $row = 0;
- if ($this->_has_stupid_odbc_fetch_api_change)
- $rez = @odbc_fetch_into($this->_queryID,$this->fields);
- else
- $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
- if ($rez) {
- if ($this->fetchMode & ADODB_FETCH_ASSOC) {
- $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
- }
- return true;
- }
- }
- $this->fields = false;
- $this->EOF = true;
- return false;
- }
-
- function _fetch()
- {
- $row = 0;
- if ($this->_has_stupid_odbc_fetch_api_change)
- $rez = @odbc_fetch_into($this->_queryID,$this->fields,$row);
- else
- $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
-
- if ($rez) {
- if ($this->fetchMode & ADODB_FETCH_ASSOC) {
- $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
- }
- return true;
- }
- $this->fields = false;
- return false;
- }
-
- function _close()
- {
- return @odbc_free_result($this->_queryID);
- }
-
-}
-
-?>
+_haserrorfunctions = ADODB_PHPVER >= 0x4050;
+ $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
+ }
+
+ function ServerInfo()
+ {
+
+ if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
+ $dsn = strtoupper($this->host);
+ $first = true;
+ $found = false;
+
+ if (!function_exists('odbc_data_source')) return false;
+
+ while(true) {
+
+ $rez = odbc_data_source($this->_connectionID,
+ $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
+ $first = false;
+ if (!is_array($rez)) break;
+ if (strtoupper($rez['server']) == $dsn) {
+ $found = true;
+ break;
+ }
+ }
+ if (!$found) return ADOConnection::ServerInfo();
+ if (!isset($rez['version'])) $rez['version'] = '';
+ return $rez;
+ } else {
+ return ADOConnection::ServerInfo();
+ }
+ }
+
+
+ function CreateSequence($seqname='adodbseq',$start=1)
+ {
+ if (empty($this->_genSeqSQL)) return false;
+ $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
+ if (!$ok) return false;
+ $start -= 1;
+ return $this->Execute("insert into $seqname values($start)");
+ }
+
+ var $_dropSeqSQL = 'drop table %s';
+ function DropSequence($seqname)
+ {
+ if (empty($this->_dropSeqSQL)) return false;
+ return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
+ }
+
+ /*
+ This algorithm is not very efficient, but works even if table locking
+ is not available.
+
+ Will return false if unable to generate an ID after $MAXLOOPS attempts.
+ */
+ function GenID($seq='adodbseq',$start=1)
+ {
+ // if you have to modify the parameter below, your database is overloaded,
+ // or you need to implement generation of id's yourself!
+ $MAXLOOPS = 100;
+ //$this->debug=1;
+ while (--$MAXLOOPS>=0) {
+ $num = $this->GetOne("select id from $seq");
+ if ($num === false) {
+ $this->Execute(sprintf($this->_genSeqSQL ,$seq));
+ $start -= 1;
+ $num = '0';
+ $ok = $this->Execute("insert into $seq values($start)");
+ if (!$ok) return false;
+ }
+ $this->Execute("update $seq set id=id+1 where id=$num");
+
+ if ($this->affected_rows() > 0) {
+ $num += 1;
+ $this->genID = $num;
+ return $num;
+ }
+ }
+ if ($fn = $this->raiseErrorFn) {
+ $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
+ }
+ return false;
+ }
+
+
+ function ErrorMsg()
+ {
+ if ($this->_haserrorfunctions) {
+ if ($this->_errorMsg !== false) return $this->_errorMsg;
+ if (empty($this->_connectionID)) return @odbc_errormsg();
+ return @odbc_errormsg($this->_connectionID);
+ } else return ADOConnection::ErrorMsg();
+ }
+
+ function ErrorNo()
+ {
+
+ if ($this->_haserrorfunctions) {
+ if ($this->_errorCode !== false) {
+ // bug in 4.0.6, error number can be corrupted string (should be 6 digits)
+ return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
+ }
+
+ if (empty($this->_connectionID)) $e = @odbc_error();
+ else $e = @odbc_error($this->_connectionID);
+
+ // bug in 4.0.6, error number can be corrupted string (should be 6 digits)
+ // so we check and patch
+ if (strlen($e)<=2) return 0;
+ return $e;
+ } else return ADOConnection::ErrorNo();
+ }
+
+
+ // returns true or false
+ function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
+ {
+ global $php_errormsg;
+
+ if (!function_exists('odbc_connect')) return null;
+
+ if ($this->debug && $argDatabasename && $this->databaseType != 'vfp') {
+ ADOConnection::outp("For odbc Connect(), $argDatabasename is not used. Place dsn in 1st parameter.");
+ }
+ if (isset($php_errormsg)) $php_errormsg = '';
+ if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
+ else $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword,$this->curmode);
+ $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+ if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
+
+ //if ($this->_connectionID) odbc_autocommit($this->_connectionID,true);
+ return $this->_connectionID != false;
+ }
+
+ // returns true or false
+ function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
+ {
+ global $php_errormsg;
+
+ if (!function_exists('odbc_connect')) return null;
+
+ if (isset($php_errormsg)) $php_errormsg = '';
+ $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+ if ($this->debug && $argDatabasename) {
+ ADOConnection::outp("For odbc PConnect(), $argDatabasename is not used. Place dsn in 1st parameter.");
+ }
+ // print "dsn=$argDSN u=$argUsername p=$argPassword
"; flush();
+ if ($this->curmode === false) $this->_connectionID = odbc_connect($argDSN,$argUsername,$argPassword);
+ else $this->_connectionID = odbc_pconnect($argDSN,$argUsername,$argPassword,$this->curmode);
+
+ $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+ if ($this->_connectionID && $this->autoRollback) @odbc_rollback($this->_connectionID);
+ if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
+
+ return $this->_connectionID != false;
+ }
+
+ function BeginTrans()
+ {
+ if (!$this->hasTransactions) return false;
+ if ($this->transOff) return true;
+ $this->transCnt += 1;
+ $this->_autocommit = false;
+ return odbc_autocommit($this->_connectionID,false);
+ }
+
+ function CommitTrans($ok=true)
+ {
+ if ($this->transOff) return true;
+ if (!$ok) return $this->RollbackTrans();
+ if ($this->transCnt) $this->transCnt -= 1;
+ $this->_autocommit = true;
+ $ret = odbc_commit($this->_connectionID);
+ odbc_autocommit($this->_connectionID,true);
+ return $ret;
+ }
+
+ function RollbackTrans()
+ {
+ if ($this->transOff) return true;
+ if ($this->transCnt) $this->transCnt -= 1;
+ $this->_autocommit = true;
+ $ret = odbc_rollback($this->_connectionID);
+ odbc_autocommit($this->_connectionID,true);
+ return $ret;
+ }
+
+ function MetaPrimaryKeys($table)
+ {
+ global $ADODB_FETCH_MODE;
+
+ $savem = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ $qid = @odbc_primarykeys($this->_connectionID,'','',$table);
+
+ if (!$qid) {
+ $ADODB_FETCH_MODE = $savem;
+ return false;
+ }
+ $rs = new ADORecordSet_odbc($qid);
+ $ADODB_FETCH_MODE = $savem;
+
+ if (!$rs) return false;
+ $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
+
+ $arr =& $rs->GetArray();
+ $rs->Close();
+ //print_r($arr);
+ $arr2 = array();
+ for ($i=0; $i < sizeof($arr); $i++) {
+ if ($arr[$i][3]) $arr2[] = $arr[$i][3];
+ }
+ return $arr2;
+ }
+
+
+
+ function &MetaTables($ttype=false)
+ {
+ global $ADODB_FETCH_MODE;
+
+ $savem = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ $qid = odbc_tables($this->_connectionID);
+
+ $rs = new ADORecordSet_odbc($qid);
+
+ $ADODB_FETCH_MODE = $savem;
+ if (!$rs) return false;
+
+ $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
+
+ $arr =& $rs->GetArray();
+ //print_r($arr);
+
+ $rs->Close();
+ $arr2 = array();
+
+ if ($ttype) {
+ $isview = strncmp($ttype,'V',1) === 0;
+ }
+ for ($i=0; $i < sizeof($arr); $i++) {
+ if (!$arr[$i][2]) continue;
+ $type = $arr[$i][3];
+ if ($ttype) {
+ if ($isview) {
+ if (strncmp($type,'V',1) === 0) $arr2[] = $arr[$i][2];
+ } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
+ } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $arr[$i][2];
+ }
+ return $arr2;
+ }
+
+/*
+/ SQL data type codes /
+#define SQL_UNKNOWN_TYPE 0
+#define SQL_CHAR 1
+#define SQL_NUMERIC 2
+#define SQL_DECIMAL 3
+#define SQL_INTEGER 4
+#define SQL_SMALLINT 5
+#define SQL_FLOAT 6
+#define SQL_REAL 7
+#define SQL_DOUBLE 8
+#if (ODBCVER >= 0x0300)
+#define SQL_DATETIME 9
+#endif
+#define SQL_VARCHAR 12
+
+/ One-parameter shortcuts for date/time data types /
+#if (ODBCVER >= 0x0300)
+#define SQL_TYPE_DATE 91
+#define SQL_TYPE_TIME 92
+#define SQL_TYPE_TIMESTAMP 93
+
+#define SQL_UNICODE (-95)
+#define SQL_UNICODE_VARCHAR (-96)
+#define SQL_UNICODE_LONGVARCHAR (-97)
+*/
+ function ODBCTypes($t)
+ {
+ switch ((integer)$t) {
+ case 1:
+ case 12:
+ case 0:
+ case -95:
+ case -96:
+ return 'C';
+ case -97:
+ case -1: //text
+ return 'X';
+ case -4: //image
+ return 'B';
+
+ case 91:
+ case 11:
+ return 'D';
+
+ case 92:
+ case 93:
+ case 9: return 'T';
+ case 4:
+ case 5:
+ case -6:
+ return 'I';
+
+ case -11: // uniqidentifier
+ return 'R';
+ case -7: //bit
+ return 'L';
+
+ default:
+ return 'N';
+ }
+ }
+
+ function &MetaColumns($table)
+ {
+ global $ADODB_FETCH_MODE;
+
+ $table = strtoupper($table);
+ $schema = false;
+ $this->_findschema($table,$schema);
+
+ $savem = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+
+ if (false) { // after testing, confirmed that the following does not work becoz of a bug
+ $qid2 = odbc_tables($this->_connectionID);
+ $rs = new ADORecordSet_odbc($qid2);
+ $ADODB_FETCH_MODE = $savem;
+ if (!$rs) return false;
+ $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
+ $rs->_fetch();
+
+ while (!$rs->EOF) {
+ if ($table == strtoupper($rs->fields[2])) {
+ $q = $rs->fields[0];
+ $o = $rs->fields[1];
+ break;
+ }
+ $rs->MoveNext();
+ }
+ $rs->Close();
+
+ $qid = odbc_columns($this->_connectionID,$q,$o,strtoupper($table),'%');
+ } else switch ($this->databaseType) {
+ case 'access':
+ case 'vfp':
+ case 'db2':
+ $qid = odbc_columns($this->_connectionID);
+ break;
+
+ default:
+ $qid = @odbc_columns($this->_connectionID,'%','%',strtoupper($table),'%');
+ if (empty($qid)) $qid = odbc_columns($this->_connectionID);
+ break;
+ }
+ if (empty($qid)) return false;
+
+ $rs = new ADORecordSet_odbc($qid);
+ $ADODB_FETCH_MODE = $savem;
+
+ if (!$rs) return false;
+
+ $rs->_has_stupid_odbc_fetch_api_change = $this->_has_stupid_odbc_fetch_api_change;
+ $rs->_fetch();
+ $retarr = array();
+
+ /*
+ $rs->fields indices
+ 0 TABLE_QUALIFIER
+ 1 TABLE_SCHEM
+ 2 TABLE_NAME
+ 3 COLUMN_NAME
+ 4 DATA_TYPE
+ 5 TYPE_NAME
+ 6 PRECISION
+ 7 LENGTH
+ 8 SCALE
+ 9 RADIX
+ 10 NULLABLE
+ 11 REMARKS
+ */
+ while (!$rs->EOF) {
+ //adodb_pr($rs->fields);
+ if (strtoupper($rs->fields[2]) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
+ $fld = new ADOFieldObject();
+ $fld->name = $rs->fields[3];
+ $fld->type = $this->ODBCTypes($rs->fields[4]);
+
+ // ref: http://msdn.microsoft.com/library/default.asp?url=/archive/en-us/dnaraccgen/html/msdn_odk.asp
+ // access uses precision to store length for char/varchar
+ if ($fld->type == 'C' or $fld->type == 'X') {
+ if ($this->databaseType == 'access')
+ $fld->max_length = $rs->fields[6];
+ else if ($rs->fields[4] <= -95) // UNICODE
+ $fld->max_length = $rs->fields[7]/2;
+ else
+ $fld->max_length = $rs->fields[7];
+ } else
+ $fld->max_length = $rs->fields[7];
+ $fld->not_null = !empty($rs->fields[10]);
+ $fld->scale = $rs->fields[8];
+ $retarr[strtoupper($fld->name)] = $fld;
+ } else if (sizeof($retarr)>0)
+ break;
+ $rs->MoveNext();
+ }
+ $rs->Close(); //-- crashes 4.03pl1 -- why?
+
+ return $retarr;
+ }
+
+ function Prepare($sql)
+ {
+ if (! $this->_bindInputArray) return $sql; // no binding
+ $stmt = odbc_prepare($this->_connectionID,$sql);
+ if (!$stmt) {
+ // we don't know whether odbc driver is parsing prepared stmts, so just return sql
+ return $sql;
+ }
+ return array($sql,$stmt,false);
+ }
+
+ /* returns queryID or false */
+ function _query($sql,$inputarr=false)
+ {
+ GLOBAL $php_errormsg;
+ if (isset($php_errormsg)) $php_errormsg = '';
+ $this->_error = '';
+
+ if ($inputarr) {
+ if (is_array($sql)) {
+ $stmtid = $sql[1];
+ } else {
+ $stmtid = odbc_prepare($this->_connectionID,$sql);
+
+ if ($stmtid == false) {
+ $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+ return false;
+ }
+ }
+
+ if (! odbc_execute($stmtid,$inputarr)) {
+ //@odbc_free_result($stmtid);
+ if ($this->_haserrorfunctions) {
+ $this->_errorMsg = odbc_errormsg();
+ $this->_errorCode = odbc_error();
+ }
+ return false;
+ }
+
+ } else if (is_array($sql)) {
+ $stmtid = $sql[1];
+ if (!odbc_execute($stmtid)) {
+ //@odbc_free_result($stmtid);
+ if ($this->_haserrorfunctions) {
+ $this->_errorMsg = odbc_errormsg();
+ $this->_errorCode = odbc_error();
+ }
+ return false;
+ }
+ } else
+ $stmtid = odbc_exec($this->_connectionID,$sql);
+
+ $this->_lastAffectedRows = 0;
+ if ($stmtid) {
+ if (@odbc_num_fields($stmtid) == 0) {
+ $this->_lastAffectedRows = odbc_num_rows($stmtid);
+ $stmtid = true;
+ } else {
+ $this->_lastAffectedRows = 0;
+ odbc_binmode($stmtid,$this->binmode);
+ odbc_longreadlen($stmtid,$this->maxblobsize);
+ }
+
+ if ($this->_haserrorfunctions) {
+ $this->_errorMsg = '';
+ $this->_errorCode = 0;
+ } else
+ $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+ } else {
+ if ($this->_haserrorfunctions) {
+ $this->_errorMsg = odbc_errormsg();
+ $this->_errorCode = odbc_error();
+ } else
+ $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+ }
+ return $stmtid;
+ }
+
+ /*
+ Insert a null into the blob field of the table first.
+ Then use UpdateBlob to store the blob.
+
+ Usage:
+
+ $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
+ $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
+ */
+ function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
+ {
+ return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
+ }
+
+ // returns true or false
+ function _close()
+ {
+ $ret = @odbc_close($this->_connectionID);
+ $this->_connectionID = false;
+ return $ret;
+ }
+
+ function _affectedrows()
+ {
+ return $this->_lastAffectedRows;
+ }
+
+}
+
+/*--------------------------------------------------------------------------------------
+ Class Name: Recordset
+--------------------------------------------------------------------------------------*/
+
+class ADORecordSet_odbc extends ADORecordSet {
+
+ var $bind = false;
+ var $databaseType = "odbc";
+ var $dataProvider = "odbc";
+ var $useFetchArray;
+ var $_has_stupid_odbc_fetch_api_change;
+
+ function ADORecordSet_odbc($id,$mode=false)
+ {
+ if ($mode === false) {
+ global $ADODB_FETCH_MODE;
+ $mode = $ADODB_FETCH_MODE;
+ }
+ $this->fetchMode = $mode;
+
+ $this->_queryID = $id;
+
+ // the following is required for mysql odbc driver in 4.3.1 -- why?
+ $this->EOF = false;
+ $this->_currentRow = -1;
+ //$this->ADORecordSet($id);
+ }
+
+
+ // returns the field object
+ function &FetchField($fieldOffset = -1)
+ {
+
+ $off=$fieldOffset+1; // offsets begin at 1
+
+ $o= new ADOFieldObject();
+ $o->name = @odbc_field_name($this->_queryID,$off);
+ $o->type = @odbc_field_type($this->_queryID,$off);
+ $o->max_length = @odbc_field_len($this->_queryID,$off);
+ if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
+ else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
+ return $o;
+ }
+
+ /* Use associative array to get fields array */
+ function Fields($colname)
+ {
+ if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
+ if (!$this->bind) {
+ $this->bind = array();
+ for ($i=0; $i < $this->_numOfFields; $i++) {
+ $o = $this->FetchField($i);
+ $this->bind[strtoupper($o->name)] = $i;
+ }
+ }
+
+ return $this->fields[$this->bind[strtoupper($colname)]];
+ }
+
+
+ function _initrs()
+ {
+ global $ADODB_COUNTRECS;
+ $this->_numOfRows = ($ADODB_COUNTRECS) ? @odbc_num_rows($this->_queryID) : -1;
+ $this->_numOfFields = @odbc_num_fields($this->_queryID);
+ // some silly drivers such as db2 as/400 and intersystems cache return _numOfRows = 0
+ if ($this->_numOfRows == 0) $this->_numOfRows = -1;
+ //$this->useFetchArray = $this->connection->useFetchArray;
+ $this->_has_stupid_odbc_fetch_api_change = ADODB_PHPVER >= 0x4200;
+ }
+
+ function _seek($row)
+ {
+ return false;
+ }
+
+ // speed up SelectLimit() by switching to ADODB_FETCH_NUM as ADODB_FETCH_ASSOC is emulated
+ function &GetArrayLimit($nrows,$offset=-1)
+ {
+ if ($offset <= 0) {
+ $rs =& $this->GetArray($nrows);
+ return $rs;
+ }
+ $savem = $this->fetchMode;
+ $this->fetchMode = ADODB_FETCH_NUM;
+ $this->Move($offset);
+ $this->fetchMode = $savem;
+
+ if ($this->fetchMode & ADODB_FETCH_ASSOC) {
+ $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
+ }
+
+ $results = array();
+ $cnt = 0;
+ while (!$this->EOF && $nrows != $cnt) {
+ $results[$cnt++] = $this->fields;
+ $this->MoveNext();
+ }
+
+ return $results;
+ }
+
+
+ function MoveNext()
+ {
+ if ($this->_numOfRows != 0 && !$this->EOF) {
+ $this->_currentRow++;
+ $row = 0;
+ if ($this->_has_stupid_odbc_fetch_api_change)
+ $rez = @odbc_fetch_into($this->_queryID,$this->fields);
+ else
+ $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
+ if ($rez) {
+ if ($this->fetchMode & ADODB_FETCH_ASSOC) {
+ $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
+ }
+ return true;
+ }
+ }
+ $this->fields = false;
+ $this->EOF = true;
+ return false;
+ }
+
+ function _fetch()
+ {
+ $row = 0;
+ if ($this->_has_stupid_odbc_fetch_api_change)
+ $rez = @odbc_fetch_into($this->_queryID,$this->fields,$row);
+ else
+ $rez = @odbc_fetch_into($this->_queryID,$row,$this->fields);
+
+ if ($rez) {
+ if ($this->fetchMode & ADODB_FETCH_ASSOC) {
+ $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
+ }
+ return true;
+ }
+ $this->fields = false;
+ return false;
+ }
+
+ function _close()
+ {
+ return @odbc_free_result($this->_queryID);
+ }
+
+}
+
+?>
\ No newline at end of file
diff --git a/lib/adodb/drivers/adodb-odbc_mssql.inc.php b/lib/adodb/drivers/adodb-odbc_mssql.inc.php
index 4b3161245b..9e01c453e8 100644
--- a/lib/adodb/drivers/adodb-odbc_mssql.inc.php
+++ b/lib/adodb/drivers/adodb-odbc_mssql.inc.php
@@ -1,239 +1,242 @@
-ADODB_odbc();
- $this->curmode = SQL_CUR_USE_ODBC;
- }
-
- // crashes php...
- function ServerInfo()
- {
- global $ADODB_FETCH_MODE;
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $row = $this->GetRow("execute sp_server_info 2");
- $ADODB_FETCH_MODE = $save;
- if (!is_array($row)) return false;
- $arr['description'] = $row[2];
- $arr['version'] = ADOConnection::_findvers($arr['description']);
- return $arr;
- }
-
- function IfNull( $field, $ifNull )
- {
- return " ISNULL($field, $ifNull) "; // if MS SQL Server
- }
-
- function _insertid()
- {
- // SCOPE_IDENTITY()
- // Returns the last IDENTITY value inserted into an IDENTITY column in
- // the same scope. A scope is a module -- a stored procedure, trigger,
- // function, or batch. Thus, two statements are in the same scope if
- // they are in the same stored procedure, function, or batch.
- return $this->GetOne($this->identitySQL);
- }
-
-
- function MetaForeignKeys($table, $owner=false, $upper=false)
- {
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- $table = $this->qstr(strtoupper($table));
-
- $sql =
-"select object_name(constid) as constraint_name,
- col_name(fkeyid, fkey) as column_name,
- object_name(rkeyid) as referenced_table_name,
- col_name(rkeyid, rkey) as referenced_column_name
-from sysforeignkeys
-where upper(object_name(fkeyid)) = $table
-order by constraint_name, referenced_table_name, keyno";
-
- $constraints =& $this->GetArray($sql);
-
- $ADODB_FETCH_MODE = $save;
-
- $arr = false;
- foreach($constraints as $constr) {
- //print_r($constr);
- $arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];
- }
- if (!$arr) return false;
-
- $arr2 = false;
-
- foreach($arr as $k => $v) {
- foreach($v as $a => $b) {
- if ($upper) $a = strtoupper($a);
- $arr2[$a] = $b;
- }
- }
- return $arr2;
- }
-
- function &MetaTables($ttype=false,$showSchema=false,$mask=false)
- {
- if ($mask) {$this->debug=1;
- $save = $this->metaTablesSQL;
- $mask = $this->qstr($mask);
- $this->metaTablesSQL .= " AND name like $mask";
- }
- $ret =& ADOConnection::MetaTables($ttype,$showSchema);
-
- if ($mask) {
- $this->metaTablesSQL = $save;
- }
- return $ret;
- }
-
- function &MetaColumns($table)
- {
- return ADOConnection::MetaColumns($table);
- }
-
- function _query($sql,$inputarr)
- {
- if (is_string($sql)) $sql = str_replace('||','+',$sql);
- return ADODB_odbc::_query($sql,$inputarr);
- }
-
- // "Stein-Aksel Basma"
";
+ return $sql;
+ }
+ return array($sql,$stmt,false);
+ }
+
+ function PrepareSP($sql)
+ {
+ if (!$this->_canPrepareSP) return $sql; // Can't prepare procedures
+
+ $stmt = odbtp_prepare_proc($sql,$this->_connectionID);
+ if (!$stmt) return false;
+ return array($sql,$stmt);
+ }
+
+ /*
+ Usage:
+ $stmt = $db->PrepareSP('SP_RUNSOMETHING'); -- takes 2 params, @myid and @group
+
+ # note that the parameter does not have @ in front!
+ $db->Parameter($stmt,$id,'myid');
+ $db->Parameter($stmt,$group,'group',false,64);
+ $db->Parameter($stmt,$group,'photo',false,100000,ODB_BINARY);
+ $db->Execute($stmt);
+
+ @param $stmt Statement returned by Prepare() or PrepareSP().
+ @param $var PHP variable to bind to. Can set to null (for isNull support).
+ @param $name Name of stored procedure variable name to bind to.
+ @param [$isOutput] Indicates direction of parameter 0/false=IN 1=OUT 2= IN/OUT. This is ignored in odbtp.
+ @param [$maxLen] Holds an maximum length of the variable.
+ @param [$type] The data type of $var. Legal values depend on driver.
+
+ See odbtp_attach_param documentation at http://odbtp.sourceforge.net.
+ */
+ function Parameter(&$stmt, &$var, $name, $isOutput=false, $maxLen=0, $type=0)
+ {
+ if ( $this->odbc_driver == ODB_DRIVER_JET ) {
+ $name = '['.$name.']';
+ if( !$type && $this->_useUnicodeSQL
+ && @odbtp_param_bindtype($stmt[1], $name) == ODB_CHAR )
+ {
+ $type = ODB_WCHAR;
+ }
+ }
+ else {
+ $name = '@'.$name;
+ }
+ return odbtp_attach_param($stmt[1], $name, $var, $type, $maxLen);
+ }
+
+ /*
+ Insert a null into the blob field of the table first.
+ Then use UpdateBlob to store the blob.
+
+ Usage:
+
+ $conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
+ $conn->UpdateBlob('blobtable','blobcol',$blob,'id=1');
+ */
+
+ function UpdateBlob($table,$column,$val,$where,$blobtype='image')
+ {
+ $sql = "UPDATE $table SET $column = ? WHERE $where";
+ if( !($stmt = odbtp_prepare($sql, $this->_connectionID)) )
+ return false;
+ if( !odbtp_input( $stmt, 1, ODB_BINARY, 1000000, $blobtype ) )
+ return false;
+ if( !odbtp_set( $stmt, 1, $val ) )
+ return false;
+ return odbtp_execute( $stmt ) != false;
+ }
+
+ function IfNull( $field, $ifNull )
+ {
+ switch( $this->odbc_driver ) {
+ case ODB_DRIVER_MSSQL:
+ return " ISNULL($field, $ifNull) ";
+ case ODB_DRIVER_JET:
+ return " IIF(IsNull($field), $ifNull, $field) ";
+ }
+ return " CASE WHEN $field is null THEN $ifNull ELSE $field END ";
+ }
+
+ function _query($sql,$inputarr=false)
+ {
+ if ($inputarr) {
+ if (is_array($sql)) {
+ $stmtid = $sql[1];
+ } else {
+ $stmtid = odbtp_prepare($sql,$this->_connectionID);
+ if ($stmtid == false) {
+ $this->_errorMsg = $php_errormsg;
+ return false;
+ }
+ }
+ $num_params = odbtp_num_params( $stmtid );
+ for( $param = 1; $param <= $num_params; $param++ ) {
+ @odbtp_input( $stmtid, $param );
+ @odbtp_set( $stmtid, $param, $inputarr[$param-1] );
+ }
+ if (! odbtp_execute($stmtid) ) {
+ return false;
+ }
+ } else if (is_array($sql)) {
+ $stmtid = $sql[1];
+ if (!odbtp_execute($stmtid)) {
+ return false;
+ }
+ } else {
+ $stmtid = @odbtp_query($sql,$this->_connectionID);
+ }
+ $this->_lastAffectedRows = 0;
+ if ($stmtid) {
+ $this->_lastAffectedRows = @odbtp_affected_rows($stmtid);
+ }
+ return $stmtid;
+ }
+
+ function _close()
+ {
+ $ret = @odbtp_close($this->_connectionID);
+ $this->_connectionID = false;
+ return $ret;
+ }
+}
+
+class ADORecordSet_odbtp extends ADORecordSet {
+
+ var $databaseType = 'odbtp';
+ var $canSeek = true;
+
+ function ADORecordSet_odbtp($queryID,$mode=false)
+ {
+ if ($mode === false) {
+ global $ADODB_FETCH_MODE;
+ $mode = $ADODB_FETCH_MODE;
+ }
+ $this->fetchMode = $mode;
+ $this->ADORecordSet($queryID);
+ }
+
+ function _initrs()
+ {
+ $this->_numOfFields = @odbtp_num_fields($this->_queryID);
+ if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID)))
+ $this->_numOfRows = -1;
+ }
+
+ function &FetchField($fieldOffset = 0)
+ {
+ $off=$fieldOffset; // offsets begin at 0
+ $o= new ADOFieldObject();
+ $o->name = @odbtp_field_name($this->_queryID,$off);
+ $o->type = @odbtp_field_type($this->_queryID,$off);
+ $o->max_length = @odbtp_field_length($this->_queryID,$off);
+ if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
+ else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
+ return $o;
+ }
+
+ function _seek($row)
+ {
+ return @odbtp_data_seek($this->_queryID, $row);
+ }
+
+ function fields($colname)
+ {
+ if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
+
+ if (!$this->bind) {
+ $this->bind = array();
+ for ($i=0; $i < $this->_numOfFields; $i++) {
+ $name = @odbtp_field_name( $this->_queryID, $i );
+ $this->bind[strtoupper($name)] = $i;
+ }
+ }
+ return $this->fields[$this->bind[strtoupper($colname)]];
+ }
+
+ function _fetch_odbtp($type=0)
+ {
+ switch ($this->fetchMode) {
+ case ADODB_FETCH_NUM:
+ $this->fields = @odbtp_fetch_row($this->_queryID, $type);
+ break;
+ case ADODB_FETCH_ASSOC:
+ $this->fields = @odbtp_fetch_assoc($this->_queryID, $type);
+ break;
+ default:
+ $this->fields = @odbtp_fetch_array($this->_queryID, $type);
+ }
+ return is_array($this->fields);
+ }
+
+ function _fetch()
+ {
+ return $this->_fetch_odbtp();
+ }
+
+ function MoveFirst()
+ {
+ if (!$this->_fetch_odbtp(ODB_FETCH_FIRST)) return false;
+ $this->EOF = false;
+ $this->_currentRow = 0;
+ return true;
+ }
+
+ function MoveLast()
+ {
+ if (!$this->_fetch_odbtp(ODB_FETCH_LAST)) return false;
+ $this->EOF = false;
+ $this->_currentRow = $this->_numOfRows - 1;
+ return true;
+ }
+
+ function NextRecordSet()
+ {
+ if (!@odbtp_next_result($this->_queryID)) return false;
+ $this->_inited = false;
+ $this->bind = false;
+ $this->_currentRow = -1;
+ $this->Init();
+ return true;
+ }
+
+ function _close()
+ {
+ return @odbtp_free_query($this->_queryID);
+ }
+}
+
+?>
+
+
diff --git a/lib/adodb/drivers/adodb-odbtp_unicode.inc.php b/lib/adodb/drivers/adodb-odbtp_unicode.inc.php
new file mode 100644
index 0000000000..af942a352b
--- /dev/null
+++ b/lib/adodb/drivers/adodb-odbtp_unicode.inc.php
@@ -0,0 +1,63 @@
+
+
+// security - hide paths
+if (!defined('ADODB_DIR')) die();
+
+/*
+ Because the ODBTP server sends and reads UNICODE text data using UTF-8
+ encoding, the following HTML meta tag must be included within the HTML
+ head section of every HTML form and script page:
+
+
+
+ Also, all SQL query strings must be submitted as UTF-8 encoded text.
+*/
+
+if (!defined('_ADODB_ODBTP_LAYER')) {
+ include(ADODB_DIR."/drivers/adodb-odbtp.inc.php");
+}
+
+class ADODB_odbtp_unicode extends ADODB_odbtp {
+ var $databaseType = "odbtp_unicode";
+ var $_useUnicodeSQL = true;
+
+ function ADODB_odbtp_unicode()
+ {
+ $this->ADODB_odbtp();
+ }
+}
+
+class ADORecordSet_odbtp_unicode extends ADORecordSet_odbtp {
+ var $databaseType = 'odbtp_unicode';
+
+ function ADORecordSet_odbtp_unicode($queryID,$mode=false)
+ {
+ $this->ADORecordSet_odbtp($queryID, $mode);
+ }
+
+ function _initrs()
+ {
+ $this->_numOfFields = @odbtp_num_fields($this->_queryID);
+ if (!($this->_numOfRows = @odbtp_num_rows($this->_queryID)))
+ $this->_numOfRows = -1;
+
+ if ($this->connection->odbc_driver == ODB_DRIVER_JET) {
+ for ($f = 0; $f < $this->_numOfFields; $f++) {
+ if (odbtp_field_bindtype($this->_queryID, $f) == ODB_CHAR)
+ odbtp_bind_field($this->_queryID, $f, ODB_WCHAR);
+ }
+ }
+ }
+}
+?>
+
diff --git a/lib/adodb/drivers/adodb-oracle.inc.php b/lib/adodb/drivers/adodb-oracle.inc.php
index bcc49118d7..e36216c2b0 100644
--- a/lib/adodb/drivers/adodb-oracle.inc.php
+++ b/lib/adodb/drivers/adodb-oracle.inc.php
@@ -1,299 +1,320 @@
-fmtDate,$d).",'YYYY-MM-DD')";
- }
-
- // format and return date string in database timestamp format
- function DBTimeStamp($ts)
- {
-
- if (is_string($ts)) $d = ADORecordSet::UnixTimeStamp($ts);
- return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'RRRR-MM-DD, HH:MI:SS AM')";
- }
-
-
- function BeginTrans()
- {
- $this->autoCommit = false;
- ora_commitoff($this->_connectionID);
- return true;
- }
-
-
- function CommitTrans($ok=true)
- {
- if (!$ok) return $this->RollbackTrans();
- $ret = ora_commit($this->_connectionID);
- ora_commiton($this->_connectionID);
- return $ret;
- }
-
-
- function RollbackTrans()
- {
- $ret = ora_rollback($this->_connectionID);
- ora_commiton($this->_connectionID);
- return $ret;
- }
-
-
- /* there seems to be a bug in the oracle extension -- always returns ORA-00000 - no error */
- function ErrorMsg()
- {
- $this->_errorMsg = @ora_error($this->_curs);
- if (!$this->_errorMsg) $this->_errorMsg = @ora_error($this->_connectionID);
- return $this->_errorMsg;
- }
-
-
- function ErrorNo()
- {
- $err = @ora_errorcode($this->_curs);
- if (!$err) return @ora_errorcode($this->_connectionID);
- }
-
-
-
- // returns true or false
- function _connect($argHostname, $argUsername, $argPassword, $argDatabasename, $mode=0)
- {
- // G. Giunta 2003/08/13 - This looks danegrously suspicious: why should we want to set
- // the oracle home to the host name of remote DB?
-// if ($argHostname) putenv("ORACLE_HOME=$argHostname");
-
- if($argHostname) { // code copied from version submitted for oci8 by Jorma Tuomainen
";
- return $o;
- }
-
- function _seek($row)
- {
- return @pg_fetch_row($this->_queryID,$row);
- }
-
- function _decode($blob)
- {
- eval('$realblob="'.adodb_str_replace(array('"','$'),array('\"','\$'),$blob).'";');
- return $realblob;
- }
-
- function _fixblobs()
- {
- if ($this->fetchMode == PGSQL_NUM || $this->fetchMode == PGSQL_BOTH) {
- foreach($this->_blobArr as $k => $v) {
- $this->fields[$k] = ADORecordSet_postgres64::_decode($this->fields[$k]);
- }
- }
- if ($this->fetchMode == PGSQL_ASSOC || $this->fetchMode == PGSQL_BOTH) {
- foreach($this->_blobArr as $k => $v) {
- $this->fields[$v] = ADORecordSet_postgres64::_decode($this->fields[$v]);
- }
- }
- }
-
- // 10% speedup to move MoveNext to child class
- function MoveNext()
- {
- if (!$this->EOF) {
- $this->_currentRow++;
- if ($this->_numOfRows < 0 || $this->_numOfRows > $this->_currentRow) {
- $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
- if (is_array($this->fields) && $this->fields) {
- if ($this->fields && isset($this->_blobArr)) $this->_fixblobs();
- return true;
- }
- }
- $this->fields = false;
- $this->EOF = true;
- }
- return false;
- }
-
- function _fetch()
- {
-
- if ($this->_currentRow >= $this->_numOfRows && $this->_numOfRows >= 0)
- return false;
-
- $this->fields = @pg_fetch_array($this->_queryID,$this->_currentRow,$this->fetchMode);
-
- if ($this->fields && isset($this->_blobArr)) $this->_fixblobs();
-
- return (is_array($this->fields));
- }
-
- function _close()
- {
- return @pg_freeresult($this->_queryID);
- }
-
- function MetaType($t,$len=-1,$fieldobj=false)
- {
- if (is_object($t)) {
- $fieldobj = $t;
- $t = $fieldobj->type;
- $len = $fieldobj->max_length;
- }
- switch (strtoupper($t)) {
- case 'MONEY': // stupid, postgres expects money to be a string
- case 'INTERVAL':
- case 'CHAR':
- case 'CHARACTER':
- case 'VARCHAR':
- case 'NAME':
- case 'BPCHAR':
- case '_VARCHAR':
- if ($len <= $this->blobSize) return 'C';
-
- case 'TEXT':
- return 'X';
-
- case 'IMAGE': // user defined type
- case 'BLOB': // user defined type
- case 'BIT': // This is a bit string, not a single bit, so don't return 'L'
- case 'VARBIT':
- case 'BYTEA':
- return 'B';
-
- case 'BOOL':
- case 'BOOLEAN':
- return 'L';
-
- case 'DATE':
- return 'D';
-
- case 'TIME':
- case 'DATETIME':
- case 'TIMESTAMP':
- case 'TIMESTAMPTZ':
- return 'T';
-
- case 'SMALLINT':
- case 'BIGINT':
- case 'INTEGER':
- case 'INT8':
- case 'INT4':
- case 'INT2':
- if (isset($fieldobj) &&
- empty($fieldobj->primary_key) && empty($fieldobj->unique)) return 'I';
-
- case 'OID':
- case 'SERIAL':
- return 'R';
-
- default:
- return 'N';
- }
- }
-
-}
-?>
+
+ jlim - changed concat operator to || and data types to MetaType to match documented pgsql types
+ see http://www.postgresql.org/devel-corner/docs/postgres/datatype.htm
+ 22 Nov 2000 jlim - added changes to FetchField() and MetaTables() contributed by "raser"
';
-
- $rs->NextRecordSet();
- }
-
- $this->conn->Execute("SET SHOWPLAN_ALL OFF;");
- $this->conn->LogSQL($save);
- $s .= $this->Tracer($sql);
- return $s;
- }
-
- function Tables()
- {
- global $ADODB_FETCH_MODE;
-
- $save = $ADODB_FETCH_MODE;
- $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
- //$this->conn->debug=1;
- $s = ' ';
- while (!$rs->EOF) {
- $s .= ' Rows IO CPU Plan \n"; ## NOTE CORRUPT tag is intentional!!!!
- $rs->MoveNext();
- }
- $s .= ''.round($rs->fields[8],1).' '.round($rs->fields[9],3).' '.round($rs->fields[10],3).' '.htmlspecialchars($rs->fields[0])."
';
- }
-
- function sp_who()
- {
- $arr = $this->conn->GetArray('sp_who');
- return sizeof($arr);
- }
-
- function HealthCheck($cli=false)
- {
-
- $this->conn->Execute('dbcc traceon(3604)');
- $html = adodb_perf::HealthCheck($cli);
- $this->conn->Execute('dbcc traceoff(3604)');
- return $html;
- }
-
-
-}
-
+ array('RATIO',
+ "select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'",
+ '=WarnCacheRatio'),
+ 'prepared sql hit ratio' => array('RATIO',
+ array('dbcc cachestats','Prepared',1,100),
+ ''),
+ 'adhoc sql hit ratio' => array('RATIO',
+ array('dbcc cachestats','Adhoc',1,100),
+ ''),
+ 'IO',
+ 'data reads' => array('IO',
+ "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"),
+ 'data writes' => array('IO',
+ "select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"),
+
+ 'Data Cache',
+ 'data cache size' => array('DATAC',
+ "select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'",
+ '' ),
+ 'data cache blocksize' => array('DATAC',
+ "select 8192",'page size'),
+ 'Connections',
+ 'current connections' => array('SESS',
+ '=sp_who',
+ ''),
+ 'max connections' => array('SESS',
+ "SELECT @@MAX_CONNECTIONS",
+ ''),
+
+ false
+ );
+
+
+ function perf_mssql(&$conn)
+ {
+ if ($conn->dataProvider == 'odbc') {
+ $this->sql1 = 'sql1';
+ //$this->explain = false;
+ }
+ $this->conn =& $conn;
+ }
+
+ function Explain($sql,$partial=false)
+ {
+
+ $save = $this->conn->LogSQL(false);
+ if ($partial) {
+ $sqlq = $this->conn->qstr($sql.'%');
+ $arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
+ if ($arr) {
+ foreach($arr as $row) {
+ $sql = reset($row);
+ if (crc32($sql) == $partial) break;
+ }
+ }
+ }
+
+ $s = ' ';
- $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'");
- if ($rs1) {
- while (!$rs1->EOF) {
- $tab = $rs1->fields[0];
- $tabq = $this->conn->qstr($tab);
- $rs2 = $this->conn->Execute("sp_spaceused $tabq");
- if ($rs2) {
- $s .= 'tablename size_in_k index size reserved size ';
- $rs2->Close();
- }
- $rs1->MoveNext();
- }
- $rs1->Close();
- }
- $ADODB_FETCH_MODE = $save;
- return $s.''.$tab.' '.$rs2->fields[3].' '.$rs2->fields[4].' '.$rs2->fields[2].'
';
+
+ $rs->NextRecordSet();
+ }
+
+ $this->conn->Execute("SET SHOWPLAN_ALL OFF;");
+ $this->conn->LogSQL($save);
+ $s .= $this->Tracer($sql);
+ return $s;
+ }
+
+ function Tables()
+ {
+ global $ADODB_FETCH_MODE;
+
+ $save = $ADODB_FETCH_MODE;
+ $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+ //$this->conn->debug=1;
+ $s = ' ';
+ while (!$rs->EOF) {
+ $s .= ' Rows IO CPU Plan \n"; ## NOTE CORRUPT tag is intentional!!!!
+ $rs->MoveNext();
+ }
+ $s .= ''.round($rs->fields[8],1).' '.round($rs->fields[9],3).' '.round($rs->fields[10],3).' '.htmlspecialchars($rs->fields[0])."
';
+ }
+
+ function sp_who()
+ {
+ $arr = $this->conn->GetArray('sp_who');
+ return sizeof($arr);
+ }
+
+ function HealthCheck($cli=false)
+ {
+
+ $this->conn->Execute('dbcc traceon(3604)');
+ $html = adodb_perf::HealthCheck($cli);
+ $this->conn->Execute('dbcc traceoff(3604)');
+ return $html;
+ }
+
+
+}
+
?>
\ No newline at end of file
diff --git a/lib/adodb/perf/perf-mysql.inc.php b/lib/adodb/perf/perf-mysql.inc.php
index 274bca9b30..4ff94d14ad 100644
--- a/lib/adodb/perf/perf-mysql.inc.php
+++ b/lib/adodb/perf/perf-mysql.inc.php
@@ -1,256 +1,259 @@
- array('RATIO',
- '=GetKeyHitRatio',
- '=WarnCacheRatio'),
- 'InnoDB cache hit ratio' => array('RATIO',
- '=GetInnoDBHitRatio',
- '=WarnCacheRatio'),
- 'data cache hit ratio' => array('HIDE', # only if called
- '=FindDBHitRatio',
- '=WarnCacheRatio'),
- 'sql cache hit ratio' => array('RATIO',
- '=GetQHitRatio',
- ''),
- 'IO',
- 'data reads' => array('IO',
- '=GetReads',
- 'Number of selects (Key_reads is not accurate)'),
- 'data writes' => array('IO',
- '=GetWrites',
- 'Number of inserts/updates/deletes * coef (Key_writes is not accurate)'),
-
- 'Data Cache',
- 'MyISAM data cache size' => array('DATAC',
- array("show variables", 'key_buffer_size'),
- '' ),
- 'BDB data cache size' => array('DATAC',
- array("show variables", 'bdb_cache_size'),
- '' ),
- 'InnoDB data cache size' => array('DATAC',
- array("show variables", 'innodb_buffer_pool_size'),
- '' ),
- 'Memory Usage',
- 'read buffer size' => array('CACHE',
- array("show variables", 'read_buffer_size'),
- '(per session)'),
- 'sort buffer size' => array('CACHE',
- array("show variables", 'sort_buffer_size'),
- 'Size of sort buffer (per session)' ),
- 'table cache' => array('CACHE',
- array("show variables", 'table_cache'),
- 'Number of tables to keep open'),
- 'Connections',
- 'current connections' => array('SESS',
- array('show status','Threads_connected'),
- ''),
- 'max connections' => array( 'SESS',
- array("show variables",'max_connections'),
- ''),
-
- false
- );
-
- function perf_mysql(&$conn)
- {
- $this->conn =& $conn;
- }
-
- function Explain($sql,$partial=false)
- {
-
- if (strtoupper(substr(trim($sql),0,6)) !== 'SELECT') return ' ';
+ $rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'");
+ if ($rs1) {
+ while (!$rs1->EOF) {
+ $tab = $rs1->fields[0];
+ $tabq = $this->conn->qstr($tab);
+ $rs2 = $this->conn->Execute("sp_spaceused $tabq");
+ if ($rs2) {
+ $s .= 'tablename size_in_k index size reserved size ';
+ $rs2->Close();
+ }
+ $rs1->MoveNext();
+ }
+ $rs1->Close();
+ }
+ $ADODB_FETCH_MODE = $save;
+ return $s.''.$tab.' '.$rs2->fields[3].' '.$rs2->fields[4].' '.$rs2->fields[2].'
-CREATE TABLE PLAN_TABLE (
- STATEMENT_ID VARCHAR2(30),
- TIMESTAMP DATE,
- REMARKS VARCHAR2(80),
- OPERATION VARCHAR2(30),
- OPTIONS VARCHAR2(30),
- OBJECT_NODE VARCHAR2(128),
- OBJECT_OWNER VARCHAR2(30),
- OBJECT_NAME VARCHAR2(30),
- OBJECT_INSTANCE NUMBER(38),
- OBJECT_TYPE VARCHAR2(30),
- OPTIMIZER VARCHAR2(255),
- SEARCH_COLUMNS NUMBER,
- ID NUMBER(38),
- PARENT_ID NUMBER(38),
- POSITION NUMBER(38),
- COST NUMBER(38),
- CARDINALITY NUMBER(38),
- BYTES NUMBER(38),
- OTHER_TAG VARCHAR2(255),
- PARTITION_START VARCHAR2(255),
- PARTITION_STOP VARCHAR2(255),
- PARTITION_ID NUMBER(38),
- OTHER LONG,
- DISTRIBUTION VARCHAR2(30)
-);
-
";
- return false;
- }
-
- $rs->Close();
- // $this->conn->debug=1;
-
- if ($partial) {
- $sqlq = $this->conn->qstr($sql.'%');
- $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
- if ($arr) {
- foreach($arr as $row) {
- $sql = reset($row);
- if (crc32($sql) == $partial) break;
- }
- }
- }
-
- $s = "'||lpad('--', (level-1)*2,'-') || trim(operation) || ' ' || trim(options)||'
' as Operation,
- object_name,COST,CARDINALITY,bytes
- FROM plan_table
-START WITH id = 0 and STATEMENT_ID='$id'
-CONNECT BY prior id=parent_id and statement_id='$id'");
-
- $s .= rs2html($rs,false,false,false,false);
- $this->conn->RollbackTrans();
- $this->conn->LogSQL($savelog);
- $s .= $this->Tracer($sql,$partial);
- return $s;
- }
-
-
- function CheckMemory()
- {
- if ($this->version['version'] < 9) return 'Oracle 9i or later required';
-
- $rs =& $this->conn->Execute("
-select a.size_for_estimate as cache_mb_estimate,
- case when a.size_factor=1 then
- '<<= current'
- when a.estd_physical_read_factor-b.estd_physical_read_factor > 0 and a.estd_physical_read_factor<1 then
- '- BETTER - '
- else ' ' end as currsize,
- a.estd_physical_read_factor-b.estd_physical_read_factor as best_when_0
- from (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) a ,
- (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) b where a.r = b.r-1");
- if (!$rs) return false;
-
- /*
- The v$db_cache_advice utility show the marginal changes in physical data block reads for different sizes of db_cache_size
- */
- $s = "Data Cache Estimate
";
- if ($rs->EOF) {
- $s .= "
\n\n";
- }
-
- // code thanks to Ixora.
- // http://www.ixora.com.au/scripts/query_opt.htm
- // requires oracle 8.1.7 or later
- function SuspiciousSQL($numsql=10)
- {
- $sql = "
-select
- substr(to_char(s.pct, '99.00'), 2) || '%' load,
- s.executions executes,
- p.sql_text
-from
- (
- select
- address,
- buffer_gets,
- executions,
- pct,
- rank() over (order by buffer_gets desc) ranking
- from
- (
- select
- address,
- buffer_gets,
- executions,
- 100 * ratio_to_report(buffer_gets) over () pct
- from
- sys.v_\$sql
- where
- command_type != 47 and module != 'T.O.A.D.'
- )
- where
- buffer_gets > 50 * executions
- ) s,
- sys.v_\$sqltext p
-where
- s.ranking <= $numsql and
- p.address = s.address
-order by
- 1 desc, s.address, p.piece";
-
- global $ADODB_CACHE_MODE,$HTTP_GET_VARS;
- if (isset($HTTP_GET_VARS['expsixora']) && isset($HTTP_GET_VARS['sql'])) {
- $partial = empty($HTTP_GET_VARS['part']);
- echo "".$this->Explain($HTTP_GET_VARS['sql'],$partial)."\n";
- }
-
- if (isset($HTTP_GET_VARS['sql'])) return $this->_SuspiciousSQL();
-
- $save = $ADODB_CACHE_MODE;
- $ADODB_CACHE_MODE = ADODB_FETCH_NUM;
- $savelog = $this->conn->LogSQL(false);
- $rs =& $this->conn->SelectLimit($sql);
- $this->conn->LogSQL($savelog);
- $ADODB_CACHE_MODE = $save;
- if ($rs) {
- $s = "\n ';
- while (!$rs->EOF) {
- if ($check != $rs->fields[0].'::'.$rs->fields[1]) {
- if ($check) {
- $carr = explode('::',$check);
- $prefix = "';
- $suffix = '';
- if (strlen($prefix)>2000) {
- $prefix = '';
- $suffix = '';
- }
-
- $s .= "\n".$o1->name.' '.$o2->name.' '.$o3->name.' ';
- }
- $sql = $rs->fields[2];
- $check = $rs->fields[0].'::'.$rs->fields[1];
- } else
- $sql .= $rs->fields[2];
-
- $rs->MoveNext();
- }
- $rs->Close();
-
- $carr = explode('::',$check);
- $prefix = "';
- $suffix = '';
- if (strlen($prefix)>2000) {
- $prefix = '';
- $suffix = '';
- }
- $s .= "\n".$carr[0].' '.$carr[1].' '.$prefix.$sql.$suffix.' ';
-
- return $s."".$carr[0].' '.$carr[1].' '.$prefix.$sql.$suffix.' Ixora Suspicious SQL
";
- $s .= $this->tohtml($rs,'expsixora');
- } else
- $s = '';
-
- if ($s) $s .= 'Ixora Expensive SQL
";
- $s .= $this->tohtml($rs,'expeixora');
- } else
- $s = '';
-
-
- if ($s) $s .= '
+CREATE TABLE PLAN_TABLE (
+ STATEMENT_ID VARCHAR2(30),
+ TIMESTAMP DATE,
+ REMARKS VARCHAR2(80),
+ OPERATION VARCHAR2(30),
+ OPTIONS VARCHAR2(30),
+ OBJECT_NODE VARCHAR2(128),
+ OBJECT_OWNER VARCHAR2(30),
+ OBJECT_NAME VARCHAR2(30),
+ OBJECT_INSTANCE NUMBER(38),
+ OBJECT_TYPE VARCHAR2(30),
+ OPTIMIZER VARCHAR2(255),
+ SEARCH_COLUMNS NUMBER,
+ ID NUMBER(38),
+ PARENT_ID NUMBER(38),
+ POSITION NUMBER(38),
+ COST NUMBER(38),
+ CARDINALITY NUMBER(38),
+ BYTES NUMBER(38),
+ OTHER_TAG VARCHAR2(255),
+ PARTITION_START VARCHAR2(255),
+ PARTITION_STOP VARCHAR2(255),
+ PARTITION_ID NUMBER(38),
+ OTHER LONG,
+ DISTRIBUTION VARCHAR2(30)
+);
+
";
+ return false;
+ }
+
+ $rs->Close();
+ // $this->conn->debug=1;
+
+ if ($partial) {
+ $sqlq = $this->conn->qstr($sql.'%');
+ $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
+ if ($arr) {
+ foreach($arr as $row) {
+ $sql = reset($row);
+ if (crc32($sql) == $partial) break;
+ }
+ }
+ }
+
+ $s = "'||lpad('--', (level-1)*2,'-') || trim(operation) || ' ' || trim(options)||'
' as Operation,
+ object_name,COST,CARDINALITY,bytes
+ FROM plan_table
+START WITH id = 0 and STATEMENT_ID='$id'
+CONNECT BY prior id=parent_id and statement_id='$id'");
+
+ $s .= rs2html($rs,false,false,false,false);
+ $this->conn->RollbackTrans();
+ $this->conn->LogSQL($savelog);
+ $s .= $this->Tracer($sql,$partial);
+ return $s;
+ }
+
+
+ function CheckMemory()
+ {
+ if ($this->version['version'] < 9) return 'Oracle 9i or later required';
+
+ $rs =& $this->conn->Execute("
+select a.size_for_estimate as cache_mb_estimate,
+ case when a.size_factor=1 then
+ '<<= current'
+ when a.estd_physical_read_factor-b.estd_physical_read_factor > 0 and a.estd_physical_read_factor<1 then
+ '- BETTER - '
+ else ' ' end as currsize,
+ a.estd_physical_read_factor-b.estd_physical_read_factor as best_when_0
+ from (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) a ,
+ (select size_for_estimate,size_factor,estd_physical_read_factor,rownum r from v\$db_cache_advice) b where a.r = b.r-1");
+ if (!$rs) return false;
+
+ /*
+ The v$db_cache_advice utility show the marginal changes in physical data block reads for different sizes of db_cache_size
+ */
+ $s = "Data Cache Estimate
";
+ if ($rs->EOF) {
+ $s .= "
\n\n";
+ }
+
+ // code thanks to Ixora.
+ // http://www.ixora.com.au/scripts/query_opt.htm
+ // requires oracle 8.1.7 or later
+ function SuspiciousSQL($numsql=10)
+ {
+ $sql = "
+select
+ substr(to_char(s.pct, '99.00'), 2) || '%' load,
+ s.executions executes,
+ p.sql_text
+from
+ (
+ select
+ address,
+ buffer_gets,
+ executions,
+ pct,
+ rank() over (order by buffer_gets desc) ranking
+ from
+ (
+ select
+ address,
+ buffer_gets,
+ executions,
+ 100 * ratio_to_report(buffer_gets) over () pct
+ from
+ sys.v_\$sql
+ where
+ command_type != 47 and module != 'T.O.A.D.'
+ )
+ where
+ buffer_gets > 50 * executions
+ ) s,
+ sys.v_\$sqltext p
+where
+ s.ranking <= $numsql and
+ p.address = s.address
+order by
+ 1 desc, s.address, p.piece";
+
+ global $ADODB_CACHE_MODE,$HTTP_GET_VARS;
+ if (isset($HTTP_GET_VARS['expsixora']) && isset($HTTP_GET_VARS['sql'])) {
+ $partial = empty($HTTP_GET_VARS['part']);
+ echo "".$this->Explain($HTTP_GET_VARS['sql'],$partial)."\n";
+ }
+
+ if (isset($HTTP_GET_VARS['sql'])) return $this->_SuspiciousSQL();
+
+ $save = $ADODB_CACHE_MODE;
+ $ADODB_CACHE_MODE = ADODB_FETCH_NUM;
+ $savelog = $this->conn->LogSQL(false);
+ $rs =& $this->conn->SelectLimit($sql);
+ $this->conn->LogSQL($savelog);
+ $ADODB_CACHE_MODE = $save;
+ if ($rs) {
+ $s = "\n ';
+ while (!$rs->EOF) {
+ if ($check != $rs->fields[0].'::'.$rs->fields[1]) {
+ if ($check) {
+ $carr = explode('::',$check);
+ $prefix = "';
+ $suffix = '';
+ if (strlen($prefix)>2000) {
+ $prefix = '';
+ $suffix = '';
+ }
+
+ $s .= "\n".$o1->name.' '.$o2->name.' '.$o3->name.' ';
+ }
+ $sql = $rs->fields[2];
+ $check = $rs->fields[0].'::'.$rs->fields[1];
+ } else
+ $sql .= $rs->fields[2];
+
+ $rs->MoveNext();
+ }
+ $rs->Close();
+
+ $carr = explode('::',$check);
+ $prefix = "';
+ $suffix = '';
+ if (strlen($prefix)>2000) {
+ $prefix = '';
+ $suffix = '';
+ }
+ $s .= "\n".$carr[0].' '.$carr[1].' '.$prefix.$sql.$suffix.' ';
+
+ return $s."".$carr[0].' '.$carr[1].' '.$prefix.$sql.$suffix.' Ixora Suspicious SQL
";
+ $s .= $this->tohtml($rs,'expsixora');
+ } else
+ $s = '';
+
+ if ($s) $s .= 'Ixora Expensive SQL
";
+ $s .= $this->tohtml($rs,'expeixora');
+ } else
+ $s = '';
+
+
+ if ($s) $s .= '';
- if ($rs)
- while (!$rs->EOF) {
- $s .= reset($rs->fields)."\n";
- $rs->MoveNext();
- }
- $s .= '
';
- $s .= $this->Tracer($sql,$partial);
- return $s;
- }
-}
+ array('RATIO',
+ "select case when count(*)=3 then 'TRUE' else 'FALSE' end from pg_settings where (name='stats_block_level' or name='stats_row_level' or name='stats_start_collector') and setting='on' ",
+ 'Value must be TRUE to enable hit ratio statistics (stats_start_collector,stats_row_level and stats_block_level must be set to true in postgresql.conf)'),
+ 'data cache hit ratio' => array('RATIO',
+ "select case when blks_hit=0 then 0 else (1-blks_read::float/blks_hit)*100 end from pg_stat_database where datname='\$DATABASE'",
+ '=WarnCacheRatio'),
+ 'IO',
+ 'data reads' => array('IO',
+ 'select sum(heap_blks_read+toast_blks_read) from pg_statio_user_tables',
+ ),
+ 'data writes' => array('IO',
+ 'select sum(n_tup_ins/4.0+n_tup_upd/8.0+n_tup_del/4.0)/16 from pg_stat_user_tables',
+ 'Count of inserts/updates/deletes * coef'),
+
+ 'Data Cache',
+ 'data cache buffers' => array('DATAC',
+ "select setting from pg_settings where name='shared_buffers'",
+ 'Number of cache buffers. Tuning'),
+ 'cache blocksize' => array('DATAC',
+ 'select 8192',
+ '(estimate)' ),
+ 'data cache size' => array( 'DATAC',
+ "select setting::integer*8192 from pg_settings where name='shared_buffers'",
+ '' ),
+ 'operating system cache size' => array( 'DATA',
+ "select setting::integer*8192 from pg_settings where name='effective_cache_size'",
+ '(effective cache size)' ),
+ 'Memory Usage',
+ 'sort buffer size' => array('CACHE',
+ "select setting::integer*1024 from pg_settings where name='sort_mem'",
+ 'Size of sort buffer (per query)' ),
+ 'Connections',
+ 'current connections' => array('SESS',
+ 'select count(*) from pg_stat_activity',
+ ''),
+ 'max connections' => array('SESS',
+ "select setting from pg_settings where name='max_connections'",
+ ''),
+ 'Parameters',
+ 'rollback buffers' => array('COST',
+ "select setting from pg_settings where name='wal_buffers'",
+ 'WAL buffers'),
+ 'random page cost' => array('COST',
+ "select setting from pg_settings where name='random_page_cost'",
+ 'Cost of doing a seek (default=4). See random_page_cost'),
+ false
+ );
+
+ function perf_postgres(&$conn)
+ {
+ $this->conn =& $conn;
+ }
+
+ function Explain($sql,$partial=false)
+ {
+ $save = $this->conn->LogSQL(false);
+
+ if ($partial) {
+ $sqlq = $this->conn->qstr($sql.'%');
+ $arr = $this->conn->GetArray("select distinct distinct sql1 from adodb_logsql where sql1 like $sqlq");
+ if ($arr) {
+ foreach($arr as $row) {
+ $sql = reset($row);
+ if (crc32($sql) == $partial) break;
+ }
+ }
+ }
+ $sql = str_replace('?',"''",$sql);
+ $s = '';
+ if ($rs)
+ while (!$rs->EOF) {
+ $s .= reset($rs->fields)."\n";
+ $rs->MoveNext();
+ }
+ $s .= '
';
+ $s .= $this->Tracer($sql,$partial);
+ return $s;
+ }
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/pivottable.inc.php b/lib/adodb/pivottable.inc.php
index 8d0f7a7b04..a40e3b3f60 100644
--- a/lib/adodb/pivottable.inc.php
+++ b/lib/adodb/pivottable.inc.php
@@ -1,164 +1,164 @@
-GetCol("select distinct $colfield from $tables $where order by 1");
- if (!$aggfield) $hidecnt = false;
-
- $sel = "$rowfields, ";
- if (is_array($colfield)) {
- foreach ($colfield as $k => $v) {
- if (!$hidecnt) $sel .= "\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", ";
- if ($aggfield)
- $sel .= "\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", ";
- }
- } else {
- foreach ($colarr as $v) {
- if (!is_numeric($v)) $vq = $db->qstr($v);
- else $vq = $v;
- if (strlen($v) == 0 ) $v = 'null';
- if (!$hidecnt) $sel .= "\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", ";
- if ($aggfield) {
- if ($hidecnt) $label = $v;
- else $label = "{$v}_$aggfield";
- $sel .= "\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", ";
- }
- }
- }
- if ($aggfield && $aggfield != '1'){
- $agg = "$aggfn($aggfield)";
- $sel .= "\n\t$agg as \"$sumlabel$aggfield\", ";
- }
-
- if ($showcount)
- $sel .= "\n\tSUM(1) as Total";
- else
- $sel = substr($sel,0,strlen($sel)-2);
-
- $sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields";
- return $sql;
- }
-
-/* EXAMPLES USING MS NORTHWIND DATABASE */
-if (0) {
-
-# example1
-#
-# Query the main "product" table
-# Set the rows to CompanyName and QuantityPerUnit
-# and the columns to the Categories
-# and define the joins to link to lookup tables
-# "categories" and "suppliers"
-#
-
- $sql = PivotTableSQL(
- $gDB, # adodb connection
- 'products p ,categories c ,suppliers s', # tables
- 'CompanyName,QuantityPerUnit', # row fields
- 'CategoryName', # column fields
- 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where
-);
- print "$sql";
- $rs = $gDB->Execute($sql);
- rs2html($rs);
-
-/*
-Generated SQL:
-
-SELECT CompanyName,QuantityPerUnit,
- SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
- SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
- SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
- SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products",
- SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
- SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
- SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
- SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
- SUM(1) as Total
-FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
-GROUP BY CompanyName,QuantityPerUnit
-*/
-//=====================================================================
-
-# example2
-#
-# Query the main "product" table
-# Set the rows to CompanyName and QuantityPerUnit
-# and the columns to the UnitsInStock for different ranges
-# and define the joins to link to lookup tables
-# "categories" and "suppliers"
-#
- $sql = PivotTableSQL(
- $gDB, # adodb connection
- 'products p ,categories c ,suppliers s', # tables
- 'CompanyName,QuantityPerUnit', # row fields
- # column ranges
-array(
-' 0 ' => 'UnitsInStock <= 0',
-"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5',
-"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
-"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',
-"16+" =>'15 < UnitsInStock'
-),
- ' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
- 'UnitsInStock', # sum this field
- 'Sum' # sum label prefix
-);
- print "
$sql";
- $rs = $gDB->Execute($sql);
- rs2html($rs);
- /*
- Generated SQL:
-
-SELECT CompanyName,QuantityPerUnit,
- SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum 0 ",
- SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
- SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10",
- SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
- SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
- SUM(UnitsInStock) AS "Sum UnitsInStock",
- SUM(1) as Total
-FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
-GROUP BY CompanyName,QuantityPerUnit
- */
-}
+GetCol("select distinct $colfield from $tables $where order by 1");
+ if (!$aggfield) $hidecnt = false;
+
+ $sel = "$rowfields, ";
+ if (is_array($colfield)) {
+ foreach ($colfield as $k => $v) {
+ if (!$hidecnt) $sel .= "\n\t$aggfn(CASE WHEN $v THEN 1 ELSE 0 END) AS \"$k\", ";
+ if ($aggfield)
+ $sel .= "\n\t$aggfn(CASE WHEN $v THEN $aggfield ELSE 0 END) AS \"$sumlabel$k\", ";
+ }
+ } else {
+ foreach ($colarr as $v) {
+ if (!is_numeric($v)) $vq = $db->qstr($v);
+ else $vq = $v;
+ if (strlen($v) == 0 ) $v = 'null';
+ if (!$hidecnt) $sel .= "\n\t$aggfn(CASE WHEN $colfield=$vq THEN 1 ELSE 0 END) AS \"$v\", ";
+ if ($aggfield) {
+ if ($hidecnt) $label = $v;
+ else $label = "{$v}_$aggfield";
+ $sel .= "\n\t$aggfn(CASE WHEN $colfield=$vq THEN $aggfield ELSE 0 END) AS \"$label\", ";
+ }
+ }
+ }
+ if ($aggfield && $aggfield != '1'){
+ $agg = "$aggfn($aggfield)";
+ $sel .= "\n\t$agg as \"$sumlabel$aggfield\", ";
+ }
+
+ if ($showcount)
+ $sel .= "\n\tSUM(1) as Total";
+ else
+ $sel = substr($sel,0,strlen($sel)-2);
+
+ $sql = "SELECT $sel \nFROM $tables $where \nGROUP BY $rowfields";
+ return $sql;
+ }
+
+/* EXAMPLES USING MS NORTHWIND DATABASE */
+if (0) {
+
+# example1
+#
+# Query the main "product" table
+# Set the rows to CompanyName and QuantityPerUnit
+# and the columns to the Categories
+# and define the joins to link to lookup tables
+# "categories" and "suppliers"
+#
+
+ $sql = PivotTableSQL(
+ $gDB, # adodb connection
+ 'products p ,categories c ,suppliers s', # tables
+ 'CompanyName,QuantityPerUnit', # row fields
+ 'CategoryName', # column fields
+ 'p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID' # joins/where
+);
+ print "
$sql";
+ $rs = $gDB->Execute($sql);
+ rs2html($rs);
+
+/*
+Generated SQL:
+
+SELECT CompanyName,QuantityPerUnit,
+ SUM(CASE WHEN CategoryName='Beverages' THEN 1 ELSE 0 END) AS "Beverages",
+ SUM(CASE WHEN CategoryName='Condiments' THEN 1 ELSE 0 END) AS "Condiments",
+ SUM(CASE WHEN CategoryName='Confections' THEN 1 ELSE 0 END) AS "Confections",
+ SUM(CASE WHEN CategoryName='Dairy Products' THEN 1 ELSE 0 END) AS "Dairy Products",
+ SUM(CASE WHEN CategoryName='Grains/Cereals' THEN 1 ELSE 0 END) AS "Grains/Cereals",
+ SUM(CASE WHEN CategoryName='Meat/Poultry' THEN 1 ELSE 0 END) AS "Meat/Poultry",
+ SUM(CASE WHEN CategoryName='Produce' THEN 1 ELSE 0 END) AS "Produce",
+ SUM(CASE WHEN CategoryName='Seafood' THEN 1 ELSE 0 END) AS "Seafood",
+ SUM(1) as Total
+FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
+GROUP BY CompanyName,QuantityPerUnit
+*/
+//=====================================================================
+
+# example2
+#
+# Query the main "product" table
+# Set the rows to CompanyName and QuantityPerUnit
+# and the columns to the UnitsInStock for different ranges
+# and define the joins to link to lookup tables
+# "categories" and "suppliers"
+#
+ $sql = PivotTableSQL(
+ $gDB, # adodb connection
+ 'products p ,categories c ,suppliers s', # tables
+ 'CompanyName,QuantityPerUnit', # row fields
+ # column ranges
+array(
+' 0 ' => 'UnitsInStock <= 0',
+"1 to 5" => '0 < UnitsInStock and UnitsInStock <= 5',
+"6 to 10" => '5 < UnitsInStock and UnitsInStock <= 10',
+"11 to 15" => '10 < UnitsInStock and UnitsInStock <= 15',
+"16+" =>'15 < UnitsInStock'
+),
+ ' p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID', # joins/where
+ 'UnitsInStock', # sum this field
+ 'Sum' # sum label prefix
+);
+ print "
$sql";
+ $rs = $gDB->Execute($sql);
+ rs2html($rs);
+ /*
+ Generated SQL:
+
+SELECT CompanyName,QuantityPerUnit,
+ SUM(CASE WHEN UnitsInStock <= 0 THEN UnitsInStock ELSE 0 END) AS "Sum 0 ",
+ SUM(CASE WHEN 0 < UnitsInStock and UnitsInStock <= 5 THEN UnitsInStock ELSE 0 END) AS "Sum 1 to 5",
+ SUM(CASE WHEN 5 < UnitsInStock and UnitsInStock <= 10 THEN UnitsInStock ELSE 0 END) AS "Sum 6 to 10",
+ SUM(CASE WHEN 10 < UnitsInStock and UnitsInStock <= 15 THEN UnitsInStock ELSE 0 END) AS "Sum 11 to 15",
+ SUM(CASE WHEN 15 < UnitsInStock THEN UnitsInStock ELSE 0 END) AS "Sum 16+",
+ SUM(UnitsInStock) AS "Sum UnitsInStock",
+ SUM(1) as Total
+FROM products p ,categories c ,suppliers s WHERE p.CategoryID = c.CategoryID and s.SupplierID= p.SupplierID
+GROUP BY CompanyName,QuantityPerUnit
+ */
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/readme.txt b/lib/adodb/readme.txt
index baa71153c7..cca9c96b16 100644
--- a/lib/adodb/readme.txt
+++ b/lib/adodb/readme.txt
@@ -22,8 +22,9 @@ We hope more people will contribute drivers to support other databases.
>> Documentation and Examples
-Refer to readme.htm for full documentation and examples. There is also a
-tutorial tute.htm that contrasts ADODB code with mysql code.
+Refer to the adodb/docs directory for full documentation and examples.
+There is also a tutorial tute.htm that contrasts ADODB code with
+mysql code.
>>> Files
diff --git a/lib/adodb/rsfilter.inc.php b/lib/adodb/rsfilter.inc.php
index 8f377cf1c9..c4b5ad04ad 100644
--- a/lib/adodb/rsfilter.inc.php
+++ b/lib/adodb/rsfilter.inc.php
@@ -1,54 +1,54 @@
- $v) {
- $arr[$k] = ucwords($v);
- }
- }
- $rs = RSFilter($rs,'do_ucwords');
- */
-function &RSFilter($rs,$fn)
-{
- if ($rs->databaseType != 'array') {
- if (!$rs->connection) return false;
-
- $rs = &$rs->connection->_rs2rs($rs);
- }
- $rows = $rs->RecordCount();
- for ($i=0; $i < $rows; $i++) {
- $fn($rs->_array[$i],$rs);
- }
- if (!$rs->EOF) {
- $rs->_currentRow = 0;
- $rs->fields = $rs->_array[0];
- }
-
- return $rs;
-}
+ $v) {
+ $arr[$k] = ucwords($v);
+ }
+ }
+ $rs = RSFilter($rs,'do_ucwords');
+ */
+function &RSFilter($rs,$fn)
+{
+ if ($rs->databaseType != 'array') {
+ if (!$rs->connection) return false;
+
+ $rs = &$rs->connection->_rs2rs($rs);
+ }
+ $rows = $rs->RecordCount();
+ for ($i=0; $i < $rows; $i++) {
+ $fn($rs->_array[$i],$rs);
+ }
+ if (!$rs->EOF) {
+ $rs->_currentRow = 0;
+ $rs->fields = $rs->_array[0];
+ }
+
+ return $rs;
+}
?>
\ No newline at end of file
diff --git a/lib/adodb/server.php b/lib/adodb/server.php
index 57ee71cbf1..0a8f8e1ba7 100644
--- a/lib/adodb/server.php
+++ b/lib/adodb/server.php
@@ -1,98 +1,98 @@
-Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg());
-$sql = undomq($HTTP_GET_VARS['sql']);
-
-if (isset($HTTP_GET_VARS['fetch']))
- $ADODB_FETCH_MODE = $HTTP_GET_VARS['fetch'];
-
-if (isset($HTTP_GET_VARS['nrows'])) {
- $nrows = $HTTP_GET_VARS['nrows'];
- $offset = isset($HTTP_GET_VARS['offset']) ? $HTTP_GET_VARS['offset'] : -1;
- $rs = $conn->SelectLimit($sql,$nrows,$offset);
-} else
- $rs = $conn->Execute($sql);
-if ($rs){
- //$rs->timeToLive = 1;
- echo _rs2serialize($rs,$conn,$sql);
- $rs->Close();
-} else
- err($conn->ErrorNo(). $sep .$conn->ErrorMsg());
-
+Connect($host,$uid,$pwd,$database)) err($conn->ErrorNo(). $sep . $conn->ErrorMsg());
+$sql = undomq($HTTP_GET_VARS['sql']);
+
+if (isset($HTTP_GET_VARS['fetch']))
+ $ADODB_FETCH_MODE = $HTTP_GET_VARS['fetch'];
+
+if (isset($HTTP_GET_VARS['nrows'])) {
+ $nrows = $HTTP_GET_VARS['nrows'];
+ $offset = isset($HTTP_GET_VARS['offset']) ? $HTTP_GET_VARS['offset'] : -1;
+ $rs = $conn->SelectLimit($sql,$nrows,$offset);
+} else
+ $rs = $conn->Execute($sql);
+if ($rs){
+ //$rs->timeToLive = 1;
+ echo _rs2serialize($rs,$conn,$sql);
+ $rs->Close();
+} else
+ err($conn->ErrorNo(). $sep .$conn->ErrorMsg());
+
?>
\ No newline at end of file
diff --git a/lib/adodb/session/adodb-encrypt-md5.php b/lib/adodb/session/adodb-encrypt-md5.php
index 8a7e939539..a0d19eb071 100644
--- a/lib/adodb/session/adodb-encrypt-md5.php
+++ b/lib/adodb/session/adodb-encrypt-md5.php
@@ -12,6 +12,9 @@ V4.01 23 Oct 2003 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights rese
*/
+// security - hide paths
+if (!defined('ADODB_SESSION')) die();
+
include_once ADODB_SESSION . '/crypt.inc.php';
/**
diff --git a/lib/adodb/session/adodb-session.php b/lib/adodb/session/adodb-session.php
index 7cba4f854e..d570c68c84 100644
--- a/lib/adodb/session/adodb-session.php
+++ b/lib/adodb/session/adodb-session.php
@@ -581,6 +581,7 @@ class ADODB_Session {
}
if (!$clob) { // no lobs, simply use replace()
+ $arr[$data] = $conn->qstr($val);
$rs = $conn->Replace($table, $arr, 'sesskey', $autoQuote = true);
ADODB_Session::_dumprs($rs);
} else {
@@ -680,8 +681,8 @@ class ADODB_Session {
if (!$rs->EOF) {
$ref = $rs->fields[0];
$key = $rs->fields[1];
- assert('$ref');
- assert('$key');
+ //assert('$ref');
+ //assert('$key');
$fn($ref, $key);
}
$rs->Close();
diff --git a/lib/adodb/tests/benchmark.php b/lib/adodb/tests/benchmark.php
index 53636cbf45..f4a208bc54 100644
--- a/lib/adodb/tests/benchmark.php
+++ b/lib/adodb/tests/benchmark.php
@@ -1,84 +1,84 @@
-
-
-
-
-
";print_r($s);print "
";
- }
-
-
-$serverURL = 'http://localhost/php/phplens/adodb/server.php';
-$testhttp = false;
-
-$sql1 = "insertz into products (productname) values ('testprod 1')";
-$sql2 = "insert into products (productname) values ('testprod 1')";
-$sql3 = "insert into products (productname) values ('testprod 2')";
-$sql4 = "delete from products where productid>80";
-$sql5 = 'select * from products';
-
-if ($testhttp) {
- print "Client Driver TestsTest Error
";
- $rs = send2server($serverURL,$sql1);
- print_pre($rs);
- print "
";
-
- print "Test Insert
";
-
- $rs = send2server($serverURL,$sql2);
- print_pre($rs);
- print "
";
-
- print "Test Insert2
";
-
- $rs = send2server($serverURL,$sql3);
- print_pre($rs);
- print "
";
-
- print "Test Delete
";
-
- $rs = send2server($serverURL,$sql4);
- print_pre($rs);
- print "
";
-
-
- print "Test Select
";
- $rs = send2server($serverURL,$sql5);
- if ($rs) rs2html($rs);
-
- print "
";
-}
-
-
-print "CLIENT Driver Tests
";
-$conn = ADONewConnection('csv');
-$conn->Connect($serverURL);
-$conn->debug = true;
-
-print "Bad SQL
";
-
-$rs = $conn->Execute($sql1);
-
-print "Insert SQL 1
";
-$rs = $conn->Execute($sql2);
-
-print "Insert SQL 2
";
-$rs = $conn->Execute($sql3);
-
-print "Select SQL
";
-$rs = $conn->Execute($sql5);
-if ($rs) rs2html($rs);
-
-print "Delete SQL
";
-$rs = $conn->Execute($sql4);
-
-print "Select SQL
";
-$rs = $conn->Execute($sql5);
-if ($rs) rs2html($rs);
-
-
-/* EXPECTED RESULTS FOR HTTP TEST:
-
-Test Insert
-http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29
-
-adorecordset Object
-(
- [dataProvider] => native
- [fields] =>
- [blobSize] => 64
- [canSeek] =>
- [EOF] => 1
- [emptyTimeStamp] =>
- [emptyDate] =>
- [debug] =>
- [timeToLive] => 0
- [bind] =>
- [_numOfRows] => -1
- [_numOfFields] => 0
- [_queryID] => 1
- [_currentRow] => -1
- [_closed] =>
- [_inited] =>
- [sql] => insert into products (productname) values ('testprod')
- [affectedrows] => 1
- [insertid] => 81
-)
-
-
---------------------------------------------------------------------------------
-
-Test Insert2
-http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29
-
-adorecordset Object
-(
- [dataProvider] => native
- [fields] =>
- [blobSize] => 64
- [canSeek] =>
- [EOF] => 1
- [emptyTimeStamp] =>
- [emptyDate] =>
- [debug] =>
- [timeToLive] => 0
- [bind] =>
- [_numOfRows] => -1
- [_numOfFields] => 0
- [_queryID] => 1
- [_currentRow] => -1
- [_closed] =>
- [_inited] =>
- [sql] => insert into products (productname) values ('testprod')
- [affectedrows] => 1
- [insertid] => 82
-)
-
-
---------------------------------------------------------------------------------
-
-Test Delete
-http://localhost/php/adodb/server.php?sql=delete+from+products+where+productid%3E80
-
-adorecordset Object
-(
- [dataProvider] => native
- [fields] =>
- [blobSize] => 64
- [canSeek] =>
- [EOF] => 1
- [emptyTimeStamp] =>
- [emptyDate] =>
- [debug] =>
- [timeToLive] => 0
- [bind] =>
- [_numOfRows] => -1
- [_numOfFields] => 0
- [_queryID] => 1
- [_currentRow] => -1
- [_closed] =>
- [_inited] =>
- [sql] => delete from products where productid>80
- [affectedrows] => 2
- [insertid] => 0
-)
-
-[more stuff deleted]
- .
- .
- .
-*/
-?>
+
+
+$url";print_r($s);print "
";
+ }
+
+
+$serverURL = 'http://localhost/php/phplens/adodb/server.php';
+$testhttp = false;
+
+$sql1 = "insertz into products (productname) values ('testprod 1')";
+$sql2 = "insert into products (productname) values ('testprod 1')";
+$sql3 = "insert into products (productname) values ('testprod 2')";
+$sql4 = "delete from products where productid>80";
+$sql5 = 'select * from products';
+
+if ($testhttp) {
+ print "Client Driver TestsTest Error
";
+ $rs = send2server($serverURL,$sql1);
+ print_pre($rs);
+ print "
";
+
+ print "Test Insert
";
+
+ $rs = send2server($serverURL,$sql2);
+ print_pre($rs);
+ print "
";
+
+ print "Test Insert2
";
+
+ $rs = send2server($serverURL,$sql3);
+ print_pre($rs);
+ print "
";
+
+ print "Test Delete
";
+
+ $rs = send2server($serverURL,$sql4);
+ print_pre($rs);
+ print "
";
+
+
+ print "Test Select
";
+ $rs = send2server($serverURL,$sql5);
+ if ($rs) rs2html($rs);
+
+ print "
";
+}
+
+
+print "CLIENT Driver Tests
";
+$conn = ADONewConnection('csv');
+$conn->Connect($serverURL);
+$conn->debug = true;
+
+print "Bad SQL
";
+
+$rs = $conn->Execute($sql1);
+
+print "Insert SQL 1
";
+$rs = $conn->Execute($sql2);
+
+print "Insert SQL 2
";
+$rs = $conn->Execute($sql3);
+
+print "Select SQL
";
+$rs = $conn->Execute($sql5);
+if ($rs) rs2html($rs);
+
+print "Delete SQL
";
+$rs = $conn->Execute($sql4);
+
+print "Select SQL
";
+$rs = $conn->Execute($sql5);
+if ($rs) rs2html($rs);
+
+
+/* EXPECTED RESULTS FOR HTTP TEST:
+
+Test Insert
+http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29
+
+adorecordset Object
+(
+ [dataProvider] => native
+ [fields] =>
+ [blobSize] => 64
+ [canSeek] =>
+ [EOF] => 1
+ [emptyTimeStamp] =>
+ [emptyDate] =>
+ [debug] =>
+ [timeToLive] => 0
+ [bind] =>
+ [_numOfRows] => -1
+ [_numOfFields] => 0
+ [_queryID] => 1
+ [_currentRow] => -1
+ [_closed] =>
+ [_inited] =>
+ [sql] => insert into products (productname) values ('testprod')
+ [affectedrows] => 1
+ [insertid] => 81
+)
+
+
+--------------------------------------------------------------------------------
+
+Test Insert2
+http://localhost/php/adodb/server.php?sql=insert+into+products+%28productname%29+values+%28%27testprod%27%29
+
+adorecordset Object
+(
+ [dataProvider] => native
+ [fields] =>
+ [blobSize] => 64
+ [canSeek] =>
+ [EOF] => 1
+ [emptyTimeStamp] =>
+ [emptyDate] =>
+ [debug] =>
+ [timeToLive] => 0
+ [bind] =>
+ [_numOfRows] => -1
+ [_numOfFields] => 0
+ [_queryID] => 1
+ [_currentRow] => -1
+ [_closed] =>
+ [_inited] =>
+ [sql] => insert into products (productname) values ('testprod')
+ [affectedrows] => 1
+ [insertid] => 82
+)
+
+
+--------------------------------------------------------------------------------
+
+Test Delete
+http://localhost/php/adodb/server.php?sql=delete+from+products+where+productid%3E80
+
+adorecordset Object
+(
+ [dataProvider] => native
+ [fields] =>
+ [blobSize] => 64
+ [canSeek] =>
+ [EOF] => 1
+ [emptyTimeStamp] =>
+ [emptyDate] =>
+ [debug] =>
+ [timeToLive] => 0
+ [bind] =>
+ [_numOfRows] => -1
+ [_numOfFields] => 0
+ [_queryID] => 1
+ [_currentRow] => -1
+ [_closed] =>
+ [_inited] =>
+ [sql] => delete from products where productid>80
+ [affectedrows] => 2
+ [insertid] => 0
+)
+
+[more stuff deleted]
+ .
+ .
+ .
+*/
+?>
diff --git a/lib/adodb/tests/test-datadict.php b/lib/adodb/tests/test-datadict.php
index 8a6563de1c..977aced280 100644
--- a/lib/adodb/tests/test-datadict.php
+++ b/lib/adodb/tests/test-datadict.php
@@ -1,233 +1,233 @@
-$dbType";
- //print_r($dict->MetaTables());
- foreach($sqla as $s) {
- $s = htmlspecialchars($s);
- print "$s;\n";
- if ($dbType == 'oci8') print "/\n";
- }
- print "
";
-}
-
-/***
-
-Generated SQL:
-
-mysql
-
-CREATE DATABASE KUTU;
-DROP TABLE KUTU.testtable;
-CREATE TABLE KUTU.testtable (
-id INTEGER NOT NULL AUTO_INCREMENT,
-firstname VARCHAR(30) DEFAULT 'Joan',
-lastname VARCHAR(28) NOT NULL DEFAULT 'Chen',
-averylonglongfieldname LONGTEXT NOT NULL,
-price NUMERIC(7,2) NOT NULL DEFAULT 0.00,
-MYDATE DATE DEFAULT CURDATE(),
- PRIMARY KEY (id, lastname)
-)TYPE=ISAM;
-CREATE FULLTEXT INDEX idx ON KUTU.testtable (firstname,lastname);
-CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
-ALTER TABLE KUTU.testtable ADD height DOUBLE;
-ALTER TABLE KUTU.testtable ADD weight DOUBLE;
-ALTER TABLE KUTU.testtable MODIFY COLUMN height DOUBLE NOT NULL;
-ALTER TABLE KUTU.testtable MODIFY COLUMN weight DOUBLE NOT NULL;
-
-
---------------------------------------------------------------------------------
-
-oci8
-
-CREATE USER KUTU IDENTIFIED BY tiger;
-/
-GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO KUTU;
-/
-DROP TABLE KUTU.testtable CASCADE CONSTRAINTS;
-/
-CREATE TABLE KUTU.testtable (
-id NUMBER(16) NOT NULL,
-firstname VARCHAR(30) DEFAULT 'Joan',
-lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL,
-averylonglongfieldname CLOB NOT NULL,
-price NUMBER(7,2) DEFAULT 0.00 NOT NULL,
-MYDATE DATE DEFAULT TRUNC(SYSDATE),
- PRIMARY KEY (id, lastname)
-)TABLESPACE USERS;
-/
-DROP SEQUENCE KUTU.SEQ_testtable;
-/
-CREATE SEQUENCE KUTU.SEQ_testtable;
-/
-CREATE OR REPLACE TRIGGER KUTU.TRIG_SEQ_testtable BEFORE insert ON KUTU.testtable
- FOR EACH ROW
- BEGIN
- select KUTU.SEQ_testtable.nextval into :new.id from dual;
- END;
-/
-CREATE BITMAP INDEX idx ON KUTU.testtable (firstname,lastname);
-/
-CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
-/
-ALTER TABLE testtable ADD (
- height NUMBER,
- weight NUMBER);
-/
-ALTER TABLE testtable MODIFY(
- height NUMBER NOT NULL,
- weight NUMBER NOT NULL);
-/
-
-
---------------------------------------------------------------------------------
-
-postgres
-AlterColumnSQL not supported for PostgreSQL
-
-
-CREATE DATABASE KUTU LOCATION='/u01/postdata';
-DROP TABLE KUTU.testtable;
-CREATE TABLE KUTU.testtable (
-id SERIAL,
-firstname VARCHAR(30) DEFAULT 'Joan',
-lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL,
-averylonglongfieldname TEXT NOT NULL,
-price NUMERIC(7,2) DEFAULT 0.00 NOT NULL,
-MYDATE DATE DEFAULT CURRENT_DATE,
- PRIMARY KEY (id, lastname)
-);
-CREATE INDEX idx ON KUTU.testtable USING HASH (firstname,lastname);
-CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
-ALTER TABLE KUTU.testtable ADD height FLOAT8;
-ALTER TABLE KUTU.testtable ADD weight FLOAT8;
-
-
---------------------------------------------------------------------------------
-
-odbc_mssql
-
-CREATE DATABASE KUTU;
-DROP TABLE KUTU.testtable;
-CREATE TABLE KUTU.testtable (
-id INT IDENTITY(1,1) NOT NULL,
-firstname VARCHAR(30) DEFAULT 'Joan',
-lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL,
-averylonglongfieldname TEXT NOT NULL,
-price NUMERIC(7,2) DEFAULT 0.00 NOT NULL,
-MYDATE DATETIME DEFAULT GetDate(),
- PRIMARY KEY (id, lastname)
-);
-CREATE CLUSTERED INDEX idx ON KUTU.testtable (firstname,lastname);
-CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
-ALTER TABLE KUTU.testtable ADD
- height REAL,
- weight REAL;
-ALTER TABLE KUTU.testtable ALTER COLUMN height REAL NOT NULL;
-ALTER TABLE KUTU.testtable ALTER COLUMN weight REAL NOT NULL;
-
-
---------------------------------------------------------------------------------
-*/
-
-echo "Test XML Schema
";
-$ff = file('xmlschema.xml');
-echo "";
-foreach($ff as $xml) echo htmlspecialchars($xml);
-echo "
";
-include_once('test-xmlschema.php');
+$dbType";
+ //print_r($dict->MetaTables());
+ foreach($sqla as $s) {
+ $s = htmlspecialchars($s);
+ print "$s;\n";
+ if ($dbType == 'oci8') print "/\n";
+ }
+ print "
";
+}
+
+/***
+
+Generated SQL:
+
+mysql
+
+CREATE DATABASE KUTU;
+DROP TABLE KUTU.testtable;
+CREATE TABLE KUTU.testtable (
+id INTEGER NOT NULL AUTO_INCREMENT,
+firstname VARCHAR(30) DEFAULT 'Joan',
+lastname VARCHAR(28) NOT NULL DEFAULT 'Chen',
+averylonglongfieldname LONGTEXT NOT NULL,
+price NUMERIC(7,2) NOT NULL DEFAULT 0.00,
+MYDATE DATE DEFAULT CURDATE(),
+ PRIMARY KEY (id, lastname)
+)TYPE=ISAM;
+CREATE FULLTEXT INDEX idx ON KUTU.testtable (firstname,lastname);
+CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
+ALTER TABLE KUTU.testtable ADD height DOUBLE;
+ALTER TABLE KUTU.testtable ADD weight DOUBLE;
+ALTER TABLE KUTU.testtable MODIFY COLUMN height DOUBLE NOT NULL;
+ALTER TABLE KUTU.testtable MODIFY COLUMN weight DOUBLE NOT NULL;
+
+
+--------------------------------------------------------------------------------
+
+oci8
+
+CREATE USER KUTU IDENTIFIED BY tiger;
+/
+GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO KUTU;
+/
+DROP TABLE KUTU.testtable CASCADE CONSTRAINTS;
+/
+CREATE TABLE KUTU.testtable (
+id NUMBER(16) NOT NULL,
+firstname VARCHAR(30) DEFAULT 'Joan',
+lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL,
+averylonglongfieldname CLOB NOT NULL,
+price NUMBER(7,2) DEFAULT 0.00 NOT NULL,
+MYDATE DATE DEFAULT TRUNC(SYSDATE),
+ PRIMARY KEY (id, lastname)
+)TABLESPACE USERS;
+/
+DROP SEQUENCE KUTU.SEQ_testtable;
+/
+CREATE SEQUENCE KUTU.SEQ_testtable;
+/
+CREATE OR REPLACE TRIGGER KUTU.TRIG_SEQ_testtable BEFORE insert ON KUTU.testtable
+ FOR EACH ROW
+ BEGIN
+ select KUTU.SEQ_testtable.nextval into :new.id from dual;
+ END;
+/
+CREATE BITMAP INDEX idx ON KUTU.testtable (firstname,lastname);
+/
+CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
+/
+ALTER TABLE testtable ADD (
+ height NUMBER,
+ weight NUMBER);
+/
+ALTER TABLE testtable MODIFY(
+ height NUMBER NOT NULL,
+ weight NUMBER NOT NULL);
+/
+
+
+--------------------------------------------------------------------------------
+
+postgres
+AlterColumnSQL not supported for PostgreSQL
+
+
+CREATE DATABASE KUTU LOCATION='/u01/postdata';
+DROP TABLE KUTU.testtable;
+CREATE TABLE KUTU.testtable (
+id SERIAL,
+firstname VARCHAR(30) DEFAULT 'Joan',
+lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL,
+averylonglongfieldname TEXT NOT NULL,
+price NUMERIC(7,2) DEFAULT 0.00 NOT NULL,
+MYDATE DATE DEFAULT CURRENT_DATE,
+ PRIMARY KEY (id, lastname)
+);
+CREATE INDEX idx ON KUTU.testtable USING HASH (firstname,lastname);
+CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
+ALTER TABLE KUTU.testtable ADD height FLOAT8;
+ALTER TABLE KUTU.testtable ADD weight FLOAT8;
+
+
+--------------------------------------------------------------------------------
+
+odbc_mssql
+
+CREATE DATABASE KUTU;
+DROP TABLE KUTU.testtable;
+CREATE TABLE KUTU.testtable (
+id INT IDENTITY(1,1) NOT NULL,
+firstname VARCHAR(30) DEFAULT 'Joan',
+lastname VARCHAR(28) DEFAULT 'Chen' NOT NULL,
+averylonglongfieldname TEXT NOT NULL,
+price NUMERIC(7,2) DEFAULT 0.00 NOT NULL,
+MYDATE DATETIME DEFAULT GetDate(),
+ PRIMARY KEY (id, lastname)
+);
+CREATE CLUSTERED INDEX idx ON KUTU.testtable (firstname,lastname);
+CREATE INDEX idx2 ON KUTU.testtable (price,lastname);
+ALTER TABLE KUTU.testtable ADD
+ height REAL,
+ weight REAL;
+ALTER TABLE KUTU.testtable ALTER COLUMN height REAL NOT NULL;
+ALTER TABLE KUTU.testtable ALTER COLUMN weight REAL NOT NULL;
+
+
+--------------------------------------------------------------------------------
+*/
+
+echo "Test XML Schema
";
+$ff = file('xmlschema.xml');
+echo "";
+foreach($ff as $xml) echo htmlspecialchars($xml);
+echo "
";
+include_once('test-xmlschema.php');
?>
\ No newline at end of file
diff --git a/lib/adodb/tests/test-php5.php b/lib/adodb/tests/test-php5.php
index c735aa7386..1db718e11c 100644
--- a/lib/adodb/tests/test-php5.php
+++ b/lib/adodb/tests/test-php5.php
@@ -1,58 +1,63 @@
-PHP ".PHP_VERSION."\n";
-try {
-
-$dbt = 'oci8';
-
-switch($dbt) {
-case 'oci8':
- $db = NewADOConnection("oci8");
- $db->Connect('','scott','natsoft');
- break;
-default:
-case 'mysql':
- $db = NewADOConnection("mysql");
- $db->Connect('localhost','root','','test');
- break;
-}
-
-$db->debug=1;
-
-$cnt = $db->GetOne("select count(*) from adoxyz");
-$rs = $db->Execute("select * from adoxyz order by id");
-
-$i = 0;
-foreach($rs as $v) {
- $i += 1;
- echo "$i: "; adodb_pr($v); adodb_pr($rs->fields);
- flush();
-}
-
-if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n");
-
-
-$rs = $db->Execute("select bad from badder");
-
-} catch (exception $e) {
- adodb_pr($e);
- echo "adodb_backtrace:
\n";
- $e = adodb_backtrace($e->gettrace());
-}
-
+PHP ".PHP_VERSION."\n";
+try {
+
+$dbt = 'mysqli';
+
+switch($dbt) {
+case 'oci8':
+ $db = NewADOConnection("oci8");
+ $db->Connect('','scott','natsoft');
+ break;
+default:
+case 'mysql':
+ $db = NewADOConnection("mysql");
+ $db->Connect('localhost','root','','test');
+ break;
+
+case 'mysqli':
+ $db = NewADOConnection("mysqli");
+ $db->Connect('localhost','root','','test');
+ break;
+}
+
+$db->debug=1;
+
+$cnt = $db->GetOne("select count(*) from adoxyz");
+$rs = $db->Execute("select * from adoxyz order by id");
+
+$i = 0;
+foreach($rs as $v) {
+ $i += 1;
+ echo "$i: "; adodb_pr($v); adodb_pr($rs->fields);
+ flush();
+}
+
+if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n");
+
+
+$rs = $db->Execute("select bad from badder");
+
+} catch (exception $e) {
+ adodb_pr($e);
+ echo "adodb_backtrace:
\n";
+ $e = adodb_backtrace($e->gettrace());
+}
+
?>
\ No newline at end of file
diff --git a/lib/adodb/tests/test-xmlschema.php b/lib/adodb/tests/test-xmlschema.php
index cb3f1fb65f..aedfb94d33 100644
--- a/lib/adodb/tests/test-xmlschema.php
+++ b/lib/adodb/tests/test-xmlschema.php
@@ -1,34 +1,51 @@
-Connect( 'localhost', 'root', '', 'schematest' );
-
-// To create a schema object and build the query array.
-$schema = new adoSchema( $db );
-
-// To upgrade an existing schema object, use the following
-// To upgrade an existing database to the provided schema,
-// uncomment the following line:
-#$schema->upgradeSchema();
-
-// Build the SQL array
-$sql = $schema->ParseSchema( "xmlschema.xml" );
-
-print "Here's the SQL to do the build:\n";
-print_r( $sql );
-print "
\n";
-
-// Execute the SQL on the database
-//$result = $schema->ExecuteSchema( $sql );
-
-// Finally, clean up after the XML parser
-// (PHP won't do this for you!)
-//$schema->Destroy();
+Connect( 'localhost', 'root', '', 'schematest' );
+
+// To create a schema object and build the query array.
+$schema = new adoSchema( $db );
+
+// To upgrade an existing schema object, use the following
+// To upgrade an existing database to the provided schema,
+// uncomment the following line:
+#$schema->upgradeSchema();
+
+// Build the SQL array
+$sql = $schema->ParseSchema( "xmlschema.xml" );
+
+print "Here's the SQL to do the build:\n";
+print_r( $sql );
+print "
\n";
+
+// Execute the SQL on the database
+//$result = $schema->ExecuteSchema( $sql );
+
+// Finally, clean up after the XML parser
+// (PHP won't do this for you!)
+//$schema->Destroy();
+
+
+$db2 = ADONewConnection('mssql');
+$db2->Connect('localhost','sa','natsoft','northwind') || die("Fail 2");
+
+$db2->Execute("drop table simple_table");
+
+$schema = new adoSchema( $db2 );
+$sql = $schema->ParseSchema( "xmlschema-mssql.xml" );
+
+print "Here's the SQL to do the build:\n";
+print_r( $sql );
+print "
\n";
+
+$db2->debug=1;
+
+$db2->Execute($sql[0]);
?>
\ No newline at end of file
diff --git a/lib/adodb/tests/test.php b/lib/adodb/tests/test.php
index fdcc8ad5da..c395b36095 100644
--- a/lib/adodb/tests/test.php
+++ b/lib/adodb/tests/test.php
@@ -1,1463 +1,1497 @@
-$msg
";
- flush();
-}
-
-function CheckWS($conn)
-{
-global $ADODB_EXTENSION;
-
- include_once('../session/adodb-session.php');
-
- $saved = $ADODB_EXTENSION;
- $db = ADONewConnection($conn);
- $ADODB_EXTENSION = $saved;
- if (headers_sent()) {
- print "
-
";print_r($arr); - die();*/ - - GLOBAL $EXECS, $CACHED; - - $EXECS = 0; - $CACHED = 0; - if ((rand()%3) == 0) @$db->Execute("delete from adodb_logsql"); - $db->debug=1; - - $db->fnExecute = 'CountExecs'; - $db->fnCacheExecute = 'CountCachedExecs'; - - if (empty($_GET['nolog'])) { - echo "SQL Logging enabled
"; - $db->LogSQL();/* - $sql = -"SELECT t1.sid, t1.sid, t1.title, t1.hometext, t1.notes, t1.aid, t1.informant, -t2.url, t2.email, t1.catid, t3.title, t1.topic, t4.topicname, t4.topicimage, -t4.topictext, t1.score, t1.ratings, t1.counter, t1.comments, t1.acomm -FROM `nuke_stories` `t1`, `nuke_authors` `t2`, `nuke_stories_cat` `t3`, `nuke_topics` `t4` - WHERE ((t2.aid=t1.aid) AND (t3.catid=t1.catid) AND (t4.topicid=t1.topic) - AND ((t1.alanguage='german') OR (t1.alanguage='')) AND (t1.ihome='0')) - ORDER BY t1.time DESC"; - $db->SelectLimit($sql); - echo $db->ErrorMsg();*/ - } - $ADODB_CACHE_DIR = dirname(TempNam('/tmp','testadodb')); - $db->debug = false; - - //print $db->UnixTimeStamp('2003-7-22 23:00:00'); - - $phpv = phpversion(); - if (defined('ADODB_EXTENSION')) $ext = ' Extension '.ADODB_EXTENSION.' installed'; - else $ext = ''; - print "ADODB Version: $ADODB_vers Host: $db->host Database: $db->database PHP: $phpv $ext
"; - flush(); - $arr = $db->ServerInfo(); - print_r($arr); - echo "
"; - $e = error_reporting(E_ALL-E_WARNING); - flush(); - print "date1 (1969-02-20) = ".$db->DBDate('1969-2-20'); - print "
date1 (1999-02-20) = ".$db->DBDate('1999-2-20'); - print "
date1.1 1999 = ".$db->DBDate("'1999'"); - print "
date2 (1970-1-2) = ".$db->DBDate(24*3600).""; - print "ts1 (1999-02-20 13:40:50) = ".$db->DBTimeStamp('1999-2-20 1:40:50 pm'); - print "
ts1.1 (1999-02-20 13:40:00) = ".$db->DBTimeStamp('1999-2-20 13:40'); - print "
ts2 (1999-02-20) = ".$db->DBTimeStamp('1999-2-20'); - print "
ts3 (1970-1-2 +/- timezone) = ".$db->DBTimeStamp(24*3600); - print "
Fractional TS (1999-2-20 13:40:50.91): ".$db->DBTimeStamp($db->UnixTimeStamp('1999-2-20 13:40:50.91+1')); - $dd = $db->UnixDate('1999-02-20'); - print "
unixdate 1999-02-20 = ".date('Y-m-d',$dd).""; - print "
ts4 =".($db->UnixTimeStamp("19700101000101")+8*3600); - print "
ts5 =".$db->DBTimeStamp($db->UnixTimeStamp("20040110092123")); - print "
ts6 =".$db->UserTimeStamp("20040110092123"); - print "
ts6 =".$db->DBTimeStamp("20040110092123"); - flush(); - // mssql too slow in failing bad connection - if (false && $db->databaseType != 'mssql') { - print "Testing bad connection. Ignore following error msgs:
"; - if ($rez) print "Cannot check if connection failed. The Connect() function returned true."; - } - error_reporting($e); - flush(); - - //$ADODB_COUNTRECS=false; - $rs=$db->Execute('select * from adoxyz order by id'); - - //print_r($rs); - //OCIFetchStatement($rs->_queryID,$rez,0,-1);//,OCI_ASSOC | OCI_FETCHSTATEMENT_BY_ROW); - //print_r($rez); - //die(); - if($rs === false) $create = true; - else $rs->Close(); - - //if ($db->databaseType !='vfp') $db->Execute("drop table ADOXYZ"); - - if ($create) { - if (false && $db->databaseType == 'ibase') { - print "Please create the following table for testing:$createtab"; - return; - } else { - $db->debug = 1; - $e = error_reporting(E_ALL-E_WARNING); - $db->Execute($createtab); - error_reporting($e); - } - } - $rs = &$db->Execute("delete from ADOXYZ"); // some ODBC drivers will fail the drop so we delete - if ($rs) { - if(! $rs->EOF) print "Error: RecordSet returned by Execute('delete...') should show EOF"; - $rs->Close(); - } else print "err=".$db->ErrorMsg(); - - print "
"; - $db2 = ADONewConnection(); - $rez = $db2->Connect("bad connection"); - $err = $db2->ErrorMsg(); - print "Error='$err'Test select on empty table, FetchField when EOF, and GetInsertSQL
"; - $rs = &$db->Execute("select id,firstname from ADOXYZ where id=9999"); - if ($rs && !$rs->EOF) print "Error: RecordSet returned by Execute(select...') on empty table should show EOF"; - if ($rs->EOF && ($o = $rs->FetchField(0))) { - $record['id'] = 99; - $record['firstname'] = 'John'; - $sql = $db->GetInsertSQL($rs, $record); - if ($sql != "INSERT INTO ADOXYZ ( id, firstname ) VALUES ( 99, 'John' )") Err("GetInsertSQL does not work on empty table"); - } else { - Err("FetchField does not work on empty recordset, meaning GetInsertSQL will fail..."); - } - if ($rs) $rs->Close(); - flush(); - //$db->debug=true; - print "Testing Commit: "; - $time = $db->DBDate(time()); - if (!$db->BeginTrans()) { - print 'Transactions not supported
'; - if ($db->hasTransactions) Err("hasTransactions should be false"); - } else { /* COMMIT */ - if (!$db->hasTransactions) Err("hasTransactions should be true"); - if ($db->transCnt != 1) Err("Invalid transCnt = $db->transCnt (should be 1)"); - $rs = $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (99,'Should Not','Exist (Commit)',$time)"); - if ($rs && $db->CommitTrans()) { - $rs->Close(); - $rs = &$db->Execute("select * from ADOXYZ where id=99"); - if ($rs === false || $rs->EOF) { - print 'Data not saved'; - $rs = &$db->Execute("select * from ADOXYZ where id=99"); - print_r($rs); - die(); - } else print 'OK'; - if ($rs) $rs->Close(); - } else { - if (!$rs) { - print "Insert failed"; - $db->RollbackTrans(); - } else print "Commit failed"; - } - if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)"); - - /* ROLLBACK */ - if (!$db->BeginTrans()) print "Error in BeginTrans()
"; - print "Testing Rollback: "; - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values (100,'Should Not','Exist (Rollback)',$time)"); - if ($db->RollbackTrans()) { - $rs = $db->Execute("select * from ADOXYZ where id=100"); - if ($rs && !$rs->EOF) print 'Fail: Data should rollback
'; - else print 'OK'; - if ($rs) $rs->Close(); - } else - print "Commit failed"; - - $rs = &$db->Execute('delete from ADOXYZ where id>50'); - if ($rs) $rs->Close(); - - if ($db->transCnt != 0) Err("Invalid transCnt = $db->transCnt (should be 0)"); - } - - if (1) { - print "Testing MetaDatabases()
"; - print_r( $db->MetaDatabases()); - - print "Testing MetaTables() and MetaColumns()
"; - $a = $db->MetaTables(); - if ($a===false) print "MetaTables not supported"; - else { - print "Array of tables and views: "; - foreach($a as $v) print " ($v) "; - print ''; - } - - $a = $db->MetaTables('VIEW'); - if ($a===false) print "MetaTables not supported"; - else { - print "Array of views: "; - foreach($a as $v) print " ($v) "; - print ''; - } - - $a = $db->MetaTables(false,false,'aDo%'); - if ($a===false) print "MetaTables not supported"; - else { - print "Array of ado%: "; - foreach($a as $v) print " ($v) "; - print ''; - } - - $a = $db->MetaTables('TABLE'); - if ($a===false) print "MetaTables not supported"; - else { - print "Array of tables: "; - foreach($a as $v) print " ($v) "; - print ''; - } - - $db->debug=1; - $a = $db->MetaColumns('ADOXYZ'); - if ($a===false) print "MetaColumns not supported"; - else { - print "Columns of ADOXYZ:
"; - foreach($a as $v) {print_r($v); echo "
";} - echo ""; - } - - print "Testing MetaIndexes
"; - $a = $db->MetaIndexes('ADOXYZ',true); - if ($a===false) print "MetaIndexes not supported"; - else { - print "Indexes of ADOXYZ:
"; - foreach($a as $v) {print_r($v); echo "
";} - echo ""; - } - print "Testing MetaPrimaryKeys
"; - $a = $db->MetaPrimaryKeys('ADOXYZ'); - var_dump($a); - } - $rs = &$db->Execute('delete from ADOXYZ'); - if ($rs) $rs->Close(); - - $db->debug = false; - - - switch ($db->databaseType) { - case 'postgres7': - case 'postgres64': - case 'postgres': - case 'ibase': - print "Encode=".$db->BlobEncode("abc\0d\"' -ef")."
";//' - - print "Testing Foreign Keys
"; - $arr = $db->MetaForeignKeys('adoxyz',false,true); - print_r($arr); - if (!$arr) Err("Bad MetaForeignKeys"); - break; - - case 'odbc_mssql': - case 'mssqlpo': - print "Testing Foreign Keys
"; - $arr = $db->MetaForeignKeys('Orders',false,true); - print_r($arr); - if (!$arr) Err("Bad MetaForeignKeys"); - if ($db->databaseType == 'odbc_mssql') break; - - case 'mssql': - - -/* -ASSUME Northwind available... - -CREATE PROCEDURE SalesByCategory - @CategoryName nvarchar(15), @OrdYear nvarchar(4) = '1998' -AS -IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998' -BEGIN - SELECT @OrdYear = '1998' -END - -SELECT ProductName, - TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0) -FROM [Order Details] OD, Orders O, Products P, Categories C -WHERE OD.OrderID = O.OrderID - AND OD.ProductID = P.ProductID - AND P.CategoryID = C.CategoryID - AND C.CategoryName = @CategoryName - AND SUBSTRING(CONVERT(nvarchar(22), O.OrderDate, 111), 1, 4) = @OrdYear -GROUP BY ProductName -ORDER BY ProductName -GO -*/ - print "Testing Stored Procedures for mssql
"; - $saved = $db->debug; - $db->debug=true; - - $cat = 'Dairy Products'; - $yr = '1998'; - - $stmt = $db->PrepareSP('SalesByCategory'); - $db->InParameter($stmt,$cat,'CategoryName'); - $db->InParameter($stmt,$yr,'OrdYear'); - $rs = $db->Execute($stmt); - rs2html($rs); - - $cat = 'Grains/Cereals'; - $yr = 1998; - - $stmt = $db->PrepareSP('SalesByCategory'); - $db->InParameter($stmt,$cat,'CategoryName'); - $db->InParameter($stmt,$yr,'OrdYear'); - $rs = $db->Execute($stmt); - rs2html($rs); - - /* - Test out params - works in 4.2.3 but not 4.3.0???: - - CREATE PROCEDURE at_date_interval - @days INTEGER, - @start VARCHAR(20) OUT, - @end VARCHAR(20) OUT - AS - BEGIN - set @start = CONVERT(VARCHAR(20), getdate(), 101) - set @end =CONVERT(VARCHAR(20), dateadd(day, @days, getdate()), 101 ) - END - GO - */ - $db->debug=1; - $stmt = $db->PrepareSP('at_date_interval'); - $days = 10; - $begin_date = ''; - $end_date = ''; - $db->InParameter($stmt,$days,'days', 4, SQLINT4); - $db->OutParameter($stmt,$begin_date,'start', 20, SQLVARCHAR ); - $db->OutParameter($stmt,$end_date,'end', 20, SQLVARCHAR ); - $db->Execute($stmt); - if (empty($begin_date) or empty($end_date)) { - Err("MSSQL SP Test for OUT Failed"); - print "begin=$begin_date end=$end_date"; - } else print "(Today +10days) = (begin=$begin_date end=$end_date)
"; - - $db->debug = $saved; - break; - case 'oci8': - case 'oci8po': - $saved = $db->debug; - $db->debug=true; - - print "
Testing Foreign Keys
"; - $arr = $db->MetaForeignKeys('emp'); - print_r($arr); - if (!$arr) Err("Bad MetaForeignKeys"); - print "Testing Cursor Variables
"; -/* --- TEST PACKAGE -CREATE OR REPLACE PACKAGE adodb AS -TYPE TabType IS REF CURSOR RETURN tab%ROWTYPE; -PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames in varchar); -PROCEDURE data_out(input IN varchar, output OUT varchar); -END adodb; -/ - -CREATE OR REPLACE PACKAGE BODY adodb AS -PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames in varchar) IS - BEGIN - OPEN tabcursor FOR SELECT * FROM tab where tname like tablenames; - END open_tab; - -PROCEDURE data_out(input IN varchar, output OUT varchar) IS - BEGIN - output := 'Cinta Hati '||input; - END; -END adodb; -/ -*/ - $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS,'A%'); END;"); - - if ($rs && !$rs->EOF) { - print "Test 1 RowCount: ".$rs->RecordCount().""; - } else { - print "Error in using Cursor Variables 1
"; - } - - - print "
Testing Stored Procedures for oci8
"; - - $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;"); - $a1 = 'Malaysia'; - //$a2 = ''; # a2 doesn't even need to be defined! - $db->InParameter($stmt,$a1,'a1'); - $db->OutParameter($stmt,$a2,'a2'); - $rs = $db->Execute($stmt); - if ($rs) { - if ($a2 !== 'Cinta Hati Malaysia') print "Stored Procedure Error: a2 = $a2"; - else echo "OK: a2=$a2
"; - } else { - print "Error in using Stored Procedure IN/Out Variables
"; - } - - - $tname = 'A%'; - - $stmt = $db->PrepareSP('select * from tab where tname like :tablename'); - $db->Parameter($stmt,$tname,'tablename'); - $rs = $db->Execute($stmt); - rs2html($rs); - - $db->debug = $saved; - break; - - default: - break; - } - $arr = array( - array(1,'Caroline','Miranda'), - array(2,'John','Lim'), - array(3,'Wai Hun','See') - ); - $db->debug=1; - print "
Testing Bulk Insert of 3 rows
"; - - $sql = "insert into ADOXYZ (id,firstname,lastname) values (".$db->Param('0').",".$db->Param('1').",".$db->Param('2').")"; - $db->StartTrans(); - $db->Execute($sql,$arr); - $db->CompleteTrans(); - $rs = $db->Execute('select * from ADOXYZ order by id'); - if ($rs->RecordCount() != 3) Err("Bad bulk insert"); - rs2html($rs); - - $db->Execute('delete from ADOXYZ'); - - print "Inserting 50 rows
"; - - for ($i = 0; $i < 5; $i++) { - - $time = $db->DBDate(time()); - if (empty($HTTP_GET_VARS['hide'])) $db->debug = true; - switch($db->databaseType){ - case 'mssqlpo': - case 'mssql': - $sqlt = "CREATE TABLE mytable ( - row1 INT IDENTITY(1,1) NOT NULL, - row2 varchar(16), - PRIMARY KEY (row1))"; - //$db->debug=1; - if (!$db->Execute("delete from mytable")) - $db->Execute($sqlt); - - $ok = $db->Execute("insert into mytable (row2) values ('test')"); - $ins_id=$db->Insert_ID(); - echo "Insert ID=";var_dump($ins_id); - if ($ins_id == 0) Err("Bad Insert_ID()"); - $ins_id2 = $db->GetOne("select row1 from mytable"); - if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2"); - - $arr = array(0=>'Caroline',1=>'Miranda'); - $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)"; - break; - - case 'mysql': - $sqlt = "CREATE TABLE `mytable` ( - `row1` int(11) NOT NULL auto_increment, - `row2` varchar(16) NOT NULL default '', - PRIMARY KEY (`row1`), - KEY `myindex` (`row1`,`row2`) -) "; - if (!$db->Execute("delete from mytable")) - $db->Execute($sqlt); - - $ok = $db->Execute("insert into mytable (row2) values ('test')"); - $ins_id=$db->Insert_ID(); - echo "Insert ID=";var_dump($ins_id); - if ($ins_id == 0) Err("Bad Insert_ID()"); - $ins_id2 = $db->GetOne("select row1 from mytable"); - if ($ins_id != $ins_id2) Err("Bad Insert_ID() 2"); - - default: - $arr = array(0=>'Caroline',1=>'Miranda'); - $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,?,?,$time)"; - break; - - case 'oci8': - case 'oci805': - $arr = array('first'=>'Caroline','last'=>'Miranda'); - $amt = rand() % 100; - $sql = "insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+0,:first,:last,$time)"; - break; - } - if ($i & 1) { - $sql = $db->Prepare($sql); - } - $rs = $db->Execute($sql,$arr); - - if ($rs === false) Err( 'Error inserting with parameters'); - else $rs->Close(); - $db->debug = false; - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+1,'John','Lim',$time)"); - /*$ins_id=$db->Insert_ID(); - echo "Insert ID=";var_dump($ins_id);*/ - if ($db->databaseType == 'mysql') if ($ins_id == 0) Err('Bad Insert_ID'); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+2,'Mary','Lamb',$time )"); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+3,'George','Washington',$time )"); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+4,'Mr. Alan','Tam',$time )"); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+5,'Alan',".$db->quote("Turing'ton").",$time )"); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created)values ($i*10+6,'Serena','Williams',$time )"); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+7,'Yat Sun','Sun',$time )"); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+8,'Wai Hun','See',$time )"); - $db->Execute("insert into ADOXYZ (id,firstname,lastname,created) values ($i*10+9,'Steven','Oey',$time )"); - } // for - if (1) { - $db->debug=1; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $cnt = $db->GetOne("select count(*) from ADOXYZ"); - $rs = $db->Execute('update ADOXYZ set id=id+1'); - if (!is_object($rs)) { - print_r($rs); - err("Update should return object"); - } - if (!$rs) err("Update generated error"); - - $nrows = $db->Affected_Rows(); - if ($nrows === false) print "Affected_Rows() not supported
"; - else if ($nrows != $cnt) print "Affected_Rows() Error: $nrows returned (should be 50)
"; - else print "Affected_Rows() passed
"; - } - $db->debug = false; - - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - ////////////////////////////////////////////////////////////////////////////////////////// - - $rs = $db->Execute("select * from ADOXYZ where firstname = 'not known'"); - if (!$rs || !$rs->EOF) print "Error on empty recordset
"; - else if ($rs->RecordCount() != 0) { - print "Error on RecordCount. Should be 0. Was ".$rs->RecordCount()."
"; - print_r($rs->fields); - } - if ($db->databaseType !== 'odbc') { - $rs = &$db->Execute("select id,firstname,lastname,created,".$db->random." from ADOXYZ order by id"); - if ($rs) { - if ($rs->RecordCount() != 50) { - print "RecordCount returns ".$rs->RecordCount()."
"; - $poc = $rs->PO_RecordCount('ADOXYZ'); - if ($poc == 50) print "PO_RecordCount passed
"; - else print "PO_RecordCount returns wrong value: $poc
"; - } else print "RecordCount() passed
"; - if (isset($rs->fields['firstname'])) print 'The fields columns can be indexed by column name.
'; - else { - Err( 'The fields columns cannot be indexed by column name.
'); - print_r($rs->fields); - } - if (empty($HTTP_GET_VARS['hide'])) rs2html($rs); - } - else print "Error in Execute of SELECT with random"; - } - $val = $db->GetOne("select count(*) from ADOXYZ"); - if ($val == 50) print "GetOne returns ok
"; - else print "Fail: GetOne returns $val
"; - - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $val = $db->GetRow("select count(*) from ADOXYZ"); - if ($val[0] == 50 and sizeof($val) == 1) print "GetRow returns ok
"; - else { - print_r($val); - print "Fail: GetRow returns {$val[0]}
"; - } - - print "FetchObject/FetchNextObject Test
"; - $rs = &$db->Execute('select * from ADOXYZ'); - - if (empty($rs->connection)) print "Connection object missing from recordset"; - - while ($o = $rs->FetchNextObject()) { // calls FetchObject internally - if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) { - print_r($o); - print "Firstname is not string
"; - break; - } - } - - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - print "FetchObject/FetchNextObject Test 2
"; - - $rs = &$db->Execute('select * from ADOXYZ'); - if (empty($rs->connection)) print "Connection object missing from recordset"; - print_r($rs->fields); - while ($o = $rs->FetchNextObject()) { // calls FetchObject internally - if (!is_string($o->FIRSTNAME) || !is_string($o->LASTNAME)) { - print_r($o); - print "Firstname is not string
"; - break; - } - } - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - - $savefetch = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - - print "CacheSelectLimit Test
"; - $db->debug=1; - $rs = $db->CacheSelectLimit(' select id, firstname from ADOXYZ order by id',2); - if ($rs && !$rs->EOF) { - if (isset($rs->fields[0])) { - Err("ASSOC has numeric fields"); - print_r($rs->fields); - } - if ($rs->fields['id'] != 1) {Err("Error"); print_r($rs->fields);}; - if (trim($rs->fields['firstname']) != 'Caroline') {print Err("Error 2"); print_r($rs->fields);}; - $rs->MoveNext(); - if ($rs->fields['id'] != 2) {Err("Error 3"); print_r($rs->fields);}; - $rs->MoveNext(); - if (!$rs->EOF) { - Err("Error EOF"); - print_r($rs); - } - } - - print "FETCH_MODE = ASSOC: Should get 1, Caroline
"; - $rs = &$db->SelectLimit('select id,firstname from ADOXYZ order by id',2); - if ($rs && !$rs->EOF) { - if ($rs->fields['id'] != 1) {Err("Error 1"); print_r($rs->fields);}; - if (trim($rs->fields['firstname']) != 'Caroline') {Err("Error 2"); print_r($rs->fields);}; - $rs->MoveNext(); - if ($rs->fields['id'] != 2) {Err("Error 3"); print_r($rs->fields);}; - $rs->MoveNext(); - if (!$rs->EOF) Err("Error EOF"); - else if (is_array($rs->fields) || $rs->fields) { - Err("Error: ## fields should be set to false on EOF"); - print_r($rs->fields); - } - } - - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - print "FETCH_MODE = NUM: Should get 1, Caroline
"; - $rs = &$db->SelectLimit('select id,firstname from ADOXYZ order by id',1); - if ($rs && !$rs->EOF) { - if (isset($rs->fields['id'])) Err("FETCH_NUM has ASSOC fields"); - if ($rs->fields[0] != 1) {Err("Error 1"); print_r($rs->fields);}; - if (trim($rs->fields[1]) != 'Caroline') {Err("Error 2");print_r($rs->fields);}; - $rs->MoveNext(); - if (!$rs->EOF) Err("Error EOF"); - - } - $ADODB_FETCH_MODE = $savefetch; - - $db->debug = false; - print "GetRowAssoc Upper: Should get 1, Caroline
"; - $rs = &$db->SelectLimit('select id,firstname from ADOXYZ order by id',1); - if ($rs && !$rs->EOF) { - $arr = &$rs->GetRowAssoc(); - if ($arr['ID'] != 1) {Err("Error 1");print_r($arr);}; - if (trim($arr['FIRSTNAME']) != 'Caroline') {Err("Error 2"); print_r($arr);}; - $rs->MoveNext(); - if (!$rs->EOF) Err("Error EOF"); - - } - print "GetRowAssoc Lower: Should get 1, Caroline
"; - $rs = &$db->SelectLimit('select id,firstname from ADOXYZ order by id',1); - if ($rs && !$rs->EOF) { - $arr = &$rs->GetRowAssoc(false); - if ($arr['id'] != 1) {Err("Error 1"); print_r($arr);}; - if (trim($arr['firstname']) != 'Caroline') {Err("Error 2"); print_r($arr);}; - - } - - print "GetCol Test
"; - $col = $db->GetCol('select distinct firstname from adoxyz order by 1'); - if (!is_array($col)) Err("Col size is wrong"); - if (trim($col[0]) != 'Alan' or trim($col[9]) != 'Yat Sun') Err("Col elements wrong"); - - $db->debug = true; - print "SelectLimit Distinct Test 1: Should see Caroline, John and Mary
"; - $rs = &$db->SelectLimit('select distinct * from ADOXYZ order by id',3); - $db->debug=false; - - if ($rs && !$rs->EOF) { - if (trim($rs->fields[1]) != 'Caroline') Err("Error 1"); - $rs->MoveNext(); - if (trim($rs->fields[1]) != 'John') Err("Error 2"); - $rs->MoveNext(); - if (trim($rs->fields[1]) != 'Mary') Err("Error 3"); - $rs->MoveNext(); - if (! $rs->EOF) Err("Error EOF"); - //rs2html($rs); - } else Err("Failed SelectLimit Test 1"); - - print "SelectLimit Test 2: Should see Mary, George and Mr. Alan
"; - $rs = &$db->SelectLimit('select * from ADOXYZ order by id',3,2); - if ($rs && !$rs->EOF) { - if (trim($rs->fields[1]) != 'Mary') Err("Error 1"); - $rs->MoveNext(); - if (trim($rs->fields[1]) != 'George')Err("Error 2"); - $rs->MoveNext(); - if (trim($rs->fields[1]) != 'Mr. Alan') Err("Error 3"); - $rs->MoveNext(); - if (! $rs->EOF) Err("Error EOF"); - // rs2html($rs); - } - else Err("Failed SelectLimit Test 2"); - - print "SelectLimit Test 3: Should see Wai Hun and Steven
"; - $db->debug=1; - global $A; $A=1; - $rs = &$db->SelectLimit('select * from ADOXYZ order by id',-1,48); - $A=0; - if ($rs && !$rs->EOF) { - if (empty($rs->connection)) print "Connection object missing from recordset"; - if (trim($rs->fields[1]) != 'Wai Hun') Err("Error 1 ".$rs->fields[1]); - $rs->MoveNext(); - if (trim($rs->fields[1]) != 'Steven') Err("Error 2 ".$rs->fields[1]); - $rs->MoveNext(); - if (! $rs->EOF) { - Err("Error EOF"); - } - //rs2html($rs); - } - else Err("Failed SelectLimit Test 3"); - $db->debug = false; - - - $rs = &$db->Execute("select * from ADOXYZ order by id"); - print "Testing Move()
"; - if (!$rs)Err( "Failed Move SELECT"); - else { - if (!$rs->Move(2)) { - if (!$rs->canSeek) print "$db->databaseType: Move(), MoveFirst() nor MoveLast() not supported.
"; - else print 'RecordSet->canSeek property should be set to false
'; - } else { - $rs->MoveFirst(); - if (trim($rs->Fields("firstname")) != 'Caroline') { - print "$db->databaseType: MoveFirst failed -- probably cannot scroll backwards
"; - } - else print "MoveFirst() OK
"; - - // Move(3) tests error handling -- MoveFirst should not move cursor - $rs->Move(3); - if (trim($rs->Fields("firstname")) != 'George') { - print ''.$rs->Fields("id")."$db->databaseType: Move(3) failed
"; - } else print "Move(3) OK
"; - - $rs->Move(7); - if (trim($rs->Fields("firstname")) != 'Yat Sun') { - print ''.$rs->Fields("id")."$db->databaseType: Move(7) failed
"; - print_r($rs); - } else print "Move(7) OK
"; - if ($rs->EOF) Err("Move(7) is EOF already"); - $rs->MoveLast(); - if (trim($rs->Fields("firstname")) != 'Steven'){ - print ''.$rs->Fields("id")."$db->databaseType: MoveLast() failed
"; - print_r($rs); - }else print "MoveLast() OK
"; - $rs->MoveNext(); - if (!$rs->EOF) err("Bad MoveNext"); - if ($rs->canSeek) { - $rs->Move(3); - if (trim($rs->Fields("firstname")) != 'George') { - print ''.$rs->Fields("id")."$db->databaseType: Move(3) after MoveLast failed
"; - - } else print "Move(3) after MoveLast() OK
"; - } - - print "Empty Move Test"; - $rs = $db->Execute("select * from ADOXYZ where id > 0 and id < 0"); - $rs->MoveFirst(); - if (!$rs->EOF || $rs->fields) Err("Error in empty move first"); - } - } - - $rs = $db->Execute('select * from ADOXYZ where id = 2'); - if ($rs->EOF || !is_array($rs->fields)) Err("Error in select"); - $rs->MoveNext(); - if (!$rs->EOF) Err("Error in EOF (xx) "); - // $db->debug=true; - print "
Testing ADODB_FETCH_ASSOC and concat: concat firstname and lastname
"; - - $save = $ADODB_FETCH_MODE; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - if ($db->dataProvider == 'postgres') { - $sql = "select ".$db->Concat('cast(firstname as varchar)',$db->qstr(' '),'lastname')." as fullname,id from ADOXYZ"; - $rs = &$db->Execute($sql); - } else { - $sql = "select distinct ".$db->Concat('firstname',$db->qstr(' '),'lastname')." as fullname,id from ADOXYZ"; - $rs = &$db->Execute($sql); - } - if ($rs) { - if (empty($HTTP_GET_VARS['hide'])) rs2html($rs); - } else { - Err( "Failed Concat:".$sql); - } - $ADODB_FETCH_MODE = $save; - print "
Testing GetArray() "; - //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - - $rs = &$db->Execute("select * from ADOXYZ order by id"); - if ($rs) { - $arr = &$rs->GetArray(10); - if (sizeof($arr) != 10 || trim($arr[1][1]) != 'John' || trim($arr[1][2]) != 'Lim') print $arr[1][1].' '.$arr[1][2]." ERROR
"; - else print " OK
"; - } - - $arr = $db->GetArray("select x from ADOXYZ"); - $e = $db->ErrorMsg(); $e2 = $db->ErrorNo(); - echo "Testing error handling, should see illegal column 'x' error=$e ($e2)
"; - if (!$e || !$e2) Err("Error handling did not work"); - print "Testing FetchNextObject for 1 object "; - $rs = &$db->Execute("select distinct lastname,firstname from ADOXYZ where firstname='Caroline'"); - $fcnt = 0; - if ($rs) - while ($o = $rs->FetchNextObject()) { - $fcnt += 1; - } - if ($fcnt == 1) print " OK
"; - else print "FAILED
"; - - $stmt = $db->Prepare("select * from ADOXYZ where id < 3"); - $rs = $db->Execute($stmt); - if (!$rs) Err("Prepare failed"); - else { - $arr = $rs->GetArray(); - if (!$arr) Err("Prepare failed 2"); - if (sizeof($arr) != 2) Err("Prepare failed 3"); - } - print "Testing GetAssoc() "; - $savecrecs = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = false; - $rs = &$db->Execute("select distinct lastname,firstname from ADOXYZ"); - if ($rs) { - $arr = $rs->GetAssoc(); - //print_r($arr); - if (trim($arr['See']) != 'Wai Hun') print $arr['See']." ERROR
"; - else print " OK 1"; - } - - $arr = &$db->GetAssoc("select distinct lastname,firstname from ADOXYZ"); - if ($arr) { - //print_r($arr); - if (trim($arr['See']) != 'Wai Hun') print $arr['See']." ERROR
"; - else print " OK 2
"; - } - // Comment this out to test countrecs = false - $ADODB_COUNTRECS = $savecrecs; - - for ($loop=0; $loop < 1; $loop++) { - print "Testing GetMenu() and CacheExecute
"; - $db->debug = true; - $rs = &$db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); - - if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu('menu','Steven').'
'; - else print " Fail
"; - $rs = &$db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); - - if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu('menu','Steven',false).'
'; - else print " Fail
"; - - $rs = &$db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); - if ($rs) print ' Multiple, Alan selected: '. $rs->GetMenu('menu','Alan',false,true).'
'; - else print " Fail
"; - print '
'; - - $rs = &$db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); - if ($rs) { - print ' Multiple, Alan and George selected: '. $rs->GetMenu('menu',array('Alan','George'),false,true); - if (empty($rs->connection)) print "Connection object missing from recordset"; - } else print " Fail
"; - print '
'; - - print "Testing GetMenu2()
"; - $rs = &$db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); - if ($rs) print 'With blanks, Steven selected:'. $rs->GetMenu2('menu',('Oey')).'
'; - else print " Fail
"; - $rs = &$db->CacheExecute(4,"select distinct firstname,lastname from ADOXYZ"); - if ($rs) print ' No blanks, Steven selected: '. $rs->GetMenu2('menu',('Oey'),false).'
'; - else print " Fail
"; - } - - $db->debug = false; - - // phplens - - $sql = 'select * from ADOXYZ where 0=1'; - echo "**Testing '$sql' (phplens compat 1)
"; - $rs = &$db->Execute($sql); - if (!$rs) err( "No recordset returned for '$sql'"); - if (!$rs->FieldCount()) err( "No fields returned for $sql"); - if (!$rs->FetchField(1)) err( "FetchField failed for $sql"); - - $sql = 'select * from ADOXYZ order by 1'; - echo "**Testing '$sql' (phplens compat 2)
"; - $rs = &$db->Execute($sql); - if (!$rs) err( "No recordset returned for '$sql'
".$db->ErrorMsg().""); - - - $sql = 'select * from ADOXYZ order by 1,1'; - echo "**Testing '$sql' (phplens compat 3)
"; - $rs = &$db->Execute($sql); - if (!$rs) err( "No recordset returned for '$sql'
".$db->ErrorMsg().""); - - - // Move - $rs1 = &$db->Execute("select id from ADOXYZ where id <= 2 order by 1"); - $rs2 = &$db->Execute("select id from ADOXYZ where id = 3 or id = 4 order by 1"); - - if ($rs1) $rs1->MoveLast(); - if ($rs2) $rs2->MoveLast(); - - if (empty($rs1) || empty($rs2) || $rs1->fields[0] != 2 || $rs2->fields[0] != 4) { - $a = $rs1->fields[0]; - $b = $rs2->fields[0]; - print "Error in multiple recordset test rs1=$a rs2=$b (should be rs1=2 rs2=4)
"; - } else - print "Testing multiple recordsets OK
"; - - - echo "GenID test: "; - for ($i=1; $i <= 10; $i++) - echo "($i: ",$val = $db->GenID($db->databaseType.'abcseq6' ,5), ") "; - if ($val == 0) Err("GenID not supported"); - - if ($val) { - $db->DropSequence('abc_seq2'); - $db->CreateSequence('abc_seq2'); - $val = $db->GenID('abc_seq2'); - $db->DropSequence('abc_seq2'); - $db->CreateSequence('abc_seq2'); - $val = $db->GenID('abc_seq2'); - if ($val != 1) Err("Drop and Create Sequence not supported ($val)"); - } - echo "
"; - - if (substr($db->dataProvider,0,3) != 'notused') { // used to crash ado - $sql = "select firstnames from adoxyz"; - print "
Testing execution of illegal statement: $sql
"; - if ($db->Execute($sql) === false) { - print "This returns the following ErrorMsg(): ".$db->ErrorMsg()." and ErrorNo(): ".$db->ErrorNo().'
'; - } else - print "Error in error handling -- Execute() should return false
"; - } else - print "ADO skipped error handling of bad select statement
"; - - print "ASSOC TEST 2
"; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $rs = $db->query('select * from adoxyz order by id'); - if ($ee = $db->ErrorMsg()) { - Err("Error message=$ee"); - } - if ($ee = $db->ErrorNo()) { - Err("Error No = $ee"); - } - print_r($rs->fields); - for($i=0;$i<$rs->FieldCount();$i++) - { - $fld=$rs->FetchField($i); - print "
Field name is ".$fld->name; - print " ".$rs->Fields($fld->name); - } - - - print "BOTH TEST 2
"; - if ($db->dataProvider == 'ado') { - print "ADODB_FETCH_BOTH not supported for dataProvider=".$db->dataProvider."
"; - } else { - $ADODB_FETCH_MODE = ADODB_FETCH_BOTH; - $rs = $db->query('select * from adoxyz order by id'); - for($i=0;$i<$rs->FieldCount();$i++) - { - $fld=$rs->FetchField($i); - print "
Field name is ".$fld->name; - print " ".$rs->Fields($fld->name); - } - } - - print "NUM TEST 2
"; - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $rs = $db->query('select * from adoxyz order by id'); - for($i=0;$i<$rs->FieldCount();$i++) - { - $fld=$rs->FetchField($i); - print "
Field name is ".$fld->name; - print " ".$rs->Fields($fld->name); - } - - print "ASSOC Test of SelectLimit
"; - break; - } - $rs->MoveNext(); - } - if ($cnt != 3) print "
"; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $rs = $db->selectlimit('select * from adoxyz order by id',3,4); - $cnt = 0; - while ($rs && !$rs->EOF) { - $cnt += 1; - if (!isset($rs->fields['firstname'])) { - print "
ASSOC returned numeric field
Count should be 3, instead it was $cnt"; - - - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - if ($db->sysDate) { - $saved = $db->debug; - $db->debug = 1; - $rs = $db->Execute("select {$db->sysDate} from adoxyz where id=1"); - if (ADORecordSet::UnixDate(date('Y-m-d')) != $rs->UnixDate($rs->fields[0])) { - print "Invalid date {$rs->fields[0]}
"; - } else - print "Passed \$sysDate test ({$rs->fields[0]})
"; - - print_r($rs->FetchField(0)); - print time(); - $db->debug=$saved; - } else { - print "\$db->sysDate not defined
"; - } - - print "Test CSV
"; - include_once('../toexport.inc.php'); - //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $rs = $db->SelectLimit('select id,firstname,lastname,created,\'He, he\' he,\'"\' q from adoxyz',10); - - print ""; - print rs2csv($rs); - print ""; - - $rs = $db->SelectLimit('select id,firstname,lastname,created,\'The "young man", he said\' from adoxyz',10); - - print ""; - rs2tabout($rs); - print ""; - - //print " CacheFlush "; - //$db->CacheFlush(); - - $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A'); - $sql = "SELECT $date from ADOXYZ"; - print "Test SQLDate: ".htmlspecialchars($sql)."
"; - $rs = $db->SelectLimit($sql,1); - $d = date('d-m-M-Y-').'Q'.(ceil(date('m')/3.0)).date(' h:i:s A'); - if (!$rs) Err("SQLDate query returned no recordset"); - else if ($d != $rs->fields[0]) Err("SQLDate 1 failed expected:
act:$d
sql:".$rs->fields[0]); - - $date = $db->SQLDate('d-m-M-Y-\QQ h:i:s A',$db->DBDate("1974-02-25")); - $sql = "SELECT $date from ADOXYZ"; - print "Test SQLDate: ".htmlspecialchars($sql)."
"; - $rs = $db->SelectLimit($sql,1); - $ts = ADOConnection::UnixDate('1974-02-25'); - $d = date('d-m-M-Y-',$ts).'Q'.(ceil(date('m',$ts)/3.0)).date(' h:i:s A',$ts); - if (!$rs) Err("SQLDate query returned no recordset"); - else if ($d != $rs->fields[0]) Err("SQLDate 2 failed expected:
act:$d
sql:".$rs->fields[0]); - - - print "Test Filter
"; - $db->debug = 1; - - $rs = $db->SelectLimit('select * from ADOXYZ where id < 3 order by id'); - - $rs = RSFilter($rs,'do_strtolower'); - if (trim($rs->fields[1]) != 'caroline' && trim($rs->fields[2]) != 'miranda') { - err('**** RSFilter failed'); - print_r($rs->fields); - } - - rs2html($rs); - - $db->debug=1; - - - print "Test Replace
"; - - $ret = $db->Replace('adoxyz', - array('id'=>1,'firstname'=>'Caroline','lastname'=>'Miranda'), - array('id'), - $autoq = true); - if (!$ret) echo "Error in replacing existing record
"; - else { - $saved = $db->debug; - $db->debug = 0; - $savec = $ADODB_COUNTRECS; - $ADODB_COUNTRECS = true; - $rs = $db->Execute('select * FROM ADOXYZ where id=1'); - $db->debug = $saved; - if ($rs->RecordCount() != 1) { - $cnt = $rs->RecordCount(); - rs2html($rs); - print "Error - Replace failed, count=$cnt"; - } - $ADODB_COUNTRECS = $savec; - } - $ret = $db->Replace('adoxyz', - array('id'=>1000,'firstname'=>'Harun','lastname'=>'Al-Rashid'), - array('id','firstname'), - $autoq = true); - if ($ret != 2) print "Replace failed: "; - print "test A return value=$ret (2 expected)
"; - - $ret = $db->Replace('adoxyz', - array('id'=>1000,'firstname'=>'Sherazade','lastname'=>'Al-Rashid'), - 'id', - $autoq = true); - if ($ret != 1) - if ($db->dataProvider == 'ibase' && $ret == 2); - else print "Replace failed: "; - print "test B return value=$ret (1 or if ibase then 2 expected)
"; - - print "
rs2rs Test
"; - - $rs = $db->Execute('select * from adoxyz order by id'); - $rs = $db->_rs2rs($rs); - $rs->valueX = 'X'; - $rs->MoveNext(); - $rs = $db->_rs2rs($rs); - if (!isset($rs->valueX)) err("rs2rs does not preserve array recordsets"); - if (reset($rs->fields) != 1) err("rs2rs does not move to first row"); - - ///////////////////////////////////////////////////////////// - include_once('../pivottable.inc.php'); - print "Pivot Test
"; - $db->debug=true; - $sql = PivotTableSQL( - $db, # adodb connection - 'adoxyz', # tables - 'firstname', # row fields - 'lastname', # column fields - false, # join - 'ID', # sum - 'Sum ', # label for sum - 'sum', # aggregate function - true - ); - $rs = $db->Execute($sql); - if ($rs) rs2html($rs); - else Err("Pivot sql error"); - - $db->debug=false; - include_once "PEAR.php"; - - // PEAR TESTS BELOW - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $pear = true; - $rs = $db->query('select * from adoxyz where id>0 and id<10 order by id'); - - $i = 0; - if ($rs && !$rs->EOF) { - while ($arr = $rs->fetchRow()) { - $i++; - //print "$i "; - if ($arr[0] != $i) { - print_r($arr); - print "PEAR DB emulation error 1.
"; - $pear = false; - break; - } - } - $rs->Close(); - } - - - if ($i != $db->GetOne('select count(*) from adoxyz where id>0 and id<10')) { - print "PEAR DB emulation error 1.1 EOF ($i)
"; - $pear = false; - } - - $rs = $db->limitQuery('select * from adoxyz where id>0 order by id',$i=3,$top=3); - $i2 = $i; - if ($rs && !$rs->EOF) { - - while (!is_object($rs->fetchInto($arr))) { - $i2++; - - // print_r($arr); - // print "$i ";print_r($arr); - if ($arr[0] != $i2) { - print "PEAR DB emulation error 2.
"; - $pear = false; - break; - } - } - $rs->Close(); - } - if ($i2 != $i+$top) { - print "PEAR DB emulation error 2.1 EOF (correct=$i+$top, actual=$i2)
"; - $pear = false; - } - - if ($pear) print "PEAR DB emulation passed.
"; - - $rs = $db->SelectLimit("select ".$db->sysDate." from adoxyz",1); - $date = $rs->fields[0]; - if (!$date) Err("Bad sysDate"); - else { - $ds = $db->UserDate($date,"d m Y"); - if ($ds != date("d m Y")) Err("Bad UserDate: ".$ds); - else echo "Passed UserDate: $ds"; - } - $db->debug=1; - if ($db->dataProvider == 'oci8') - $rs = $db->SelectLimit("select to_char(".$db->sysTimeStamp.",'YYYY-MM-DD HH24:MI:SS') from adoxyz",1); - else - $rs = $db->SelectLimit("select ".$db->sysTimeStamp." from adoxyz",1); - $date = $rs->fields[0]; - if (!$date) Err("Bad sysTimeStamp"); - else { - $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y"); - if ($ds != date("H \\h\\r\\s-d m Y")) Err("Bad UserTimeStamp: ".$ds.", correct is ".date("H \\h\\r\\s-d m Y")); - else echo "Passed UserTimeStamp: $ds
"; - - $date = 100; - $ds = $db->UserTimeStamp($date,"H \\h\\r\\s-d m Y"); - $ds2 = date("H \\h\\r\\s-d m Y",$date); - if ($ds != $ds2) Err("Bad UserTimeStamp 2: $ds: $ds2"); - else echo "Passed UserTimeStamp 2: $ds
"; - } - if ($db->hasTransactions) { - //$db->debug=1; - echo "
Testing StartTrans CompleteTrans
"; - $db->raiseErrorFn = false; - $db->StartTrans(); - $rs = $db->Execute('select * from notable'); - $db->StartTrans(); - $db->BeginTrans(); - $db->Execute("update ADOXYZ set firstname='Carolx' where id=1"); - $db->CommitTrans(); - $db->CompleteTrans(); - $rez = $db->CompleteTrans(); - if ($rez !== false) { - if (is_null($rez)) Err("Error: _transOK not modified"); - else Err("Error: CompleteTrans (1) should have failed"); - } else { - $name = $db->GetOne("Select firstname from ADOXYZ where id=1"); - if ($name == "Carolx") Err("Error: CompleteTrans (2) should have failed"); - else echo "-- Passed StartTrans test1 - rolling back
"; - } - - $db->StartTrans(); - $db->BeginTrans(); - $db->Execute("update ADOXYZ set firstname='Carolx' where id=1"); - $db->RollbackTrans(); - $rez = $db->CompleteTrans(); - if ($rez !== true) Err("Error: CompleteTrans (1) should have succeeded"); - else { - $name = $db->GetOne("Select firstname from ADOXYZ where id=1"); - if (trim($name) != "Carolx") Err("Error: CompleteTrans (2) should have succeeded, returned name=$name"); - else echo "-- Passed StartTrans test2 - commiting
"; - } - } - - - global $TESTERRS; - $debugerr = true; - - global $ADODB_LANG;$ADODB_LANG = 'fr'; - $db->debug = false; - $TESTERRS = 0; - $db->raiseErrorFn = 'adodb_test_err'; - global $ERRNO; // from adodb_test_err - $db->Execute('select * from nowhere'); - $metae = $db->MetaError($ERRNO); - if ($metae !== DB_ERROR_NOSUCHTABLE) print "MetaError=".$metae." wrong, should be ".DB_ERROR_NOSUCHTABLE."
"; - else print "MetaError ok (".DB_ERROR_NOSUCHTABLE."): ".$db->MetaErrorMsg($metae)."
"; - if ($TESTERRS != 1) print "raiseErrorFn select nowhere failed
"; - $rs = $db->Execute('select * from adoxyz'); - if ($debugerr) print " Move"; - $rs->Move(100); - $rs->_queryID = false; - if ($debugerr) print " MoveNext"; - $rs->MoveNext(); - if ($debugerr) print " $rs=false"; - $rs = false; - - print "SetFetchMode() tests
"; - $db->SetFetchMode(ADODB_FETCH_ASSOC); - $rs = $db->SelectLimit('select firstname from adoxyz',1); - // var_dump($rs->fields); - if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC"); - - $ADODB_FETCH_MODE = ADODB_FETCH_NUM; - $rs = $db->SelectLimit('select firstname from adoxyz',1); - //var_dump($rs->fields); - if (!isset($rs->fields['firstname'])) Err("BAD FETCH ASSOC"); - - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $db->SetFetchMode(ADODB_FETCH_NUM); - $rs = $db->SelectLimit('select firstname from adoxyz',1); - if (!isset($rs->fields[0])) Err("BAD FETCH NUM"); - - print "Test MetaTables again with SetFetchMode()
"; - $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; - $db->SetFetchMode(ADODB_FETCH_ASSOC); - print_r($db->MetaTables()); - print ""; - //////////////////////////////////////////////////////////////////// - - $conn = NewADOConnection($db->databaseType); - $conn->raiseErrorFn = 'adodb_test_err'; - @$conn->Connect('abc'); - if ($TESTERRS == 2) print "raiseErrorFn tests passed
-
"; - else print "raiseErrorFn tests failed ($TESTERRS)
"; - - - //////////////////////////////////////////////////////////////////// - - global $nocountrecs; - - if (isset($nocountrecs) && $ADODB_COUNTRECS) err("Error: \$ADODB_COUNTRECS is set"); - if (empty($nocountrecs) && $ADODB_COUNTRECS==false) err("Error: \$ADODB_COUNTRECS is not set"); - - -?> -
Total queries=%d; total cached=%d
",$EXECS+$CACHED, $CACHED); -} - -function adodb_test_err($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false) -{ -global $TESTERRS,$ERRNO; - - $ERRNO = $errno; - $TESTERRS += 1; - print "** $dbms ($fn): errno=$errno errmsg=$errmsg ($p1,$p2)"; -} -if (sizeof($HTTP_GET_VARS) == 0) $testmysql = true; - - -foreach($HTTP_GET_VARS as $k=>$v) { - //global $$k; - $$k = $v; -} -if (strpos(PHP_VERSION,'5') === 0) { - //$testaccess=1; - //$testmssql = 1; - //$testsqlite=1; -} -?> - -
- - - -
ADODB Database Library (c) 2000-2004 John Lim. All rights reserved. Released under BSD and LGPL.
- - +$msgWhite space detected in adodb-$conn.inc.php or include file...
"; + //die(); + } +} + +function do_strtolower(&$arr) +{ + foreach($arr as $k => $v) { + $arr[$k] = strtolower($v); + } +} + + +function CountExecs($db, $sql, $inputarray) +{ +global $EXECS; $EXECS++; +} + +function CountCachedExecs($db, $secs2cache, $sql, $inputarray) +{ +global $CACHED; $CACHED++; +} + +// the table creation code is specific to the database, so we allow the user +// to define their own table creation stuff + +function testdb(&$db,$createtab="create table ADOXYZ (id int, firstname char(24), lastname char(24), created date)") +{ +GLOBAL $ADODB_vers,$ADODB_CACHE_DIR,$ADODB_FETCH_MODE, $HTTP_GET_VARS,$ADODB_COUNTRECS; + +?> +Close(); + if ($rs2) $rs2->Close(); + if ($rs) $rs->Close(); + $db->Close(); + + if ($db->transCnt != 0) Err("Error in transCnt=$db->transCnt (should be 0)"); + + + printf("Total queries=%d; total cached=%d
",$EXECS+$CACHED, $CACHED); +} + +function adodb_test_err($dbms, $fn, $errno, $errmsg, $p1=false, $p2=false) +{ +global $TESTERRS,$ERRNO; + + $ERRNO = $errno; + $TESTERRS += 1; + print "** $dbms ($fn): errno=$errno errmsg=$errmsg ($p1,$p2)"; +} +if (sizeof($HTTP_GET_VARS) == 0) $testmysql = true; + + +foreach($HTTP_GET_VARS as $k=>$v) { + //global $$k; + $$k = $v; +} +if (strpos(PHP_VERSION,'5') === 0) { + //$testaccess=1; + //$testmssql = 1; + //$testsqlite=1; +} +?> + +
+vers=",ADOConnection::Version(); + +include_once('../adodb-time.inc.php'); +adodb_date_test(); +?> +
ADODB Database Library (c) 2000-2004 John Lim. All rights reserved. Released under BSD and LGPL.
+ + diff --git a/lib/adodb/tests/test2.php b/lib/adodb/tests/test2.php index 1447466649..6da52e1f8e 100644 --- a/lib/adodb/tests/test2.php +++ b/lib/adodb/tests/test2.php @@ -1,41 +1,41 @@ - - - - -"; -//$rs->_array = false; -//$rs->connection = false; -//print_r($rs); -rs2html($rs); -?> - - - - + + + + +Untitled + + + +PConnect('','scott','tiger')) + die("Cannot connect to server"); +$c1->debug=1; +$rs = $c1->Execute('select rownum, p1.firstname,p2.lastname,p2.firstname,p1.lastname from adoxyz p1, adoxyz p2'); +print "Records=".$rs->RecordCount().""; +//$rs->_array = false; +//$rs->connection = false; +//print_r($rs); +rs2html($rs); +?> + + + + diff --git a/lib/adodb/tests/test3.php b/lib/adodb/tests/test3.php index 207dda2773..d3a636938e 100644 --- a/lib/adodb/tests/test3.php +++ b/lib/adodb/tests/test3.php @@ -1,44 +1,44 @@ -Connect('','scott','natsoft'); -$db->debug=1; - -$cnt = $db->GetOne("select count(*) from adoxyz"); -$rs = $db->Execute("select * from adoxyz order by id"); - -$i = 0; -foreach($rs as $k => $v) { - $i += 1; - echo $k; adodb_pr($v); - flush(); -} - -if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n"); - - - -$rs = $db->Execute("select bad from badder"); - -} catch (exception $e) { - adodb_pr($e); - $e = adodb_backtrace($e->trace); -} - +Connect('','scott','natsoft'); +$db->debug=1; + +$cnt = $db->GetOne("select count(*) from adoxyz"); +$rs = $db->Execute("select * from adoxyz order by id"); + +$i = 0; +foreach($rs as $k => $v) { + $i += 1; + echo $k; adodb_pr($v); + flush(); +} + +if ($i != $cnt) die("actual cnt is $i, cnt should be $cnt\n"); + + + +$rs = $db->Execute("select bad from badder"); + +} catch (exception $e) { + adodb_pr($e); + $e = adodb_backtrace($e->trace); +} + ?> \ No newline at end of file diff --git a/lib/adodb/tests/test4.php b/lib/adodb/tests/test4.php index 64fb8b01a0..56956721ff 100644 --- a/lib/adodb/tests/test4.php +++ b/lib/adodb/tests/test4.php @@ -1,7 +1,7 @@ PConnect("localhost", "root", "", "test"); // connect to MySQL, testdb + +//$conn =& ADONewConnection('oci8'); +//$conn->Connect('','scott','natsoft'); //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; $conn->debug=1; -$conn->PConnect("localhost", "root", "", "test"); // connect to MySQL, testdb $conn->Execute("delete from adoxyz where lastname like 'Smith%'"); $rs = $conn->Execute($sql); // Execute the query and get the empty recordset @@ -53,6 +56,8 @@ $insertSQL = $conn->GetInsertSQL($rs, $record); $conn->Execute($insertSQL); // Insert the record into the database +$insertSQL2 = $conn->GetInsertSQL($table='ADOXYZ', $record); +if ($insertSQL != $insertSQL2) echo "Walt's new stuff failed: $insertSQL2
"; //========================== // This code tests an update @@ -62,7 +67,7 @@ FROM ADOXYZ WHERE lastname=".$conn->qstr($record['lastname']); // Select a record to update $rs = $conn->Execute($sql); // Execute the query and get the existing record to update -if (!$rs) print "No record found!
"; +if (!$rs) print "No record found!
"; $record = array(); // Initialize an array to hold the record data to update @@ -78,7 +83,7 @@ $record['num'] = 3921; $updateSQL = $conn->GetUpdateSQL($rs, $record); $conn->Execute($updateSQL); // Update the record in the database -print "Rows Affected=".$conn->Affected_Rows()."
"; +if ($conn->Affected_Rows() != 1)print "Error: Rows Affected=".$conn->Affected_Rows().", should be 1
"; $rs = $conn->Execute("select * from adoxyz where lastname like 'Smith%'"); adodb_pr($rs); diff --git a/lib/adodb/tests/test5.php b/lib/adodb/tests/test5.php index ba02aeed08..64fe38e239 100644 --- a/lib/adodb/tests/test5.php +++ b/lib/adodb/tests/test5.php @@ -1,47 +1,47 @@ -debug=1; - $conn->PConnect("localhost","root","","xphplens"); - print $conn->databaseType.':'.$conn->GenID().'
'; -} - -if (0) { - $conn = &ADONewConnection("oci8"); // create a connection - $conn->debug=1; - $conn->PConnect("falcon", "scott", "tiger", "juris8.ecosystem.natsoft.com.my"); // connect to MySQL, testdb - print $conn->databaseType.':'.$conn->GenID(); -} - -if (0) { - $conn = &ADONewConnection("ibase"); // create a connection - $conn->debug=1; - $conn->Connect("localhost:c:\\Interbase\\Examples\\Database\\employee.gdb", "sysdba", "masterkey", ""); // connect to MySQL, testdb - print $conn->databaseType.':'.$conn->GenID().'
'; -} - -if (0) { - $conn = &ADONewConnection('postgres'); - $conn->debug=1; - @$conn->PConnect("susetikus","tester","test","test"); - print $conn->databaseType.':'.$conn->GenID().'
'; -} -?> +debug=1; + $conn->PConnect("localhost","root","","xphplens"); + print $conn->databaseType.':'.$conn->GenID().'
'; +} + +if (0) { + $conn = &ADONewConnection("oci8"); // create a connection + $conn->debug=1; + $conn->PConnect("falcon", "scott", "tiger", "juris8.ecosystem.natsoft.com.my"); // connect to MySQL, testdb + print $conn->databaseType.':'.$conn->GenID(); +} + +if (0) { + $conn = &ADONewConnection("ibase"); // create a connection + $conn->debug=1; + $conn->Connect("localhost:c:\\Interbase\\Examples\\Database\\employee.gdb", "sysdba", "masterkey", ""); // connect to MySQL, testdb + print $conn->databaseType.':'.$conn->GenID().'
'; +} + +if (0) { + $conn = &ADONewConnection('postgres'); + $conn->debug=1; + @$conn->PConnect("susetikus","tester","test","test"); + print $conn->databaseType.':'.$conn->GenID().'
'; +} +?> diff --git a/lib/adodb/tests/testcache.php b/lib/adodb/tests/testcache.php index b4516d5e85..2f032b7d40 100644 --- a/lib/adodb/tests/testcache.php +++ b/lib/adodb/tests/testcache.php @@ -1,29 +1,29 @@ - - -PConnect('nwind'); -} else { - $db = ADONewConnection('mysql'); - $db->PConnect('mangrove','root','','xphplens'); -} -if (isset($cache)) $rs = $db->CacheExecute(120,'select * from products'); -else $rs = $db->Execute('select * from products'); - -$arr = $rs->GetArray(); -print sizeof($arr); + + +PConnect('nwind'); +} else { + $db = ADONewConnection('mysql'); + $db->PConnect('mangrove','root','','xphplens'); +} +if (isset($cache)) $rs = $db->CacheExecute(120,'select * from products'); +else $rs = $db->Execute('select * from products'); + +$arr = $rs->GetArray(); +print sizeof($arr); ?> \ No newline at end of file diff --git a/lib/adodb/tests/testdatabases.inc.php b/lib/adodb/tests/testdatabases.inc.php index 871ec8d272..eaa1de0374 100644 --- a/lib/adodb/tests/testdatabases.inc.php +++ b/lib/adodb/tests/testdatabases.inc.php @@ -1,285 +1,301 @@ - - -
- |
+ |
"; -while( !$rs->EOF ) { - $output[] = $rs->fields; - var_dump($rs->fields); - $rs->MoveNext(); - print ""; -} -die(); - - -$p = $conn->Prepare('insert into products (productname,unitprice,dcreated) values (?,?,?)'); -echo "
"; -print_r($p); - -$conn->debug=1; -$conn->Execute($p,array('John'.rand(),33.3,$conn->DBDate(time()))); - -$p = $conn->Prepare('select * from products where productname like ?'); -$arr = $conn->getarray($p,array('V%')); -print_r($arr); -die(); - -//$conn = &ADONewConnection("mssql"); -//$conn->Connect('mangrove','sa','natsoft','ai'); - -//$conn->Connect('mangrove','sa','natsoft','ai'); -$conn->debug=1; -$conn->Execute('delete from blobtest'); - -$conn->Execute('insert into blobtest (id) values(1)'); -$conn->UpdateBlobFile('blobtest','b1','../cute_icons_for_site/adodb.gif','id=1'); -$rs = $conn->Execute('select b1 from blobtest where id=1'); - -$output = "c:\\temp\\test_out-".date('H-i-s').".gif"; -print "Saving file $output, size=".strlen($rs->fields[0]).""; -$fd = fopen($output, "wb"); -fwrite($fd, $rs->fields[0]); -fclose($fd); - -print " View Image"; -//$rs = $conn->Execute('SELECT id,SUBSTRING(b1, 1, 10) FROM blobtest'); -//rs2html($rs); +Connect('localhost','sa','natsoft','northwind') or die('Fail'); + +$conn->debug =1; +$query = 'select * from products'; +$conn->SetFetchMode(ADODB_FETCH_ASSOC); +$rs = $conn->Execute($query); +echo "
"; +while( !$rs->EOF ) { + $output[] = $rs->fields; + var_dump($rs->fields); + $rs->MoveNext(); + print ""; +} +die(); + + +$p = $conn->Prepare('insert into products (productname,unitprice,dcreated) values (?,?,?)'); +echo "
"; +print_r($p); + +$conn->debug=1; +$conn->Execute($p,array('John'.rand(),33.3,$conn->DBDate(time()))); + +$p = $conn->Prepare('select * from products where productname like ?'); +$arr = $conn->getarray($p,array('V%')); +print_r($arr); +die(); + +//$conn = &ADONewConnection("mssql"); +//$conn->Connect('mangrove','sa','natsoft','ai'); + +//$conn->Connect('mangrove','sa','natsoft','ai'); +$conn->debug=1; +$conn->Execute('delete from blobtest'); + +$conn->Execute('insert into blobtest (id) values(1)'); +$conn->UpdateBlobFile('blobtest','b1','../cute_icons_for_site/adodb.gif','id=1'); +$rs = $conn->Execute('select b1 from blobtest where id=1'); + +$output = "c:\\temp\\test_out-".date('H-i-s').".gif"; +print "Saving file $output, size=".strlen($rs->fields[0]).""; +$fd = fopen($output, "wb"); +fwrite($fd, $rs->fields[0]); +fclose($fd); + +print " View Image"; +//$rs = $conn->Execute('SELECT id,SUBSTRING(b1, 1, 10) FROM blobtest'); +//rs2html($rs); ?> \ No newline at end of file diff --git a/lib/adodb/tests/testoci8.php b/lib/adodb/tests/testoci8.php index d748efca46..df9a38277a 100644 --- a/lib/adodb/tests/testoci8.php +++ b/lib/adodb/tests/testoci8.php @@ -1,70 +1,69 @@ - -
-PConnect('','scott','tiger'); - - if (!empty($testblob)) { - $varHoldingBlob = 'ABC DEF GEF John TEST'; - $num = time()%10240; - // create table atable (id integer, ablob blob); - $db->Execute('insert into ATABLE (id,ablob) values('.$num.',empty_blob())'); - $db->UpdateBlob('ATABLE', 'ablob', $varHoldingBlob, 'id='.$num, 'BLOB'); - - $rs = &$db->Execute('select * from atable'); - - if (!$rs) die("Empty RS"); - if ($rs->EOF) die("EOF RS"); - rs2html($rs); - } - $stmt = $db->Prepare('select * from adoxyz where id=?'); - for ($i = 1; $i <= 10; $i++) { - $rs = &$db->Execute( - $stmt, - array($i)); - - if (!$rs) die("Empty RS"); - if ($rs->EOF) die("EOF RS"); - rs2html($rs); - } -} -if (1) { - $db = ADONewConnection('oci8'); - $db->PConnect('','scott','tiger'); - $db->debug = true; - $db->Execute("delete from emp where ename='John'"); - print $db->Affected_Rows().'
'; - $stmt = &$db->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); - $rs = $db->Execute($stmt,array('empno'=>4321,'ename'=>'John')); - // prepare not quite ready for prime time - //$rs = $db->Execute($stmt,array('empno'=>3775,'ename'=>'John')); - if (!$rs) die("Empty RS"); -} - -if (0) { - $db = ADONewConnection('odbc_oracle'); - if (!$db->PConnect('local_oracle','scott','tiger')) die('fail connect'); - $db->debug = true; - $rs = &$db->Execute( - 'select * from adoxyz where firstname=? and trim(lastname)=?', - array('first'=>'Caroline','last'=>'Miranda')); - if (!$rs) die("Empty RS"); - if ($rs->EOF) die("EOF RS"); - rs2html($rs); -} + + +PConnect('','scott','natsoft'); + if (!empty($testblob)) { + $varHoldingBlob = 'ABC DEF GEF John TEST'; + $num = time()%10240; + // create table atable (id integer, ablob blob); + $db->Execute('insert into ATABLE (id,ablob) values('.$num.',empty_blob())'); + $db->UpdateBlob('ATABLE', 'ablob', $varHoldingBlob, 'id='.$num, 'BLOB'); + + $rs = &$db->Execute('select * from atable'); + + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); + } + $stmt = $db->Prepare('select * from adoxyz where id=?'); + for ($i = 1; $i <= 10; $i++) { + $rs = &$db->Execute( + $stmt, + array($i)); + + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); + } +} +if (1) { + $db = ADONewConnection('oci8'); + $db->PConnect('','scott','tiger'); + $db->debug = true; + $db->Execute("delete from emp where ename='John'"); + print $db->Affected_Rows().'
'; + $stmt = &$db->Prepare('insert into emp (empno, ename) values (:empno, :ename)'); + $rs = $db->Execute($stmt,array('empno'=>4321,'ename'=>'John')); + // prepare not quite ready for prime time + //$rs = $db->Execute($stmt,array('empno'=>3775,'ename'=>'John')); + if (!$rs) die("Empty RS"); +} + +if (0) { + $db = ADONewConnection('odbc_oracle'); + if (!$db->PConnect('local_oracle','scott','tiger')) die('fail connect'); + $db->debug = true; + $rs = &$db->Execute( + 'select * from adoxyz where firstname=? and trim(lastname)=?', + array('first'=>'Caroline','last'=>'Miranda')); + if (!$rs) die("Empty RS"); + if ($rs->EOF) die("EOF RS"); + rs2html($rs); +} ?> \ No newline at end of file diff --git a/lib/adodb/tests/testoci8cursor.php b/lib/adodb/tests/testoci8cursor.php index a80fc9b939..c872048862 100644 --- a/lib/adodb/tests/testoci8cursor.php +++ b/lib/adodb/tests/testoci8cursor.php @@ -1,115 +1,111 @@ -PConnect('','scott','natsoft'); - $db->debug = 99; - - -/* -*/ - - define('MYNUM',5); - - - - $stmt = $db->Prepare("BEGIN adodb.open_tab(:RS,'A%'); END;"); - $db->InParameter($stmt, $cur, 'RS', -1, OCI_B_CURSOR); - $rs = $db->Execute($stmt); - - if ($rs && !$rs->EOF) { - print "Test 1 RowCount: ".$rs->RecordCount().""; - } else { - print "Error in using Cursor Variables 1
"; - } - - - print "
Testing Stored Procedures for oci8
"; - - $stid = $db->PrepareSP('BEGIN adodb.myproc('.MYNUM.', :myov); END;'); - $db->OutParameter($stid, $myov, 'myov'); - $db->Execute($stid); - if ($myov != MYNUM) print "Error with myproc
"; - - - $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;",true); - $a1 = 'Malaysia'; - //$a2 = ''; # a2 doesn't even need to be defined! - $db->InParameter($stmt,$a1,'a1'); - $db->OutParameter($stmt,$a2,'a2'); - $rs = $db->Execute($stmt); - if ($rs) { - if ($a2 !== 'Cinta Hati Malaysia') print "Stored Procedure Error: a2 = $a2"; - else echo "OK: a2=$a2
"; - } else { - print "Error in using Stored Procedure IN/Out Variables
"; - } - - - $tname = 'A%'; - - $stmt = $db->PrepareSP('select * from tab where tname like :tablename'); - $db->Parameter($stmt,$tname,'tablename'); - $rs = $db->Execute($stmt); - rs2html($rs); - - +PConnect('','scott','natsoft'); + $db->debug = 99; + + +/* +*/ + + define('MYNUM',5); + + + $rs = $db->ExecuteCursor("BEGIN adodb.open_tab(:RS,'A%'); END;"); + + if ($rs && !$rs->EOF) { + print "Test 1 RowCount: ".$rs->RecordCount()."
"; + } else { + print "Error in using Cursor Variables 1
"; + } + + print "
Testing Stored Procedures for oci8
"; + + $stid = $db->PrepareSP('BEGIN adodb.myproc('.MYNUM.', :myov); END;'); + $db->OutParameter($stid, $myov, 'myov'); + $db->Execute($stid); + if ($myov != MYNUM) print "Error with myproc
"; + + + $stmt = $db->PrepareSP("BEGIN adodb.data_out(:a1, :a2); END;",true); + $a1 = 'Malaysia'; + //$a2 = ''; # a2 doesn't even need to be defined! + $db->InParameter($stmt,$a1,'a1'); + $db->OutParameter($stmt,$a2,'a2'); + $rs = $db->Execute($stmt); + if ($rs) { + if ($a2 !== 'Cinta Hati Malaysia') print "Stored Procedure Error: a2 = $a2"; + else echo "OK: a2=$a2
"; + } else { + print "Error in using Stored Procedure IN/Out Variables
"; + } + + + $tname = 'A%'; + + $stmt = $db->PrepareSP('select * from tab where tname like :tablename'); + $db->Parameter($stmt,$tname,'tablename'); + $rs = $db->Execute($stmt); + rs2html($rs); + + ?> \ No newline at end of file diff --git a/lib/adodb/tests/testpaging.php b/lib/adodb/tests/testpaging.php index 89c9594649..b95fd005e6 100644 --- a/lib/adodb/tests/testpaging.php +++ b/lib/adodb/tests/testpaging.php @@ -1,83 +1,83 @@ -PConnect('localhost','tester','test','test'); -} - -if ($driver == 'access') { - $db = NewADOConnection('access'); - $db->PConnect("nwind", "", "", ""); -} - -if ($driver == 'ibase') { - $db = NewADOConnection('ibase'); - $db->PConnect("localhost:e:\\firebird\\examples\\employee.gdb", "sysdba", "masterkey", ""); - $sql = 'select distinct firstname, lastname from adoxyz order by firstname'; - -} -if ($driver == 'mssql') { - $db = NewADOConnection('mssql'); - $db->Connect('JAGUAR\vsdotnet','adodb','natsoft','northwind'); -} -if ($driver == 'oci8') { - $db = NewADOConnection('oci8'); - $db->Connect('','scott','natsoft'); -} - -if ($driver == 'access') { - $db = NewADOConnection('access'); - $db->Connect('nwind'); -} - -if (empty($driver) or $driver == 'mysql') { - $db = NewADOConnection('mysql'); - $db->Connect('localhost','root','','xphplens'); -} - -//$db->pageExecuteCountRows = false; - -$db->debug = true; - -if (0) { -$rs = &$db->Execute($sql); -include_once('../toexport.inc.php'); -print "
"; -print rs2csv($rs); # return a string - -print '"; -} - -$pager = new ADODB_Pager($db,$sql); -$pager->showPageLinks = true; -$pager->linksPerPage = 3; -$pager->cache = 60; -$pager->Render($rows=7); +PConnect('localhost','tester','test','test'); +} + +if ($driver == 'access') { + $db = NewADOConnection('access'); + $db->PConnect("nwind", "", "", ""); +} + +if ($driver == 'ibase') { + $db = NewADOConnection('ibase'); + $db->PConnect("localhost:e:\\firebird\\examples\\employee.gdb", "sysdba", "masterkey", ""); + $sql = 'select distinct firstname, lastname from adoxyz order by firstname'; + +} +if ($driver == 'mssql') { + $db = NewADOConnection('mssql'); + $db->Connect('JAGUAR\vsdotnet','adodb','natsoft','northwind'); +} +if ($driver == 'oci8') { + $db = NewADOConnection('oci8'); + $db->Connect('','scott','natsoft'); +} + +if ($driver == 'access') { + $db = NewADOConnection('access'); + $db->Connect('nwind'); +} + +if (empty($driver) or $driver == 'mysql') { + $db = NewADOConnection('mysql'); + $db->Connect('localhost','root','','xphplens'); +} + +//$db->pageExecuteCountRows = false; + +$db->debug = true; + +if (0) { +$rs = &$db->Execute($sql); +include_once('../toexport.inc.php'); +print "
'; -$rs->MoveFirst(); # note, some databases do not support MoveFirst -print rs2tab($rs); # return a string - -print '
'; -$rs->MoveFirst(); -rs2tabout($rs); # send to stdout directly -print ""; +print rs2csv($rs); # return a string + +print '"; +} + +$pager = new ADODB_Pager($db,$sql); +$pager->showPageLinks = true; +$pager->linksPerPage = 3; +$pager->cache = 60; +$pager->Render($rows=7); ?> \ No newline at end of file diff --git a/lib/adodb/tests/testpear.php b/lib/adodb/tests/testpear.php index 05ef8ca871..2ad82c999f 100644 --- a/lib/adodb/tests/testpear.php +++ b/lib/adodb/tests/testpear.php @@ -1,34 +1,34 @@ -setFetchMode(ADODB_FETCH_ASSOC); -$rs = $db->Query('select firstname,lastname from adoxyz'); -$cnt = 0; -while ($arr = $rs->FetchRow()) { - print_r($arr); - print "
'; +$rs->MoveFirst(); # note, some databases do not support MoveFirst +print rs2tab($rs); # return a string + +print '
'; +$rs->MoveFirst(); +rs2tabout($rs); # send to stdout directly +print "
"; - $cnt += 1; -} - -if ($cnt != 50) print "Error in \$cnt = $cnt"; +setFetchMode(ADODB_FETCH_ASSOC); +$rs = $db->Query('select firstname,lastname from adoxyz'); +$cnt = 0; +while ($arr = $rs->FetchRow()) { + print_r($arr); + print "
"; + $cnt += 1; +} + +if ($cnt != 50) print "Error in \$cnt = $cnt"; ?> \ No newline at end of file diff --git a/lib/adodb/tests/testsessions.php b/lib/adodb/tests/testsessions.php index 691aa5f988..8854d634a0 100644 --- a/lib/adodb/tests/testsessions.php +++ b/lib/adodb/tests/testsessions.php @@ -1,66 +1,66 @@ -Notify Expiring=$ref, sessionkey=$key"; -} - -//------------------------------------------------------------------- - - -#### CONNECTION - $ADODB_SESSION_DRIVER='oci8'; - $ADODB_SESSION_CONNECT=''; - $ADODB_SESSION_USER ='scott'; - $ADODB_SESSION_PWD ='natsoft'; - $ADODB_SESSION_DB =''; - - -### TURN DEBUGGING ON - $ADODB_SESS_DEBUG = true; - - -#### SETUP NOTIFICATION - $USER = 'JLIM'.rand(); - $ADODB_SESSION_EXPIRE_NOTIFY = array('USER','NotifyExpire'); - - -#### INIT - ob_start(); - error_reporting(E_ALL); - include('../session/adodb-cryptsession.php'); - session_start(); - - -### SETUP SESSION VARIABLES - $HTTP_SESSION_VARS['MONKEY'] = array('1','abc',44.41); - if (!isset($HTTP_GET_VARS['nochange'])) @$HTTP_SESSION_VARS['AVAR'] += 1; - - -### START DISPLAY - print "PHP ".PHP_VERSION."
"; - print "\$HTTP_SESSION_VARS['AVAR']={$HTTP_SESSION_VARS['AVAR']}
"; - - print "
Cookies: "; - print_r($HTTP_COOKIE_VARS); - -### RANDOMLY PERFORM Garbage Collection - if (rand() % 10 == 0) { - - print "Garbage Collection
"; - adodb_sess_gc(10); - - print "Random session destroy
"; - session_destroy(); - } +Notify Expiring=$ref, sessionkey=$key"; +} + +//------------------------------------------------------------------- + + +#### CONNECTION + $ADODB_SESSION_DRIVER='oci8'; + $ADODB_SESSION_CONNECT=''; + $ADODB_SESSION_USER ='scott'; + $ADODB_SESSION_PWD ='natsoft'; + $ADODB_SESSION_DB =''; + + +### TURN DEBUGGING ON + $ADODB_SESS_DEBUG = true; + + +#### SETUP NOTIFICATION + $USER = 'JLIM'.rand(); + $ADODB_SESSION_EXPIRE_NOTIFY = array('USER','NotifyExpire'); + + +#### INIT + ob_start(); + error_reporting(E_ALL); + include('../session/adodb-cryptsession.php'); + session_start(); + + +### SETUP SESSION VARIABLES + $HTTP_SESSION_VARS['MONKEY'] = array('1','abc',44.41); + if (!isset($HTTP_GET_VARS['nochange'])) @$HTTP_SESSION_VARS['AVAR'] += 1; + + +### START DISPLAY + print "PHP ".PHP_VERSION."
"; + print "\$HTTP_SESSION_VARS['AVAR']={$HTTP_SESSION_VARS['AVAR']}
"; + + print "
Cookies: "; + print_r($HTTP_COOKIE_VARS); + +### RANDOMLY PERFORM Garbage Collection + if (rand() % 10 == 0) { + + print "Garbage Collection
"; + adodb_sess_gc(10); + + print "Random session destroy
"; + session_destroy(); + } ?> \ No newline at end of file diff --git a/lib/adodb/toexport.inc.php b/lib/adodb/toexport.inc.php index 80c9e2af3a..db84eae26c 100644 --- a/lib/adodb/toexport.inc.php +++ b/lib/adodb/toexport.inc.php @@ -1,131 +1,131 @@ -FieldTypesArray(); - reset($fieldTypes); - while(list(,$o) = each($fieldTypes)) { - - $v = $o->name; - if ($escquote) $v = str_replace($quote,$escquotequote,$v); - $v = strip_tags(str_replace("\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))); - $elements[] = $v; - - } - $s .= implode($sep, $elements).$NEWLINE; - } - $hasNumIndex = isset($rs->fields[0]); - - $line = 0; - $max = $rs->FieldCount(); - - while (!$rs->EOF) { - $elements = array(); - $i = 0; - - if ($hasNumIndex) { - for ($j=0; $j < $max; $j++) { - $v = trim($rs->fields[$j]); - if ($escquote) $v = str_replace($quote,$escquotequote,$v); - $v = strip_tags(str_replace("\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))); - - if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; - else $elements[] = $v; - } - } else { // ASSOCIATIVE ARRAY - foreach($rs->fields as $v) { - if ($escquote) $v = str_replace($quote,$escquotequote,trim($v)); - $v = strip_tags(str_replace("\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))); - - if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; - else $elements[] = $v; - } - } - $s .= implode($sep, $elements).$NEWLINE; - $rs->MoveNext(); - $line += 1; - if ($fp && ($line % $BUFLINES) == 0) { - if ($fp === true) echo $s; - else fwrite($fp,$s); - $s = ''; - } - } - - if ($fp) { - if ($fp === true) echo $s; - else fwrite($fp,$s); - $s = ''; - } - - return $s; -} +FieldTypesArray(); + reset($fieldTypes); + while(list(,$o) = each($fieldTypes)) { + + $v = $o->name; + if ($escquote) $v = str_replace($quote,$escquotequote,$v); + $v = strip_tags(str_replace("\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))); + $elements[] = $v; + + } + $s .= implode($sep, $elements).$NEWLINE; + } + $hasNumIndex = isset($rs->fields[0]); + + $line = 0; + $max = $rs->FieldCount(); + + while (!$rs->EOF) { + $elements = array(); + $i = 0; + + if ($hasNumIndex) { + for ($j=0; $j < $max; $j++) { + $v = trim($rs->fields[$j]); + if ($escquote) $v = str_replace($quote,$escquotequote,$v); + $v = strip_tags(str_replace("\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))); + + if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; + else $elements[] = $v; + } + } else { // ASSOCIATIVE ARRAY + foreach($rs->fields as $v) { + if ($escquote) $v = str_replace($quote,$escquotequote,trim($v)); + $v = strip_tags(str_replace("\n",$replaceNewLine,str_replace($sep,$sepreplace,$v))); + + if (strpos($v,$sep) !== false || strpos($v,$quote) !== false) $elements[] = "$quote$v$quote"; + else $elements[] = $v; + } + } + $s .= implode($sep, $elements).$NEWLINE; + $rs->MoveNext(); + $line += 1; + if ($fp && ($line % $BUFLINES) == 0) { + if ($fp === true) echo $s; + else fwrite($fp,$s); + $s = ''; + } + } + + if ($fp) { + if ($fp === true) echo $s; + else fwrite($fp,$s); + $s = ''; + } + + return $s; +} ?> \ No newline at end of file diff --git a/lib/adodb/tohtml.inc.php b/lib/adodb/tohtml.inc.php index dac81ddb75..f70018ae28 100644 --- a/lib/adodb/tohtml.inc.php +++ b/lib/adodb/tohtml.inc.php @@ -1,6 +1,6 @@ ".$rs->UserDate($v,"D d, M Y") ." \n"; + break; + } case 'T': $s .= "".$rs->UserTimeStamp($v,"D d, M Y, h:i:s") ." \n"; break; - case 'D': - $s .= "".$rs->UserDate($v,"D d, M Y") ." \n"; - break; case 'I': case 'N': $s .= "".stripslashes((trim($v))) ." \n"; break; + /* + case 'B': + if (substr($v,8,2)=="BM" ) $v = substr($v,8); + $mtime = substr(str_replace(' ','_',microtime()),2); + $tmpname = "tmp/".uniqid($mtime).getmypid(); + $fd = @fopen($tmpname,'a'); + @ftruncate($fd,0); + @fwrite($fd,$v); + @fclose($fd); + if (!function_exists ("mime_content_type")) { + function mime_content_type ($file) { + return exec("file -bi ".escapeshellarg($file)); + } + } + $t = mime_content_type($tmpname); + $s .= (substr($t,0,5)=="image") ? "\\n" : " $t \\n"; + break; + */ + default: if ($htmlspecialchars) $v = htmlspecialchars(trim($v)); $v = trim($v); @@ -156,4 +178,4 @@ function arr2html(&$arr,$ztabhtml='',$zheaderarray='') print $s; } - +?> -- 2.39.5