ADOdb system extension updated to upstream 4.93. Added danish translation, thanks...
authorKarsten Dambekalns <karsten.dambekalns@typo3.org>
Fri, 13 Oct 2006 22:51:33 +0000 (22:51 +0000)
committerKarsten Dambekalns <karsten.dambekalns@typo3.org>
Fri, 13 Oct 2006 22:51:33 +0000 (22:51 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@1759 709f56b5-9817-0410-a4d7-c38de5d9e867

122 files changed:
ChangeLog
typo3/sysext/adodb/adodb/adodb-active-record.inc.php
typo3/sysext/adodb/adodb/adodb-csvlib.inc.php
typo3/sysext/adodb/adodb/adodb-datadict.inc.php
typo3/sysext/adodb/adodb/adodb-error.inc.php
typo3/sysext/adodb/adodb/adodb-errorhandler.inc.php
typo3/sysext/adodb/adodb/adodb-errorpear.inc.php
typo3/sysext/adodb/adodb/adodb-exceptions.inc.php
typo3/sysext/adodb/adodb/adodb-iterator.inc.php
typo3/sysext/adodb/adodb/adodb-lib.inc.php
typo3/sysext/adodb/adodb/adodb-memcache.lib.inc.php [new file with mode: 0644]
typo3/sysext/adodb/adodb/adodb-pager.inc.php
typo3/sysext/adodb/adodb/adodb-pear.inc.php
typo3/sysext/adodb/adodb/adodb-perf.inc.php
typo3/sysext/adodb/adodb/adodb-php4.inc.php
typo3/sysext/adodb/adodb/adodb-xmlschema03.inc.php
typo3/sysext/adodb/adodb/adodb.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-access.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-db2.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-firebird.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-generic.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-ibase.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-informix.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-mssql.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-mysql.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-oci8.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-postgres.inc.php
typo3/sysext/adodb/adodb/datadict/datadict-sybase.inc.php
typo3/sysext/adodb/adodb/docs/docs-active-record.htm
typo3/sysext/adodb/adodb/docs/docs-adodb.htm
typo3/sysext/adodb/adodb/docs/docs-datadict.htm
typo3/sysext/adodb/adodb/docs/docs-perf.htm
typo3/sysext/adodb/adodb/docs/docs-session.htm
typo3/sysext/adodb/adodb/docs/docs-session.old.htm [new file with mode: 0644]
typo3/sysext/adodb/adodb/docs/tips_portable_sql.htm
typo3/sysext/adodb/adodb/drivers/adodb-access.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-ado.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-ado5.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-ado_access.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-ado_mssql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-borland_ibase.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-csv.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-db2.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-fbsql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-firebird.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-ibase.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-informix.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-informix72.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-ldap.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-mssql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-mssqlpo.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-mysql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-mysqli.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-mysqlt.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-netezza.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-oci8.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-oci805.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-oci8po.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-odbc.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-odbc_db2.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-odbc_mssql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-odbc_oracle.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-odbtp.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-odbtp_unicode.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-oracle.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-pdo.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-pdo_mssql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-pdo_mysql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-pdo_oci.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-pdo_pgsql.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-postgres.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-postgres64.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-postgres7.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-postgres8.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-proxy.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-sapdb.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-sqlanywhere.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-sqlite.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-sqlitepo.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-sybase.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-sybase_ase.inc.php
typo3/sysext/adodb/adodb/drivers/adodb-vfp.inc.php
typo3/sysext/adodb/adodb/perf/perf-db2.inc.php
typo3/sysext/adodb/adodb/perf/perf-informix.inc.php
typo3/sysext/adodb/adodb/perf/perf-mssql.inc.php
typo3/sysext/adodb/adodb/perf/perf-mysql.inc.php
typo3/sysext/adodb/adodb/perf/perf-oci8.inc.php
typo3/sysext/adodb/adodb/perf/perf-postgres.inc.php
typo3/sysext/adodb/adodb/pivottable.inc.php
typo3/sysext/adodb/adodb/rsfilter.inc.php
typo3/sysext/adodb/adodb/server.php
typo3/sysext/adodb/adodb/session/adodb-compress-bzip2.php
typo3/sysext/adodb/adodb/session/adodb-compress-gzip.php
typo3/sysext/adodb/adodb/session/adodb-cryptsession.php
typo3/sysext/adodb/adodb/session/adodb-cryptsession2.php [new file with mode: 0644]
typo3/sysext/adodb/adodb/session/adodb-encrypt-mcrypt.php
typo3/sysext/adodb/adodb/session/adodb-encrypt-md5.php
typo3/sysext/adodb/adodb/session/adodb-encrypt-secret.php
typo3/sysext/adodb/adodb/session/adodb-session-clob.php
typo3/sysext/adodb/adodb/session/adodb-session-clob2.php [new file with mode: 0644]
typo3/sysext/adodb/adodb/session/adodb-session.php
typo3/sysext/adodb/adodb/session/adodb-session2.php [new file with mode: 0644]
typo3/sysext/adodb/adodb/session/old/adodb-cryptsession.php
typo3/sysext/adodb/adodb/session/old/adodb-session-clob.php
typo3/sysext/adodb/adodb/session/old/adodb-session.php
typo3/sysext/adodb/adodb/session/session_schema2.xml [new file with mode: 0644]
typo3/sysext/adodb/adodb/tests/test-active-record.php
typo3/sysext/adodb/adodb/tests/test-xmlschema.php
typo3/sysext/adodb/adodb/tests/test.php
typo3/sysext/adodb/adodb/tests/test4.php
typo3/sysext/adodb/adodb/tests/testdatabases.inc.php
typo3/sysext/adodb/adodb/tests/testsessions.php
typo3/sysext/adodb/adodb/tests/xmlschema-mssql.xml
typo3/sysext/adodb/adodb/tests/xmlschema.xml
typo3/sysext/adodb/adodb/toexport.inc.php
typo3/sysext/adodb/adodb/tohtml.inc.php
typo3/sysext/adodb/doc/490.DBAL.patch [deleted file]
typo3/sysext/adodb/doc/493.DBAL.patch [new file with mode: 0644]
typo3/sysext/adodb/doc/README
typo3/sysext/adodb/ext_emconf.php
typo3/sysext/adodb/locallang_datasource_config.xml
typo3/sysext/adodb/locallang_wizard.xml

index f1782ed..d10d65d 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2006-10-24  Karsten Dambekalns  <karsten@typo3.org>
+
+       * ADOdb system extension updated to upstream 4.93. Added danish translation, thanks to Peter Klein!
 
 2006-10-12  Martin Kutschker  <martin.t.kutschker@blackbox.net>
 
index 40e3708..fb23951 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
 
-@version V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+@version V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Latest version is available at http://adodb.sourceforge.net
  
   Released under both BSD license and Lesser GPL library license. 
@@ -41,7 +41,12 @@ function ADODB_SetDatabaseAdapter(&$db)
        global $_ADODB_ACTIVE_DBS;
        
                foreach($_ADODB_ACTIVE_DBS as $k => $d) {
-                       if ($d->db == $db) return $k;
+                       if (PHP_VERSION >= 5) {
+                               if ($d->db == $db) return $k;
+                       } else {
+                               if ($d->db->_connectionID == $db->_connectionID && $db->database == $d->db->database) 
+                                       return $k;
+                       }
                }
                
                $obj = new ADODB_Active_DB();
@@ -102,6 +107,12 @@ class ADODB_Active_Record {
                $this->UpdateActiveTable($pkeyarr);
        }
        
+       function __wakeup()
+       {
+               $class = get_class($this);
+               new $class;
+       }
+       
        function _pluralize($table)
        {
                $ut = strtoupper($table);
@@ -212,12 +223,12 @@ class ADODB_Active_Record {
                        break;
                default:
                        foreach($cols as $name => $fldobj) {
-                               $name = ($name);
+                               $name = ($fldobj->$name);
                                $this->$name = null;
                                $attr[$name] = $fldobj;
                        }
                        foreach($pkeys as $k => $name) {
-                               $keys[$name] = ($name);
+                               $keys[$name] = $cols[$name]->name;
                        }
                        break;
                }
@@ -408,23 +419,29 @@ class ADODB_Active_Record {
                $db =& $this->DB(); if (!$db) return false;
                $cnt = 0;
                $table =& $this->TableInfo();
+               
+               $valarr = array();
+               $names = array();
+               $valstr = array();
 
                foreach($table->flds as $name=>$fld) {
                        $val = $this->$name;
-                       /*
-                       if (is_null($val)) {
-                               if (isset($fld->not_null) && $fld->not_null) {
-                                       if (isset($fld->default_value) && strlen($fld->default_value)) continue;
-                                       else $this->Error("Cannot insert null into $name","Insert");
-                               }
-                       }*/
-                       
-                       $valarr[] = $val;
-                       $names[] = $name;
-                       $valstr[] = $db->Param($cnt);
-                       $cnt += 1;
+                       if(!is_null($val) || !array_key_exists($name, $table->keys)) {
+                               $valarr[] = $val;
+                               $names[] = $name;
+                               $valstr[] = $db->Param($cnt);
+                               $cnt += 1;
+                       }
                }
                
+               if (empty($names)){
+                       foreach($table->flds as $name=>$fld) {
+                               $valarr[] = null;
+                               $names[] = $name;
+                               $valstr[] = $db->Param($cnt);
+                               $cnt += 1;
+                       }
+               }
                $sql = 'INSERT INTO '.$this->_table."(".implode(',',$names).') VALUES ('.implode(',',$valstr).')';
                $ok = $db->Execute($sql,$valarr);
                
@@ -454,7 +471,9 @@ class ADODB_Active_Record {
                
                $where = $this->GenWhere($db,$table);
                $sql = 'DELETE FROM '.$this->_table.' WHERE '.$where;
-               $db->Execute($sql);
+               $ok = $db->Execute($sql);
+               
+               return $ok ? true : false;
        }
        
        // returns an array of active record objects
@@ -553,7 +572,6 @@ class ADODB_Active_Record {
                                continue;
                        }
                        
-                       
                        if (is_null($val)) {
                                if (isset($fld->not_null) && $fld->not_null) {
                                        if (isset($fld->default_value) && strlen($fld->default_value)) continue;
@@ -564,7 +582,7 @@ class ADODB_Active_Record {
                                }
                        }
                        
-                       if ( $val == $this->_original[$i]) {
+                       if (isset($this->_original[$i]) && $val == $this->_original[$i]) {
                                continue;
                        }                       
                        $valarr[] = $val;
index 77ad6f9..a031d98 100644 (file)
@@ -8,7 +8,7 @@ $ADODB_INCLUDED_CSV = 1;
 
 /* 
 
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index 7165392..edfa5a6 100644 (file)
@@ -1,15 +1,15 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
-  Released under both BSD license and Lesser GPL library license.
-  Whenever there is any discrepancy between the two licenses,
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  Released under both BSD license and Lesser GPL library license. 
+  Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
-
+       
   Set tabs to 4 for best viewing.
-
        DOCUMENTATION:
-
+       
                See adodb/tests/test-datadict.php for docs and examples.
 */
 
@@ -42,13 +42,13 @@ if (!function_exists('ctype_alnum')) {
 /**
        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
+       @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='_.-')
@@ -62,7 +62,7 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
        $max = strlen($args);
        $quoted = false;
        $tokarr = array();
-
+       
        while ($pos < $max) {
                $ch = substr($args,$pos,1);
                switch($ch) {
@@ -77,17 +77,17 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
                                }
                                break;
                        }
-
+                       
                        $tokarr[] = $ch;
                        break;
-
+               
                case '`':
                        if ($intoken) $tokarr[] = $ch;
                case '(':
-               case ')':
+               case ')':       
                case '"':
                case "'":
-
+                       
                        if ($intoken) {
                                if (empty($endquote)) {
                                        $tokens[$stmtno][] = implode('',$tokarr);
@@ -109,9 +109,9 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
                                        }
                                } else
                                        $tokarr[] = $ch;
-
+                                       
                        }else {
-
+                       
                                if ($ch == '(') $endquote = ')';
                                else $endquote = $ch;
                                $quoted = true;
@@ -120,27 +120,27 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
                                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) {
+                               if ($ch == $endstmtchar) {                      
                                        $tokens[$stmtno][] = implode('',$tokarr);
                                        $stmtno += 1;
                                        $tokens[$stmtno] = array();
@@ -156,7 +156,7 @@ function Lens_ParseArgs($args,$endstmtchar=',',$tokenchars='_.-')
                $pos += 1;
        }
        if ($intoken) $tokens[$stmtno][] = implode('',$tokarr);
-
+       
        return $tokens;
 }
 
@@ -165,7 +165,7 @@ class ADODB_DataDict {
        var $connection;
        var $debug = false;
        var $dropTable = 'DROP TABLE %s';
-       var $renameTable = 'RENAME TABLE %s TO %s';
+       var $renameTable = 'RENAME TABLE %s TO %s'; 
        var $dropIndex = 'DROP INDEX %s';
        var $addCol = ' ADD';
        var $alterCol = ' ALTER COLUMN';
@@ -180,75 +180,75 @@ class ADODB_DataDict {
        var $invalidResizeTypes4 = array('CLOB','BLOB','TEXT','DATE','TIME'); // for changetablesql
        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()
        {
                if (!$this->connection->IsConnected()) return array();
                return $this->connection->MetaTables();
        }
-
+       
        function MetaColumns($tab, $upper=true, $schema=false)
        {
                if (!$this->connection->IsConnected()) return array();
                return $this->connection->MetaColumns($this->TableName($tab), $upper, $schema);
        }
-
+       
        function MetaPrimaryKeys($tab,$owner=false,$intkey=false)
        {
                if (!$this->connection->IsConnected()) return array();
                return $this->connection->MetaPrimaryKeys($this->TableName($tab), $owner, $intkey);
        }
-
+       
        function MetaIndexes($table, $primary = false, $owner = false)
        {
                if (!$this->connection->IsConnected()) return array();
                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,$allowBrackets=false)
        {
                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
                $regex = ($allowBrackets) ? $this->nameRegexBrackets : $this->nameRegex;
-
+               
                if ( !preg_match('/^[' . $regex . ']+$/', $name) ) {
                        return $quote . $name . $quote;
                }
-
+               
                return $name;
        }
-
+       
        function TableName($name)
        {
                if ( $this->schema ) {
@@ -256,7 +256,7 @@ class ADODB_DataDict {
                }
                return $this->NameQuote($name);
        }
-
+       
        // Executes the sql array returned by GetTableSQL and GetIndexSQL
        function ExecuteSQLArray($sql, $continueOnError = true)
        {
@@ -264,7 +264,7 @@ class ADODB_DataDict {
                $conn = &$this->connection;
                $saved = $conn->debug;
                foreach($sql as $line) {
-
+                       
                        if ($this->debug) $conn->debug = true;
                        $ok = $conn->Execute($line);
                        $conn->debug = $saved;
@@ -276,43 +276,43 @@ class ADODB_DataDict {
                }
                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
+               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.
        */
@@ -321,25 +321,25 @@ class ADODB_DataDict {
                if (!is_array($flds)) {
                        $flds = explode(',',$flds);
                }
-
+               
                foreach($flds as $key => $fld) {
                        # some indexes can use partial fields, eg. index first 32 chars of "name" with NAME(32)
                        $flds[$key] = $this->NameQuote($fld,$allowBrackets=true);
                }
-
+               
                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);
@@ -351,7 +351,7 @@ class ADODB_DataDict {
                }
                return $sql;
        }
-
+       
        /**
         * Change the definition of one column
         *
@@ -374,7 +374,7 @@ class ADODB_DataDict {
                }
                return $sql;
        }
-
+       
        /**
         * Rename one column
         *
@@ -395,7 +395,7 @@ class ADODB_DataDict {
                }
                return array(sprintf($this->renameColumn,$tabname,$this->NameQuote($oldcolumn),$this->NameQuote($newcolumn),$column_def));
        }
-
+               
        /**
         * Drop one column
         *
@@ -418,36 +418,36 @@ class ADODB_DataDict {
                }
                return $sql;
        }
-
+       
        function DropTableSQL($tabname)
        {
                return array (sprintf($this->dropTable, $this->TableName($tabname)));
        }
-
+       
        function RenameTableSQL($tabname,$newname)
        {
                return array (sprintf($this->renameTable, $this->TableName($tabname),$this->TableName($newname)));
-       }
-
+       }       
+       
        /*
         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, true);
-
+               
                $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,$widespacing=false)
        {
                if (is_string($flds)) {
@@ -461,7 +461,7 @@ class ADODB_DataDict {
                                foreach($f0 as $token) {
                                        switch (strtoupper($token)) {
                                        case 'CONSTRAINT':
-                                       case 'DEFAULT':
+                                       case 'DEFAULT': 
                                                $hasparam = $token;
                                                break;
                                        default:
@@ -472,7 +472,7 @@ class ADODB_DataDict {
                                        }
                                }
                                $flds[] = $f1;
-
+                               
                        }
                }
                $this->autoIncrement = false;
@@ -480,7 +480,7 @@ class ADODB_DataDict {
                $pkey = array();
                foreach($flds as $fld) {
                        $fld = _array_change_key_case($fld);
-
+               
                        $fname = false;
                        $fdefault = false;
                        $fautoinc = false;
@@ -494,20 +494,20 @@ class ADODB_DataDict {
                        $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':
+                               
+                               case 'SIZE':    
                                                                $dotat = strpos($v,'.'); if ($dotat === false) $dotat = strpos($v,',');
                                                                if ($dotat === false) $fsize = $v;
                                                                else {
@@ -529,33 +529,33 @@ class ADODB_DataDict {
                                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) {
@@ -571,20 +571,20 @@ class ADODB_DataDict {
                                        $fdefault = $this->connection->sysDate;
                                }
                        } else if ($fdefault !== false && !$fnoquote)
-                               if ($ty == 'C' or $ty == 'X' or
+                               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) == ' ')
+                                       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);
-
+                       
                        if ($widespacing) $fname = str_pad($fname,24);
                        $lines[$fid] = $fname.' '.$ftype.$suffix;
-
+                       
                        if ($fautoinc) $this->autoIncrement = true;
                } // foreach $flds
-
+               
                return array($lines,$pkey);
        }
        /*
@@ -601,56 +601,56 @@ class ADODB_DataDict {
                }
                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) {
@@ -667,19 +667,19 @@ class ADODB_DataDict {
                        $s .= ",\n                 PRIMARY KEY (";
                        $s .= implode(", ",$pkey).")";
                }
-               if (isset($tableoptions['CONSTRAINTS']))
+               if (isset($tableoptions['CONSTRAINTS'])) 
                        $s .= "\n".$tableoptions['CONSTRAINTS'];
-
-               if (isset($tableoptions[$this->upperName.'_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
@@ -688,7 +688,7 @@ class ADODB_DataDict {
        {
                return array();
        }
-
+       
        /*
                Sanitize options, so that array elements with no keys are promoted to keys
        */
@@ -702,34 +702,34 @@ class ADODB_DataDict {
                }
                return $newopts;
        }
-
+       
        /*
        "Florian Buzin [ easywe ]" <florian.buzin#easywe.de>
-
+       
        This function changes/adds new fields to your table. You don't
        have to know if the col is new or not. It will check on its own.
        */
        function ChangeTableSQL($tablename, $flds, $tableoptions = false)
        {
        global $ADODB_FETCH_MODE;
-
+       
                $save = $ADODB_FETCH_MODE;
                $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
                if ($this->connection->fetchMode !== false) $savem = $this->connection->SetFetchMode(false);
-
+               
                // check table exists
                $save_handler = $this->connection->raiseErrorFn;
                $this->connection->raiseErrorFn = '';
                $cols = $this->MetaColumns($tablename);
                $this->connection->raiseErrorFn = $save_handler;
-
+               
                if (isset($savem)) $this->connection->SetFetchMode($savem);
                $ADODB_FETCH_MODE = $save;
-
-               if ( empty($cols)) {
+               
+               if ( empty($cols)) { 
                        return $this->CreateTableSQL($tablename, $flds, $tableoptions);
                }
-
+               
                if (is_array($flds)) {
                // Cycle through the update fields, comparing
                // existing fields to fields to update.
@@ -753,11 +753,11 @@ class ADODB_DataDict {
                                        }
                                } else {
                                        $holdflds[$k] = $v;
-                               }
+                               }               
                        }
                        $flds = $holdflds;
                }
-
+       
 
                // already exists, alter table instead
                list($lines,$pkey) = $this->_GenFields($flds);
@@ -766,18 +766,18 @@ class ADODB_DataDict {
 
                foreach ( $lines as $id => $v ) {
                        if ( isset($cols[$id]) && is_object($cols[$id]) ) {
-
+                       
                                $flds = Lens_ParseArgs($v,',');
-
+                               
                                //  We are trying to change the size of the field, if not allowed, simply ignore the request.
-                               if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) continue;
-
+                               if ($flds && in_array(strtoupper(substr($flds[0][1],0,4)),$this->invalidResizeTypes4)) continue;         
+                       
                                $sql[] = $alter . $this->alterCol . ' ' . $v;
                        } else {
                                $sql[] = $alter . $this->addCol . ' ' . $v;
                        }
                }
-
+               
                return $sql;
        }
 } // class
index 74d028f..8c959dc 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /** 
- * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license. 
  * Whenever there is any discrepancy between the two licenses, 
  * the BSD license will take precedence. 
index 60e140f..6b85211 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @version V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license.
  * Whenever there is any discrepancy between the two licenses,
  * the BSD license will take precedence.
index 2c6c4ca..37d7bf1 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /** 
- * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index b53d00c..1f11e54 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * @version V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license.
  * Whenever there is any discrepancy between the two licenses,
  * the BSD license will take precedence.
index d90cf98..031c963 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index db3606f..0f034bd 100644 (file)
@@ -7,7 +7,7 @@ global $ADODB_INCLUDED_LIB;
 $ADODB_INCLUDED_LIB = 1;
 
 /* 
- @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim\@natsoft.com.my). All rights reserved.
+ @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim\@natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
@@ -16,6 +16,69 @@ $ADODB_INCLUDED_LIB = 1;
   Less commonly used functions are placed here to reduce size of adodb.inc.php. 
 */ 
 
+function adodb_probetypes(&$array,&$types,$probe=8)
+{
+// probe and guess the type
+       $types = array();
+       if ($probe > sizeof($array)) $max = sizeof($array);
+       else $max = $probe;
+       
+       
+       for ($j=0;$j < $max; $j++) {
+               $row =& $array[$j];
+               if (!$row) break;
+               $i = -1;
+               foreach($row as $v) {
+                       $i += 1;
+
+                       if (isset($types[$i]) && $types[$i]=='C') continue;
+                       
+                       //print " ($i ".$types[$i]. "$v) ";
+                       $v = trim($v);
+                       
+                       if (!preg_match('/^[+-]{0,1}[0-9\.]+$/',$v)) {
+                               $types[$i] = 'C'; // once C, always C
+                               
+                               continue;
+                       }
+                       if ($j == 0) { 
+                       // If empty string, we presume is character
+                       // test for integer for 1st row only
+                       // after that it is up to testing other rows to prove
+                       // that it is not an integer
+                               if (strlen($v) == 0) $types[$i] = 'C';
+                               if (strpos($v,'.') !== false) $types[$i] = 'N';
+                               else  $types[$i] = 'I';
+                               continue;
+                       }
+                       
+                       if (strpos($v,'.') !== false) $types[$i] = 'N';
+                       
+               }
+       }
+}
+
+function  &adodb_transpose(&$arr, &$newarr, &$hdr)
+{
+       $oldX = sizeof(reset($arr));
+       $oldY = sizeof($arr);   
+       
+       if ($hdr) {
+               $startx = 1;
+               $hdr = array();
+               for ($y = 0; $y < $oldY; $y++) {
+                       $hdr[] = $arr[$y][0];
+               }
+       } else
+               $startx = 0;
+
+       for ($x = $startx; $x < $oldX; $x++) {
+               $newarr[] = array();
+               for ($y = 0; $y < $oldY; $y++) {
+                       $newarr[$x-$startx][] = $arr[$y][$x];
+               }
+       }
+}
 
 // Force key to upper. 
 // See also http://www.php.net/manual/en/function.array-change-key-case.php
@@ -42,7 +105,7 @@ function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_
                        $keyCol = array($keyCol);
                }
                foreach($fieldArray as $k => $v) {
-                       if ($autoQuote && !is_numeric($v) and strncmp($v,"'",1) !== 0 and strcasecmp($v,'null')!=0) {
+                       if ($autoQuote && !is_numeric($v) and strncmp($v,"'",1) !== 0 and strcasecmp($v,$zthis->null2null)!=0) {
                                $v = $zthis->qstr($v);
                                $fieldArray[$k] = $v;
                        }
@@ -156,7 +219,7 @@ function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=f
                if ($fieldsize > 2) {
             $group = rtrim($zthis->fields[2]);
         }
+/* 
         if ($optgroup != $group) {
             $optgroup = $group;
             if ($firstgroup) {
@@ -167,7 +230,7 @@ function _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=f
                 $s .="\n<optgroup label='". htmlspecialchars($group) ."'>";
             }
                }
-       
+*/
                if ($hasvalue) 
                        $value = " value='".htmlspecialchars($zval2)."'";
                
@@ -297,14 +360,14 @@ function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
 {
        $qryRecs = 0;
        
-        if (preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || 
+        if (!empty($zthis->_nestedSQL) || preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || 
                preg_match('/\s+GROUP\s+BY\s+/is',$sql) || 
                preg_match('/\s+UNION\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 = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$sql);
                        
                        // Allow Oracle hints to be used for query optimization, Chris Wrye
                        if (preg_match('#/\\*+.*?\\*\\/#', $sql, $hint)) {
@@ -313,12 +376,8 @@ function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
                                $rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")"; 
                        
                } else if (strncmp($zthis->databaseType,'postgres',8) == 0)  {
-                       
-                       $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_";
-                       }
+                       $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
@@ -383,7 +442,6 @@ function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0)
                $rstest->Close();
                if ($qryRecs == -1) return 0;
        }
-       
        return $qryRecs;
 }
 
@@ -558,7 +616,7 @@ function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq
                 //********************************************************//
                 if (is_null($arrFields[$upperfname])
                                        || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
-                    || $arrFields[$upperfname] === 'null'
+                    || $arrFields[$upperfname] === $zthis->null2null
                     )
                 {
                     switch ($force) {
@@ -580,7 +638,7 @@ function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq
                                                default:
                         case 3:
                             //Set the value that was given in array, so you can give both null and empty values
-                            if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === 'null') {
+                            if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) {
                                 $setFields .= $field->name . " = null, ";
                             } else {
                                 $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq);
@@ -721,7 +779,7 @@ static $cacheCols;
             /********************************************************/
             if (is_null($arrFields[$upperfname])
                 || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
-                || $arrFields[$upperfname] === 'null'
+                || $arrFields[$upperfname] === $zthis->null2null
                                )
                {
                     switch ($force) {
@@ -743,7 +801,7 @@ static $cacheCols;
                                                default:
                         case 3:
                             //Set the value that was given in array, so you can give both null and empty values
-                                                       if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === 'null') { 
+                                                       if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) { 
                                                                $values  .= "null, ";
                                                        } else {
                                        $values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, $arrFields, $magicq);
diff --git a/typo3/sysext/adodb/adodb/adodb-memcache.lib.inc.php b/typo3/sysext/adodb/adodb/adodb-memcache.lib.inc.php
new file mode 100644 (file)
index 0000000..fc4748a
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+
+// security - hide paths
+if (!defined('ADODB_DIR')) die();
+
+global $ADODB_INCLUDED_MEMCACHE;
+$ADODB_INCLUDED_MEMCACHE = 1;
+
+/* 
+
+  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  Released under both BSD license and Lesser GPL library license. 
+  Whenever there is any discrepancy between the two licenses, 
+  the BSD license will take precedence. See License.txt. 
+  Set tabs to 4 for best viewing.
+  
+  Latest version is available at http://adodb.sourceforge.net
+  
+*/
+
+       function &getmemcache($key,&$err, $timeout=0, $host, $port)
+       {
+               $false = false;
+               $err = false;
+
+               if (!function_exists('memcache_pconnect')) {
+                       $err = 'Memcache module PECL extension not found!';
+                       return $false;
+               }
+
+               $memcache = new Memcache;
+               if (!@$memcache->pconnect($host, $port)) {
+                       $err = 'Can\'t connect to memcache server on: '.$host.':'.$port;
+                       return $false;
+               }
+
+               $rs = $memcache->get($key);
+               if (!$rs) {
+                       $err = 'Item with such key doesn\'t exists on the memcached server.';
+                       return $false;
+               }
+
+               $tdiff = intval($rs->timeCreated+$timeout - time());
+               if ($tdiff <= 2) {
+                       switch($tdiff) {
+                               case 2: 
+                                       if ((rand() & 15) == 0) {
+                                               $err = "Timeout 2";
+                                               return $false;
+                                       }
+                                       break;
+                               case 1:
+                                       if ((rand() & 3) == 0) {
+                                               $err = "Timeout 1";
+                                               return $false;
+                                       }
+                                       break;
+                               default: 
+                                       $err = "Timeout 0";
+                                       return $false;
+                       }
+               }
+               return $rs;
+       }
+
+       function putmemcache($key, $rs, $host, $port, $compress, $debug=false)
+       {
+               $false = false;
+               $true = true;
+
+               if (!function_exists('memcache_pconnect')) {
+                       if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!<br>\n");
+                       return $false;
+               }
+
+               $memcache = new Memcache;
+               if (!@$memcache->pconnect($host, $port)) {
+                       if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port<br>\n");
+                       return $false;
+               }
+
+               $rs->timeCreated = time();
+               if (!$memcache->set($key, $rs, $compress, 0)) {
+                       if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n");
+                       return $false;
+               }
+               return $true;
+       }
+
+       function flushmemcache($key=false, $host, $port, $debug=false)
+       {
+               if (!function_exists('memcache_pconnect')) {
+                       if ($debug) ADOConnection::outp(" Memcache module PECL extension not found!<br>\n");
+                       return;
+               }
+
+               $memcache = new Memcache;
+               if (!@$memcache->pconnect($host, $port)) {
+                       if ($debug) ADOConnection::outp(" Can't connect to memcache server on: $host:$port<br>\n");
+                       return;
+               }
+
+               if ($key) {
+                       if (!$memcache->delete($key)) {
+                               if ($debug) ADOConnection::outp("CacheFlush: $key entery doesn't exist on memcached server!<br>\n");
+                       } else {
+                               if ($debug) ADOConnection::outp("CacheFlush: $key entery flushed from memcached server!<br>\n");
+                       }
+               } else {
+                       if (!$memcache->flush()) {
+                               if ($debug) ADOConnection::outp("CacheFlush: Failure flushing all enteries from memcached server!<br>\n");
+                       } else {
+                               if ($debug) ADOConnection::outp("CacheFlush: All enteries flushed from memcached server!<br>\n");
+                       }
+               }
+               return;
+       }
+?>
index 270c3d8..0aa3e6a 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-       V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+       V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Released under both BSD license and Lesser GPL library license. 
          Whenever there is any discrepancy between the two licenses, 
          the BSD license will take precedence. 
index 2d36d68..e1d17b8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /** 
- * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license. 
  * Whenever there is any discrepancy between the two licenses, 
  * the BSD license will take precedence. 
index 7323788..a9093c4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
@@ -62,16 +62,28 @@ function adodb_microtime()
 }
 
 /* sql code timing */
-function& adodb_log_sql(&$conn,$sql,$inputarr)
+function& adodb_log_sql(&$connx,$sql,$inputarr)
 {
-       
     $perf_table = adodb_perf::table();
-       $conn->fnExecute = false;
+       $connx->fnExecute = false;
        $t0 = microtime();
-       $rs =& $conn->Execute($sql,$inputarr);
+       $rs =& $connx->Execute($sql,$inputarr);
        $t1 = microtime();
 
-       if (!empty($conn->_logsql)) {
+       if (!empty($connx->_logsql) && (empty($connx->_logsqlErrors) || !$rs)) {
+       global $ADODB_LOG_CONN;
+       
+               if (!empty($ADODB_LOG_CONN)) {
+                       $conn = &$ADODB_LOG_CONN;
+                       if ($conn->databaseType != $connx->databaseType)
+                               $prefix = '/*dbx='.$connx->databaseType .'*/ ';
+                       else
+                               $prefix = '';
+               } else {
+                       $conn =& $connx;
+                       $prefix = '';
+               }
+               
                $conn->_logsql = false; // disable logsql error simulation
                $dbT = $conn->databaseType;
                
@@ -84,8 +96,8 @@ function& adodb_log_sql(&$conn,$sql,$inputarr)
                $time = $a1 - $a0;
        
                if (!$rs) {
-                       $errM = $conn->ErrorMsg();
-                       $errN = $conn->ErrorNo();
+                       $errM = $connx->ErrorMsg();
+                       $errN = $connx->ErrorNo();
                        $conn->lastInsID = 0;
                        $tracer = substr('ERROR: '.htmlspecialchars($errM),0,250);
                } else {
@@ -126,6 +138,7 @@ function& adodb_log_sql(&$conn,$sql,$inputarr)
                }
                
                if (is_array($sql)) $sql = $sql[0];
+               if ($prefix) $sql = $prefix.$sql;
                $arr = array('b'=>strlen($sql).'.'.crc32($sql),
                                        'c'=>substr($sql,0,3900), 'd'=>$params,'e'=>$tracer,'f'=>adodb_round($time,6));
                //var_dump($arr);
@@ -136,7 +149,7 @@ function& adodb_log_sql(&$conn,$sql,$inputarr)
                if (empty($d)) $d = date("'Y-m-d H:i:s'");
                if ($conn->dataProvider == 'oci8' && $dbT != 'oci8po') {
                        $isql = "insert into $perf_table values($d,:b,:c,:d,:e,:f)";
-               } else if ($dbT == 'odbc_mssql' || $dbT == 'informix' || $dbT == 'odbtp') {
+               } else if ($dbT == 'odbc_mssql' || $dbT == 'informix' || strncmp($dbT,'odbtp',4)==0) {
                        $timer = $arr['f'];
                        if ($dbT == 'informix') $sql2 = substr($sql2,0,230);
 
@@ -149,9 +162,9 @@ function& adodb_log_sql(&$conn,$sql,$inputarr)
                        if ($dbT == 'informix') $isql = str_replace(chr(10),' ',$isql);
                        $arr = false;
                } else {
+                       if ($dbT == 'db2') $arr['f'] = (float) $arr['f'];
                        $isql = "insert into $perf_table (created,sql0,sql1,params,tracer,timer) values( $d,?,?,?,?,?)";
                }
-
                $ok = $conn->Execute($isql,$arr);
                $conn->debug = $saved;
                
@@ -177,10 +190,10 @@ function& adodb_log_sql(&$conn,$sql,$inputarr)
                                $conn->_logsql = false;
                        }
                }
-               $conn->_errorMsg = $errM;
-               $conn->_errorCode = $errN;
+               $connx->_errorMsg = $errM;
+               $connx->_errorCode = $errN;
        } 
-       $conn->fnExecute = 'adodb_log_sql';
+       $connx->fnExecute = 'adodb_log_sql';
        return $rs;
 }
 
@@ -862,7 +875,6 @@ Committed_AS:   348732 kB
                
                $table = $this->table();
                $sql = str_replace('adodb_logsql',$table,$this->createTableSQL);
-               
                $savelog = $this->conn->LogSQL(false);
                $ok = $this->conn->Execute($sql);
                $this->conn->LogSQL($savelog);
index 28e1c8f..a23dc17 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 233dfb7..cc98bec 100644 (file)
@@ -2092,16 +2092,20 @@ class adoSchema {
        * in the schema. 
        *
        * @param boolean $data Include data in schema dump
+       * @indent string indentation to use
+       * @prefix string extract only tables with given prefix
+       * @stripprefix strip prefix string when storing in XML schema
        * @return string Generated XML schema
        */
-       function ExtractSchema( $data = FALSE, $indent = '  ' ) {
+       function ExtractSchema( $data = FALSE, $indent = '  ', $prefix = '' , $stripprefix=false) {
                $old_mode = $this->db->SetFetchMode( ADODB_FETCH_NUM );
                
                $schema = '<?xml version="1.0"?>' . "\n"
                                . '<schema version="' . $this->schemaVersion . '">' . "\n";
                
-               if( is_array( $tables = $this->db->MetaTables( 'TABLES' ) ) ) {
+               if( is_array( $tables = $this->db->MetaTables( 'TABLES' , ($prefix) ? $prefix.'%' : '') ) ) {
                        foreach( $tables as $table ) {
+                               if ($stripprefix) $table = str_replace(str_replace('\\_', '_', $pfx ), '', $table);
                                $schema .= $indent . '<table name="' . htmlentities( $table ) . '">' . "\n";
                                
                                // grab details from database
index 55e7ee7..d8c1b59 100644 (file)
@@ -14,7 +14,7 @@
 /**
        \mainpage       
        
-        @version V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+        @version V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
 
        Released under both BSD license and Lesser GPL library license. You can choose which license
        you prefer.
        
                // PHP's version scheme makes converting to numbers difficult - workaround
                $_adodb_ver = (float) PHP_VERSION;
-               if ($_adodb_ver >= 5.0) {
+               if ($_adodb_ver >= 5.2) {
+                       define('ADODB_PHPVER',0x5200);
+               } else if ($_adodb_ver >= 5.0) {
                        define('ADODB_PHPVER',0x5000);
                } else if ($_adodb_ver > 4.299999) { # 4.3
                        define('ADODB_PHPVER',0x4300);
                
                        
                // Initialize random number generator for randomizing cache flushes
-               srand(((double)microtime())*1000000);
+               // -- note Since PHP 4.2.0, the seed  becomes optional and defaults to a random value if omitted.
+                srand(((double)microtime())*1000000);
                
                /**
                 * ADODB version as a string.
                 */
-               $ADODB_vers = 'V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. Released BSD & LGPL.';
+               $ADODB_vers = 'V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. Released BSD & LGPL.';
        
                /**
                 * Determines whether recordset->RecordCount() is used. 
        var $raiseErrorFn = false;      /// error function to call
        var $isoDates = false; /// accepts dates in ISO format
        var $cacheSecs = 3600; /// cache for 1 hour
+
+       // memcache
+       var $memCache = false; /// should we use memCache instead of caching in files
+       var $memCacheHost; /// memCache host
+       var $memCachePort = 11211; /// memCache port
+       var $memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
+
        var $sysDate = false; /// name of function that returns the current date
        var $sysTimeStamp = false; /// name of function that returns the current timestamp
        var $arrayClass = 'ADORecordSet_array'; /// name of class used to generate array recordsets, which are pre-downloaded recordsets
        var $transCnt = 0;                      /// count of nested transactions
        
        var $fetchMode=false;
+       
+       var $null2null = 'null'; // in autoexecute/getinsertsql/getupdatesql, this value will be converted to a null
         //
         // PRIVATE VARS
         //
        var $_logsql = false;
        var $_transmode = ''; // transaction mode
        
+
+       
        /**
         * Constructor
         */
                return $this->Parameter($stmt,$var,$name,true,$maxLen,$type);
        
        }
+
        
        /* 
        Usage in oracle
                return false;
        }
        
+       
+       function IgnoreErrors($saveErrs=false)
+       {
+               if (!$saveErrs) {
+                       $saveErrs = array($this->raiseErrorFn,$this->_transOK);
+                       $this->raiseErrorFn = false;
+                       return $saveErrs;
+               } else {
+                       $this->raiseErrorFn = $saveErrs[0];
+                       $this->_transOK = $saveErrs[1];
+               }
+       }
+       
        /**
                Improved method of initiating a transaction. Used together with CompleteTrans().
                Advantages include:
                        if ($ismssql) $isaccess = false;
                        else $isaccess = (strpos($this->databaseType,'access') !== false);
                        
-                       if ($offset <= 0) {
+                       if ($offset <=  0) {
                                
                                        // access includes ties in result
                                        if ($isaccess) {
                                                $sql = preg_replace(
                                                '/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.((integer)$nrows).' ',$sql);
 
-                                               if ($secs2cache>0) {
+                                               if ($secs2cache != 0) {
                                                        $ret =& $this->CacheExecute($secs2cache, $sql,$inputarr);
                                                } else {
                                                        $ret =& $this->Execute($sql,$inputarr);
                $ADODB_COUNTRECS = false;
                        
                if ($offset>0){
-                       if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
+                       if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
                        else $rs = &$this->Execute($sql,$inputarr);
                } else {
-                       if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
+                       if ($secs2cache != 0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);
                        else $rs = &$this->Execute($sql,$inputarr);
                }
                $ADODB_COUNTRECS = $savec;
                }
                return $rv;
        }
+       
+       function &Transpose(&$rs)
+       {
+               $rs2 =& $this->_rs2rs($rs);
+               $false = false;
+               if (!$rs2) return $false;
+               
+               $rs2->_transpose();
+               return $rs2;
+       }
  
        /*
                Calculate the offset of a date for a particular database and generate
        
        function &CacheGetAll($secs2cache,$sql=false,$inputarr=false)
        {
-               return $this->CacheGetArray($secs2cache,$sql,$inputarr);
+               $arr =& $this->CacheGetArray($secs2cache,$sql,$inputarr);
+               return $arr;
        }
        
        function &CacheGetArray($secs2cache,$sql=false,$inputarr=false)
        {
        global $ADODB_CACHE_DIR;
        
+               if ($this->memCache) {
+               global $ADODB_INCLUDED_MEMCACHE;
+               
+                       $key = false;
+                       if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php');
+                       if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true);
+                       FlushMemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug);
+                       return;
+               }
+       
                if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) {
          /*if (strncmp(PHP_OS,'WIN',3) === 0)
             $dir = str_replace('/', '\\', $ADODB_CACHE_DIR);
        {
        global $ADODB_CACHE_DIR;
        
+               if ($this->memCache) {
+                       global $ADODB_INCLUDED_MEMCACHE;
+                       $key = false;
+                       if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php');
+                       if ($sql) $key = $this->_gencachename($sql.serialize($inputarr),false,true);
+                       flushmemCache($key, $this->memCacheHost, $this->memCachePort, $this->debug);
+                       return;
+               }
+
                if (strlen($ADODB_CACHE_DIR) > 1 && !$sql) {
                        if (strncmp(PHP_OS,'WIN',3) === 0) {
                                $cmd = 'del /s '.str_replace('/','\\',$ADODB_CACHE_DIR).'\adodb_*.cache';
        * 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)
+       function _gencachename($sql,$createdir,$memcache=false)
        {
        global $ADODB_CACHE_DIR;
        static $notSafeMode;
                        $mode = $this->fetchMode;
                }
                $m = md5($sql.$this->databaseType.$this->database.$this->user.$mode);
+               if ($memcache) return $m;
                
                if (!isset($notSafeMode)) $notSafeMode = !ini_get('safe_mode');
                $dir = ($notSafeMode) ? $ADODB_CACHE_DIR.'/'.substr($m,0,2) : $ADODB_CACHE_DIR;
                } else
                        $sqlparam = $sql;
                        
+               if ($this->memCache) {
+                       global $ADODB_INCLUDED_MEMCACHE;
+                       if (empty($ADODB_INCLUDED_MEMCACHE)) include(ADODB_DIR.'/adodb-memcache.lib.inc.php');
+                       $md5file = $this->_gencachename($sql.serialize($inputarr),false,true);
+               } else {
                global $ADODB_INCLUDED_CSV;
-               if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
-               
-               $md5file = $this->_gencachename($sql.serialize($inputarr),true);
+                       if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
+                       $md5file = $this->_gencachename($sql.serialize($inputarr),true);
+               }
+
                $err = '';
                
                if ($secs2cache > 0){
-                       $rs = &csv2rs($md5file,$err,$secs2cache,$this->arrayClass);
+                       if ($this->memCache)
+                               $rs = &getmemCache($md5file,$err,$secs2cache, $this->memCacheHost, $this->memCachePort);
+                       else
+                               $rs = &csv2rs($md5file,$err,$secs2cache,$this->arrayClass);
                        $this->numCacheHits += 1;
                } else {
                        $err='Timeout 1';
                if (!$rs) {
                // no cached rs found
                        if ($this->debug) {
-                               if (get_magic_quotes_runtime()) {
+                               if (get_magic_quotes_runtime() && !$this->memCache) {
                                        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($sqlparam,$inputarr);
 
+                       if ($rs && $this->memCache) {
+                               $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
+                               if(!putmemCache($md5file, $rs, $this->memCacheHost, $this->memCachePort, $this->memCacheCompress, $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");
+                               }
+                       } else
                        if ($rs) {
                                $eof = $rs->EOF;
                                $rs = &$this->_rs2rs($rs); // read entire recordset into memory immediately
                                }  
                                
                        } else
+                       if (!$this->memCache)
                                @unlink($md5file);
                } else {
                        $this->_errorMsg = '';
@@ -2873,7 +2950,15 @@ http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_1
                                        }
                                } else {
                                        while (!$this->EOF) {
-                                               $results[trim(reset($this->fields))] = array_slice($this->fields, 1);
+                                       // Fix for array_slice re-numbering numeric associative keys
+                                               $keys = array_slice(array_keys($this->fields), 1);
+                                               $sliced_array = array();
+
+                                               foreach($keys as $key) {
+                                                       $sliced_array[$key] = $this->fields[$key];
+                                               }
+                                               
+                                               $results[trim(reset($this->fields))] = $sliced_array;
                                                adodb_movenext($this);
                                        }
                                }
@@ -2885,7 +2970,15 @@ http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_1
                                        }
                                } else {
                                        while (!$this->EOF) {
-                                               $results[trim(reset($this->fields))] = array_slice($this->fields, 1);
+                                       // Fix for array_slice re-numbering numeric associative keys
+                                               $keys = array_slice(array_keys($this->fields), 1);
+                                               $sliced_array = array();
+
+                                               foreach($keys as $key) {
+                                                       $sliced_array[$key] = $this->fields[$key];
+                                               }
+                                               
+                                               $results[trim(reset($this->fields))] = $sliced_array;
                                                $this->MoveNext();
                                        }
                                }
@@ -3460,6 +3553,8 @@ http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_1
                'DATE' => 'D',
                'D' => 'D',
                ##
+               'UNIQUEIDENTIFIER' => 'C', # MS SQL Server
+               ##
                'TIME' => 'T',
                'TIMESTAMP' => 'T',
                'DATETIME' => 'T',
@@ -3516,7 +3611,14 @@ http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_1
                'SQLDTIME' => 'T', 
                'SQLINTERVAL' => 'N', 
                'SQLBYTES' => 'B', 
-               'SQLTEXT' => 'X' 
+               'SQLTEXT' => 'X',
+                ## informix 10
+               "SQLINT8" => 'I8',
+               "SQLSERIAL8" => 'I8',
+               "SQLNCHAR" => 'C',
+               "SQLNVCHAR" => 'C',
+               "SQLLVARCHAR" => 'X',
+               "SQLBOOL" => 'L'
                );
                
                $tmap = false;
@@ -3555,6 +3657,7 @@ http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_1
                }
        }
        
+       
        function _close() {}
        
        /**
@@ -3611,7 +3714,7 @@ http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_1
                var $_types;    // the array of types of each column (C B I L M)
                var $_colnames; // names of each column in array
                var $_skiprow1; // skip 1st row because it holds column names
-               var $_fieldarr; // holds array of field objects
+               var $_fieldobjects; // holds array of field objects
                var $canSeek = true;
                var $affectedrows = false;
                var $insertid = false;
@@ -3631,6 +3734,37 @@ http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_1
                        $this->fetchMode = $ADODB_FETCH_MODE;
                }
                
+               function _transpose()
+               {
+               global $ADODB_INCLUDED_LIB;
+                       
+                       if (empty($ADODB_INCLUDED_LIB)) include(ADODB_DIR.'/adodb-lib.inc.php');
+                       $hdr = true;
+                       
+                       adodb_transpose($this->_array, $newarr, $hdr);
+                       //adodb_pr($newarr);
+                       
+                       $this->_skiprow1 = false;
+                       $this->_array =& $newarr;
+                       $this->_colnames = $hdr;
+                       
+                       adodb_probetypes($newarr,$this->_types);
+               
+                       $this->_fieldobjects = array();
+                       
+                       foreach($hdr as $k => $name) {
+                               $f = new ADOFieldObject();
+                               $f->name = $name;
+                               $f->type = $this->_types[$k];
+                               $f->max_length = -1;
+                               $this->_fieldobjects[] = $f;
+                               
+                       }
+                       $this->fields = reset($this->_array);
+                       
+                       $this->_initrs();
+                       
+               }
                
                /**
                 * Setup the array.
index 25d6398..b6b5379 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 38f2a1e..2ae7d93 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index dff2a24..483ff42 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 3343806..c9bf0e0 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 6c2e8e7..be20613 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 67a4b33..40818e5 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -32,7 +32,7 @@ class ADODB2_informix extends ADODB_DataDict {
                case 'B': return 'BLOB';
                        
                case 'D': return 'DATE';
-               case 'T': return 'DATETIME';
+               case 'T': return 'DATETIME YEAR TO SECOND';
                
                case 'L': return 'SMALLINT';
                case 'I': return 'INTEGER';
index 9be5f80..d5d0942 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 7fb82a8..338e286 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index f253195..2cdd87d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -75,8 +75,8 @@ class ADODB2_oci8 extends ADODB_DataDict {
                case 'X': return $this->typeX;
                case 'XL': return $this->typeXL;
                
-               case 'C2': return 'NVARCHAR';
-               case 'X2': return 'NVARCHAR(2000)';
+               case 'C2': return 'NVARCHAR2';
+               case 'X2': return 'NVARCHAR2(4000)';
                
                case 'B': return 'BLOB';
                        
@@ -109,6 +109,7 @@ class ADODB2_oci8 extends ADODB_DataDict {
        
        function AddColumnSQL($tabname, $flds)
        {
+               $tabname = $this->TableName ($tabname);
                $f = array();
                list($lines,$pkey) = $this->_GenFields($flds);
                $s = "ALTER TABLE $tabname ADD (";
@@ -123,6 +124,7 @@ class ADODB2_oci8 extends ADODB_DataDict {
        
        function AlterColumnSQL($tabname, $flds)
        {
+               $tabname = $this->TableName ($tabname);
                $f = array();
                list($lines,$pkey) = $this->_GenFields($flds);
                $s = "ALTER TABLE $tabname MODIFY(";
@@ -136,6 +138,7 @@ class ADODB2_oci8 extends ADODB_DataDict {
        
        function DropColumnSQL($tabname, $flds)
        {
+               $tabname = $this->TableName ($tabname);
                if (!is_array($flds)) $flds = explode(',',$flds);
                foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v);
                
@@ -253,7 +256,7 @@ end;
                if ( is_array($flds) )
                        $flds = implode('", "',$flds);
                $s = 'CREATE' . $unique . ' INDEX "' . $idxname . '" ON "' .$tabname . '" ("' . $flds . '")';
-               
+
                if ( isset($idxoptions[$this->upperName]) )
                        $s .= $idxoptions[$this->upperName];
                
@@ -279,4 +282,4 @@ end;
                return  "COMMENT ON COLUMN $table.$col IS $cmt";
        }
 }
-?>
\ No newline at end of file
+?>
index 89afb2b..c101c3c 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 61147f1..e9fd86f 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 61eca0a..1c68b36 100644 (file)
@@ -30,7 +30,7 @@ This implementation differs from Zend Framework's implementation in the followin
 <li>ADOdb_Active_Record works when you are connected to multiple databases. Zend's only works when connected to a default database.<p>
 <li>Support for $ADODB_ASSOC_CASE. The field names are upper-cased, lower-cased or left in natural case depending on this setting.<p>
 <li>No field name conversion to camel-caps style, unlike Zend's implementation which will convert field names such as 'first_name' to 'firstName'.<p>
-<li>New ADOConnection::GetActiveRecords() and ADOConnection::GetActiveRecordsClass() functions in adodb.inc.php.<p>
+<li>NewADOConnection::GetActiveRecords() and ADOConnection::GetActiveRecordsClass() functions in adodb.inc.php.<p>
 <li>Caching of table metadata so it is only queried once per table, no matter how many Active Records are created.<p>
 <li>The additional functionality is described <a href=#additional>below</a>. 
 </ul>
@@ -45,9 +45,9 @@ ADOdb_Active_Record maps a database table to a PHP class, and each instance of t
 The first step to using  ADOdb_Active_Record is to set the default connection that an ADOdb_Active_Record objects will use to connect to a database. 
 
 <pre>
-require_once('adodb/adodb-active-record.php');
+require_once('adodb/adodb-active-record.inc.php');
 
-$db = new ADOConnection('mysql://root:pwd@localhost/dbname');
+$db = NewADOConnection('mysql://root:pwd@localhost/dbname');
 ADOdb_Active_Record::SetDatabaseAdapter($db);
 </pre>        
 
@@ -233,7 +233,7 @@ var $_table = 'people';
 }
 
 $person = new Person();
-peopleArray =& $person->Find("name like ? order by age", array('Sm%'));
+$peopleArray =& $person->Find("name like ? order by age", array('Sm%'));
 </pre>
 
 <h3><li>Error Handling and Debugging</h3>
@@ -497,9 +497,14 @@ echo "&lt;p>Name first (should be John): ",$person->name_first, "&lt;br>Class =
  <p>PHP5 specific: Change PHP5 implementation of Active Record to use __get() and __set() for better performance.
 
 <h3> Change Log</h3>
+<p>0.05
+<p>If inserting a record and the value of a primary key field is null, then we do not insert that field in as
+we assume it is an auto-increment field. Needed by mssql.
+
 <p>0.04 5 June 2006 <br>
 <p>Added support for declaring table name in $_table in class declaration. Thx Bill Dueber for idea.
 <p>Added find($where,$bindarr=false) method to retrieve an array of active record objects.
+
 <p>0.03 <br>
 - Now we only update fields that have changed, using $this->_original.<br>
 - We do not include auto_increment fields in replace(). Thx Travis Cline<br>
index 96a15cf..077b661 100644 (file)
@@ -15,7 +15,7 @@ pre {
 <body bgcolor="#ffffff" text="black">
 
 <h2>ADOdb Library for PHP</h2>
-<p>V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com)</p>
+<p>V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com)</p>
 <p><font size="1">This software is dual licensed using BSD-Style and LGPL. This 
   means you can use it in compiled proprietary and commercial products.</font></p>
   
@@ -102,7 +102,7 @@ pre {
   <a href="#genid">GenID</a> <a href="#createseq">CreateSequence</a> <a href="#dropseq">DropSequence</a> 
   <br>
   Error Handling: <a href="#errormsg">ErrorMsg</a> <a href="#errorno">ErrorNo</a> 
-  <a href="#metaerror">MetaError</a> <a href="#metaerrormsg">MetaErrorMsg</a><br>
+  <a href="#metaerror">MetaError</a> <a href="#metaerrormsg">MetaErrorMsg</a> <a href="#ignoreerrors">IgnoreErrors</a><br>
   Data Dictionary (metadata): <a href="#metadatabases">MetaDatabases</a> <a href="#metatables">MetaTables</a> 
   <a href="#metacolumns">MetaColumns</a> <a href="#metacolumnames">MetaColumnNames</a> 
   <a href="#metaprimarykeys">MetaPrimaryKeys</a> <a href="#metaforeignkeys">MetaForeignKeys</a> 
@@ -257,7 +257,7 @@ different databases. The solution is to always use different userid's for differ
  or use NConnect().
 
  <a name="dsnsupport"></a>
- </p><h3>Data Source Name (DSN) Support</h3> 
+ </p><h3>Data Source Name (DSN) Support</h3>
  <p> Since ADOdb 4.51, you can connect to a database by passing a dsn to NewADOConnection() (or ADONewConnection, which is
  the same function). The dsn format is:
 </p><pre>      $driver://$username:$password@hostname/$database?options[=value]<br></pre><p>
@@ -274,8 +274,9 @@ NewADOConnection() calls Connect() or PConnect() internally for you. If the conn
        $dsn2 = 'mysql://root:pwd@localhost/mydb?persist'; 
 </pre>
 <p>
-If you have special characters such as /:? in your dsn, then you need to rawurlencode them first:
-</p><pre>      $pwd = rawurlencode($pwd);<br>  $dsn = "mysql://root:$pwd@localhost/mydb";<br></pre>
+If you have special characters such as /:?_ in your dsn, then you need to rawurlencode them first:
+</p><pre>      $pwd = rawurlencode($pwd);<br>  $dsn = "mysql://root:$pwd@localhost/mydb";
+       $dsn2=rawurlencode("sybase_ase")."://user:pass@host/path?query";<br></pre>
 <p>
 Legal options are:
 </p><p>
@@ -1766,7 +1767,13 @@ only with SELECT statements.
 </font><p><font><b>CacheFlush<a name="cacheflush"></a>($sql=false,$inputarr=false)</b></font></p>
 <p><font>Flush (delete) any cached recordsets for the SQL statement $sql in $ADODB_CACHE_DIR. 
 </font></p><p><font>If no parameter is passed in, then all adodb_*.cache files are deleted. 
-</font></p><p><font> If you want to flush all cached recordsets manually, execute the following 
+</font></p>
+  <p>CacheSelectLimit() rewrites the SQL query, so you won't be able to pass the SQL to CacheFlush. In this case,
+   to flush the cached SQL recordset returned by CacheSelectLimit(), set $secs2cache to -1:
+<pre>
+       $db->CacheSelectLimit(-1, $sql, $nrows);
+</pre>
+<p><font> If you want to flush all cached recordsets manually, execute the following 
        PHP code (works only under Unix): <br>
        <code> &nbsp; system("rm -f `find ".$ADODB_CACHE_DIR." -name 
        adodb_*.cache`");</code></font></p>
@@ -1805,7 +1812,16 @@ If 0 is returned, no error occurred.
 <font>Note that old versions of PHP (pre 4.0.6) do 
        not support error number for ODBC. In general you do not need to call this 
        function unless an ADOdb function returns false on an error.</font></p>
-
+<p><font><b>IgnoreErrors<a name="ignoreerrors"></a>($saveErrHandlers)</b></font></p>
+<p>Allows you to ignore errors so that StartTrans()/CompleteTrans() is not affected, nor is the default error handler called if an error occurs.
+Useful when you want to check if a field or table exists in a database without invoking an error if it does not exist.
+<p>Usage:
+<pre>
+$saveErrHandlers = $conn->IgnoreErrors();
+$rs = $conn->Execute("select field from some_table_that_might_not_exist");
+$conn->IgnoreErrors($saveErrHandlers);
+</pre>
+<p>Warning: do not call StartTrans()/CompleteTrans() inside a code block that is using IgnoreErrors().
 <p><font><b>SetFetchMode<a name="setfetchmode"></a>($mode)</b></font></p>
 <p><font>Sets the current fetch mode for the connection and stores 
        it in $db-&gt;fetchMode. Legal modes are ADODB_FETCH_ASSOC and ADODB_FETCH_NUM. 
@@ -2342,14 +2358,18 @@ Also see <a href="docs-perf.htm">Performance Monitor</a>.
 <p>Here is an example of using fnExecute, to count all cached queries and non-cached 
   queries, you can do this:</p>
 <pre><font color="#006600"># $db is the connection object</font>
-function CountExecs($db, $sql, $inputarray)
+function &CountExecs($db, $sql, $inputarray)
 {
 global $EXECS;
 
-if (!is_array(inputarray)) $EXECS++;
-<font color="#006600"># handle 2-dimensional input arrays</font>
-else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);
-else $EXECS++;
+       if (!is_array(inputarray)) $EXECS++;
+       <font color="#006600"># handle 2-dimensional input arrays</font>
+       else if (is_array(reset($inputarray))) $EXECS += sizeof($inputarray);
+       else $EXECS++;
+       
+       <font color="#006600"># in PHP4.4 and PHP5, we need to return a value by reference</font>
+       $null = null;
+       return $null;
 }
 
 <font color="#006600"># $db is the connection object</font>
@@ -2900,6 +2920,60 @@ of MySQL.</font></p>
   PHP</a>. </font></p>
 
 <h2><font>Change Log<a name="Changes"></a><a name="changes"></a><a name="changelog"></a></font></h2>
+<p><a name="4.93"></a><b>4.93 10 Oct 2006</b>
+<p>Added support for multiple database connections in performance monitoring code (adodb-perf.inc.php). Now all sql in multiple database connections can be saved into one database ($ADODB_LOG_CONN).
+<p>Added MetaIndexes() to odbc_mssql.
+<p>Added connection property $db->null2null = 'null'. In autoexecute/getinsertsql/getupdatesql, this value will be converted to a null. Set this to a funny invalid value if you do not want null conversion. See http://phplens.com/lens/lensforum/msgs.php?id=15902.
+<p>Path disclosure problem in mysqli fixed. Thx Andy.
+<p>Fixed typo in session_schema2.xml.
+<p>Changed INT in oci8 to return correct precision in $fld->max_length, MetaColumns(). Thx Eloy Lafuente Plaza.
+<p>Patched postgres64 _connect to handle serverinfo(). see http://phplens.com/lens/lensforum/msgs.php?id=15887.
+<p>Added pdo fix for null columns. See http://phplens.com/lens/lensforum/msgs.php?id=15889
+<p>For stored procedures, missing connection id now passed into mssql_query(). Thx Ecsy (ecsy#freemail.hu).
+<p><a name="4.92a"></a><b>4.92a 30 Aug 2006</b>
+<p>Syntax error in postgres7 driver. Thx Eloy Lafuente Plaza. 
+<p>Minor bug fixes - adodb informix 10 types added to adodb.inc.php. Thx Fernando Ortiz.
+
+<p><a name="4.92"></a><b>4.92 29 Aug 2006</b>
+<p>Better odbtp date support.
+<P>Added IgnoreErrors() to bypass default error handling.
+<p>The _adodb_getcount() function in adodb-lib.inc.php, some ORDER BY bug fixes.
+<p>For ibase and firebird, set  $sysTimeStamp = "CURRENT_TIMESTAMP".
+<p>Fixed postgres connection bug: http://phplens.com/lens/lensforum/msgs.php?id=11057.
+<p>Changed CacheSelectLimit() to flush cache when $secs2cache==-1 due to complaints from other users. 
+<p>Added support for using memcached with CacheExecute/CacheSelectLimit. Requires memcache module PECL extension. Usage:
+<pre>
+$db = NewADOConnection($driver);
+$db->memCache = true; /// should we use memCache instead of caching in files
+$db->memCacheHost = 126.0.1.1; /// memCache host
+$db->memCachePort = 11211; /// this is default memCache port
+$db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
+
+$db->Connect(...);
+$db->CacheExecute($sql);
+</pre>
+<p>Implemented Transpose() for recordsets. Recordset must be retrieved using ADODB_FETCH_NUM. First column becomes the 
+column name.
+<pre>
+$DB = NewADOConnection('mysql');
+$DB->Connect(...);
+$DB->SetFetchMode(ADODB_FETCH_NUM);
+$rs = $DB->Execute('select productname,productid,unitprice from products limit 10');
+$rs2 = $DB->Transpose($rs);
+rs2html($rs2);
+</pre>
+<p><a name="4.91"></a><b>4.91 2 Aug 2006</b>
+<p>Major session code rewrite .... See session docs.
+<p>PDO bindinputarray was not set properly for MySQL (changed from true to false).
+<p>Changed CacheSelectLimit() to re-cache when $secs2cache==0. This is one way to flush the cache when SelectLimit is called.
+<p>Added to quotes to mysql  and mysqli: "SHOW COLUMNS FROM `%s`";
+<p>Removed accidental optgroup handling in GetMenu().
+<a>Fixed ibase _BlobDecode for php5 compat, and also mem alloc issues for small blobs, thx salvatori#interia.pl
+<p>Mysql driver OffsetDate() speedup, useful for adodb-sessions.
+<p>Fix for GetAssoc() PHP5 compat. See http://phplens.com/lens/lensforum/msgs.php?id=15425
+<p>Active Record - If inserting a record and the value of a primary key field is null, then we do not insert that field in as we assume it is an auto-increment field. Needed by mssql.
+<p>Changed postgres7 MetaForeignKeys() see http://phplens.com/lens/lensforum/msgs.php?id=15531
+<p>DB2 will now return db2_conn_errormsg() when it is a connection error. 
 <p><a name="4.90"></a><b>4.90 8 June 2006</b>
 <p>Changed adodb_countrec() in adodb-lib.inc.php to allow LIMIT to be used as a speedup to reduce no of records counted.
 <p>Added support for transaction modes for postgres and oci8 with SetTransactionMode(). 
index d3eb595..28a5515 100644 (file)
@@ -20,7 +20,7 @@
 </head>
 <body style="background-color: rgb(255, 255, 255);">
 <h2>ADOdb Data Dictionary Library for PHP</h2>
-<p>V4.90 8 June 2006 (c) 2000-2006 John Lim (<a
+<p>V4.93 10 Oct 2006 (c) 2000-2006 John Lim (<a
  href="mailto:jlim#natsoft.com.my">jlim#natsoft.com.my</a>).<br>
 AXMLS (c) 2004 ars Cognita, Inc</p>
 <p><font size="1">This software is dual licensed using BSD-Style and
index 3ef2de5..ed055b4 100644 (file)
@@ -18,7 +18,7 @@ font-size: 8pt;
 </head>
 <body>
 <h3>The ADOdb Performance Monitoring Library</h3>
-<p>V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)</p>
+<p>V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)</p>
 <p><font size="1">This software is dual licensed using BSD-Style and
 LGPL. This means you can use it in compiled proprietary and commercial
 products.</font></p>
index b8c6e28..ea8de54 100644 (file)
@@ -19,9 +19,9 @@ font-size: 8pt;
   </style>
 </head>
 <body style="background-color: rgb(255, 255, 255);">
-<h3>ADODB Session Management Manual</h3>
+<h1>ADODB Session 2 Management Manual</h1>
 <p>
-V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)
+V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)
 </p>
 <p> <font size="1">This software is dual licensed using BSD-Style and
 LGPL. This means you can use it in compiled proprietary and commercial
@@ -29,9 +29,17 @@ products. </font>
 <p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a>
 &nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a>
 </p>
-<h3>Introduction</h3>
-<p> We store state information specific to a user or web client in
-session variables. These session variables persist throughout a
+<h2>Introduction</h2>
+<p> This document discusses the newer session handler adodb-session2.php. If
+  you have used the older adodb-session.php, then be forewarned that you will
+  need to alter your session table format. Otherwise everything is <a href="#compat">backward
+  compatible</a>.
+  Here are the <a href="docs-session.old.htm">older
+    docs</a> for
+  adodb-session.php.</p>
+<h2>Why Session Variables in a Database? </h2>
+<p>We store state information specific to a user or web
+    client in session variables. These session variables persist throughout a
 session, as the user moves from page to page. </p>
 <p>To use session variables, call session_start() at the beginning of
 your web page, before your HTTP headers are sent. Then for every
@@ -54,11 +62,49 @@ in a database table that can be shared across multiple servers. </p>
 <p>These records will be garbage collected based on the php.ini [session] timeout settings. 
 You can register a notification function to notify you when the record has expired and 
 is about to be freed by the garbage collector.</p>
-<p><b>Important Upgrade Notice:</b> Since ADOdb 4.05, the session files
-have been moved to its own folder, adodb/session. This is a rewrite
-of the session code by Ross Smith. The old session code is in
-adodb/session/old. </p>
-<h4>ADOdb Session Handler Features</h4>
+<p>An alternative to using a database backed session handler is to use <a href="http://www.danga.com/memcached/">memcached</a>.
+  This is a distributed memory based caching system suitable for storing session
+  information.
+  </p>
+<h2> The Improved Session Handler</h2>
+<p>In ADOdb 4.91, we added a new session handler, in adodb-session2.php.
+It features the following improvements:
+<ul>
+<li>Fully supports server farms using a new database table format. The
+  previous version used the web server time for timestamps, which can cause problems
+  on a system with multiple web servers with possibly inconsistent
+  times. The new version uses the database server time instead for all timestamps.
+<li>The older database table format is obsolete. The database table must be modified
+  to support storage of the database server time mentioned above. Also the field
+  named DATA has been changed to SESSDATA. In some databases, DATA is a reserved
+  word.
+<li>The functions dataFieldName() and syncSeconds() is obsolete.
+</ul>
+
+<p>Usage is 
+
+<pre>
+include_once("adodb/session/adodb-session2.php");
+ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
+session_start();
+
+<font
+ color="#004040">#<br># Test session vars, the following should increment on refresh<br>#<br>$_SESSION['AVAR'] += 1;<br>print "&lt;p&gt;\$_SESSION['AVAR']={$_SESSION['AVAR']}&lt;/p&gt;";</font>
+</pre>
+
+<p>When the session is created in session_start( ), the global variable $<b>ADODB_SESS_CONN</b> holds
+the connection object.
+<p>The default name of the table is sessions2. If you want to override it:
+  
+<pre>
+include_once("adodb/session/adodb-session2.php");
+$options['table'] = 'mytablename';
+ADOdb_Session::config($driver, $host, $user, $password, $database,$options);
+session_start();
+</pre>
+
+
+<h3>ADOdb Session Handler Features</h3>
 <ul>
   <li>Ability to define a notification function that is called when a
 session expires. Typically
@@ -67,28 +113,29 @@ used to detect session logout and release global resources. </li>
 only perform an update
 to the session data if there is a data change. </li>
   <li>Support for large amounts of session data with CLOBs (see
-adodb-session-clob.php). Useful
+adodb-session-clob2.php). Useful
 for Oracle. </li>
   <li>Support for encrypted session data, see
-adodb-cryptsession.inc.php. Enabling encryption is simply a matter of
-including adodb-cryptsession.inc.php instead of adodb-session.inc.php. </li>
+adodb-cryptsession2.php. Enabling encryption is simply a matter of
+including adodb-cryptsession2.php instead of adodb-session2.php. </li>
 </ul>
-<h3>Setup</h3>
+<h3>Session Handler Files </h3>
 <p>There are 3 session management files that you can use:
 </p>
-<pre>adodb-session.php        : The default<br>adodb-session-clob.php   : Use this if you are storing DATA in clobs<br>adodb-cryptsession.php   : Use this if you want to store encrypted session data in the database<br><br>
-</pre>
-<p><strong>Examples</strong>
-<p><pre>
- <font
- color="#004040">    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';</b><br>    <br>    <b>include('adodb/session/adodb-session.php');</b><br>    session_start();<br>    <br>    #<br>    # Test session vars, the following should increment on refresh<br>    #<br>    $_SESSION['AVAR'] += 1;<br>    print "&lt;p&gt;\$_SESSION['AVAR']={$_SESSION['AVAR']}&lt;/p&gt;";<br></font></pre>
+<pre>adodb-session2.php        : The default<br>adodb-cryptsession2.php   : Use this if you want to store encrypted session data in the database<br>adodb-session-clob2.php   : Use this if you are storing DATA in clobs and you are NOT using oci8 driver</pre>
+<h2><strong>Usage Examples</strong></h2>
+<p>To force non-persistent connections, call <font color="#004040"><b>Persist</b></font>() first before session_start():
+
  
-<p>To force non-persistent connections, call adodb_session_open() first before session_start():
-<p>
- <pre>
- <font color="#004040"><br>    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';</b><br>    <br>    <b>include('adodb/session/adodb-session.php');<br>    adodb_sess_open(false,false,false);</b><br>    session_start();<br> </font>
- </pre>
-<p> The 3rd parameter to adodb_sess_open($path, $sessname, $connectMode)  sets the connection method. You can pass in the following:</p>
+<pre>
+ <font color="#004040">
+include_once("adodb/session/adodb-session2.php");
+$driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb';
+ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);<b><br>ADOdb_session::Persist($connectMode=false);</b>
+session_start();<br> </font>
+</pre>
+<p> The parameter to the Persist( ) method sets the connection mode. You can
+  pass the following:</p>
 <table width="50%" border="1">
   <tr>
     <td><b>$connectMode</b></td>
@@ -115,56 +162,56 @@ including adodb-cryptsession.inc.php instead of adodb-session.inc.php. </li>
     <td>Connect( )</td>
   </tr>
 </table>
-<p>To use a encrypted sessions, simply replace the file adodb-session.php:</p>
+<p>To use a encrypted sessions, simply replace the file adodb-session2.php:</p>
  <pre> <font
- color="#004040"><br>    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';<br>    <br>    include('adodb/session/adodb-cryptsession.php');</b><br>    session_start();</font><br>
- </pre>
- <p>And the same technique for adodb-session-clob.php:</p>
+ color="#004040"><b><br>include('adodb/session/adodb-cryptsession2.php');</b><br>$driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb';
+ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);<b><br>adodb_sess_open(false,false,$connectMode=false);</b>
+session_start();<br></font></pre>
+ <p>And the same technique for adodb-session-clob2.php:</p>
  <pre>  <font
- color="#004040"><br>    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';<br>    <br>    include('adodb/session/adodb-session-clob.php');</b><br>    session_start();</font>
- </pre>
- <p>An alternative way to set persistant or non-persistent connections is to call the following function before session_start() is called.
- <pre>
-       ADODB_Session::persist('P'); # 'C' for non-persistent connections
- </pre>
- <h4>Installation</h4>
-<p>1. Create this table in your database (MySQL syntax):
-<p><pre> <a
+ color="#004040"><br><b>include('adodb/session/adodb-session2-clob2.php');</b><br>$driver = 'oci8'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb';
+ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);<b><br>adodb_sess_open(false,false,$connectMode=false);</b>
+session_start();</font></pre>
+ <h2>Installation</h2>
+<p>1. Create this table in your database. Here is the MySQL version:
+<pre> <a
  name="sessiontab"></a> <font color="#004040">
-   create table sessions (
-       SESSKEY char(32) not null,
-       EXPIRY int(11) unsigned not null,
-       EXPIREREF varchar(64),
-          DATA text not null,
-          primary key (sesskey)
-          );</font>
- </pre>
+CREATE TABLE sessions2(
+         sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
+         expiry DATETIME NOT NULL ,
+         expireref VARCHAR( 250 ) DEFAULT '',
+         created DATETIME NOT NULL ,
+         modified DATETIME NOT NULL ,
+         sessdata LONGTEXT DEFAULT '',
+         PRIMARY KEY ( sesskey ) ,
+         INDEX sess2_expiry( expiry ),
+         INDEX sess2_expireref( expireref )
+)</font></pre>
 
- <p>You may want to rename the 'data' field to 'session_data' as
-       'data' appears to be a reserved word for one or more of the following:
-       <ul>
-       <li>    ANSI SQL
-       <li>    IBM DB2
-       <li>    MS SQL Server
-       <li>    Postgres
-       <li>    SAP
-               </ul>
-<p>
-       If you do, then execute:
-<pre>
-               ADODB_Session::dataFieldName('session_data');
+ <p> For PostgreSQL, use:
+ <pre>CREATE TABLE sessions2(
+ sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
+ expiry TIMESTAMP NOT NULL ,
+ expireref VARCHAR( 250 ) DEFAULT '',
+ created TIMESTAMP NOT NULL ,
+ modified TIMESTAMP NOT NULL ,
+ sessdata TEXT DEFAULT '',
+ PRIMARY KEY ( sesskey )
+ );
 </pre>
- <p> For the adodb-session-clob.php version, create this:
-<p>  <pre>
-    <font
- color="#004040"><br>    create table sessions (<br>       SESSKEY char(32) not null,<br>       EXPIRY int(11) unsigned not null,<br>       EXPIREREF varchar(64),<br>       DATA CLOB,<br>      primary key (sesskey)<br>  );</font>
- </pre>
- <p>2. Then define the following parameters. You can either modify this file, or define them before this file is included:
- <pre>      <font
- color="#004040"><br>    $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';<br>    $ADODB_SESSION_CONNECT='server to connect to';<br>    $ADODB_SESSION_USER ='user';<br>    $ADODB_SESSION_PWD ='password';<br>    $ADODB_SESSION_DB ='database';<br>    $ADODB_SESSION_TBL = 'sessions'; # setting this is optional<br>    </font>
- </pre><p>
-     When the session is created, $<b>ADODB_SESS_CONN</b> holds the connection object.<br>    <br>  3. Recommended is PHP 4.0.6 or later. There are documented session bugs in earlier versions of PHP.
-<h3>Notifications</h3>
+ <pre>create INDEX sess2_expiry on sessions2( expiry );
+create INDEX sess2_expireref on sessions2 ( expireref );</pre>
+ <p>Here is the Oracle definition, which uses a CLOB for the SESSDATA field:
+ <pre>
+  <font
+ color="#004040">CREATE TABLE SESSIONS2<br>(<br>   SESSKEY    VARCHAR2(48 BYTE)                  NOT NULL,<br>   EXPIRY     DATE                               NOT NULL,<br>   EXPIREREF  VARCHAR2(200 BYTE),<br>   CREATED    DATE                               NOT NULL,<br>   MODIFIED   DATE                               NOT NULL,<br>   SESSDATA   CLOB,<br>  PRIMARY KEY(SESSKEY)<br>);
+<br>CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY);
+CREATE INDEX SESS2_EXPIREREF ON SESSIONS2(EXPIREREF);</font></pre>
+<p> We need to use a CLOB here because for text greater than 4000 bytes long,
+  Oracle requires you to use the CLOB data type. If you are using the oci8 driver,
+  ADOdb will automatically enable CLOB handling. So you can use either adodb-session2.php
+  or adodb-session-clob2.php - in this case it doesn't matter. <br>    
+<h2>Notifications</h2>
 <p>You can receive notification when your session is cleaned up by the session garbage collector or
 when you call session_destroy().
 <p>PHP's session extension will automatically run a special garbage collection function based on
@@ -220,7 +267,7 @@ $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');</font>
 record has been created, you will need to modify any session variable
 to force a database record update.
 </p>
-<h4>Neat Notification Tricks</h4>
+<h3>Neat Notification Tricks</h3>
 <p><i>ExpireRef</i> normally holds the user id of the current session.
 </p>
 <p>1. You can then write a session monitor, scanning expireref to see
@@ -234,70 +281,56 @@ site.
 <p>3. You can scan the sessions table to ensure no user
 can be logged in twice. Useful for security reasons.
 </p>
-<h3>Using Oracle CLOBs</h3>
-<p>Suppose you are storing the DATA field in a CLOB:
- <pre><font color="#004040">
-   CREATE TABLE sessions (
-       SESSKEY VARCHAR(32) NOT NULL,
-       EXPIRY NUMBER(16)  NOT NULL,
-       EXPIREREF VARCHAR(64),
-       DATA CLOB,
-      PRIMARY KEY (sesskey)
-  );</font>
- </pre> 
- <p>Then your PHP code could look like this:
-        <pre>
-       ADODB_SESSION_DRIVER='oci8';
-       $ADODB_SESSION_CONNECT=$tnsname;
-       $ADODB_SESSION_USER ='scott';
-       $ADODB_SESSION_PWD = 'tiger';
-       $ADODB_SESSION_DB ='';
-       
-       $ADODB_SESSION_USE_LOBS = 'clob';
-       $ADODB_SESSION_TBL = 'sessions';
-       
-       $ADODB_SESS_DEBUG=0;
-       
-       include(ADODB_DIR.'/session/adodb-session.php');
-       
-       ADODB_Session::persist('P'); # use 'C' for non-persistent connects
-       
-       session_start();
- </pre>
- <p>Note that you can set persistance using ADODB_Session::persist('P').
-<h3>Compression/Encryption Schemes</h3>
+<h2>Compression/Encryption Schemes</h2>
 Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and
 compression schemes are supported. Currently, supported are:
 <p>
 <pre>  MD5Crypt (crypt.inc.php)<br>  MCrypt<br>  Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)<br>  GZip<br>  BZip2<br></pre>
 <p>These are stackable. E.g.
-<p><pre>ADODB_Session::filter(new ADODB_Compress_Bzip2());<br>ADODB_Session::filter(new ADODB_Encrypt_MD5());<br></pre>
+<pre>ADODB_Session::filter(new ADODB_Compress_Bzip2());<br>ADODB_Session::filter(new ADODB_Encrypt_MD5());<br></pre>
 will compress and then encrypt the record in the database.
-<h3>adodb_session_regenerate_id()</h3>
-<p>Dynamically change the current session id with a newly generated one and update database. Currently only
-works with cookies. Useful to improve security by reducing the risk of session-hijacking.
-See this article on <a href=http://shiflett.org/articles/security-corner-feb2004>Session Fixation</a> for more info 
-on the theory behind this feature. Usage:
-<pre>
-       $ADODB_SESSION_DRIVER='mysql';
-       $ADODB_SESSION_CONNECT='localhost';
-       $ADODB_SESSION_USER ='root';
-       $ADODB_SESSION_PWD ='abc';
-       $ADODB_SESSION_DB ='phplens';
-       
-       include('path/to/adodb/session/adodb-session.php');
+<h2>Session Cookie Regeneration: adodb_session_regenerate_id()</h2>
+<p>Dynamically change the current session id with a newly generated one and update
+  database. Currently only works with cookies. Useful to improve security by
+  reducing the risk of session-hijacking. See this article on <a href=http://shiflett.org/articles/security-corner-feb2004>Session
+  Fixation</a> for more info 
+on the theory behind this feature. Usage:<pre>
+       include('path/to/adodb/session/adodb-session2.php');
        
        session_start();
-       # Every 10 page loads, reset cookie for safety.
+       # Approximately every 10 page loads, reset cookie for safety.
        # This is extremely simplistic example, better 
        # to regenerate only when the user logs in or changes
        # user privilege levels.
        if ((rand()%10) == 0) adodb_session_regenerate_id(); 
 </pre>
 <p>This function calls session_regenerate_id() internally or simulates it if the function does not exist.
+<h2>Vacuum/Optimize Database</h2>
+<p>During session garbage collection, if postgresql is detected,
+  ADOdb can be set to run VACUUM. If mysql is detected, then optimize database
+  could be called.You can turn this on or off using:</p>
+<pre>$turnOn = true; # or false
+ADODB_Session::optimize($turnOn);
+</pre>
+<p>The default  is optimization is disabled.</p>
+<h2><a name=compat></a>Backwards Compatability </h2>
+<p>The older method of connecting to ADOdb using global variables is still supported:</p>
+<pre> $ADODB_SESSION_DRIVER='mysql';
+ $ADODB_SESSION_CONNECT='localhost';
+ $ADODB_SESSION_USER ='root';
+ $ADODB_SESSION_PWD ='abc';
+ $ADODB_SESSION_DB ='phplens';
+ include('path/to/adodb/session/adodb-<strong>session2</strong>.php'); </pre>
+<p>In the above example, the only things you need to change in your code to upgrade
+  is </p>
+<ul>
+  <li>your session table format to the new one.</li>
+  <li>the include file from adodb-session.php to adodb-session2.php. </li>
+</ul>
 <h2>More Info</h2>
-<p>Also see the <a href="docs-adodb.htm">core ADOdb documentation</a>.
-</p>
+<p>Also see the <a href="docs-adodb.htm">core ADOdb documentation</a>. And if
+  you are interested in the obsolete adodb-session.php, see <a href="docs-session.old.htm">old
+    session documentation</a>. </p>
 </body>
 </html>
diff --git a/typo3/sysext/adodb/adodb/docs/docs-session.old.htm b/typo3/sysext/adodb/adodb/docs/docs-session.old.htm
new file mode 100644 (file)
index 0000000..bb99f4b
--- /dev/null
@@ -0,0 +1,313 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+  <title>ADODB Old Session Management Manual</title>
+  <meta http-equiv="Content-Type"
+ content="text/html; charset=iso-8859-1">
+  <style type="text/css">
+body, td {
+/*font-family: Arial, Helvetica, sans-serif;*/
+font-size: 11pt;
+}
+pre {
+font-size: 9pt;
+background-color: #EEEEEE; padding: .5em; margin: 0px;
+}
+.toplink {
+font-size: 8pt;
+}
+  </style>
+</head>
+<body style="background-color: rgb(255, 255, 255);">
+<h3>ADODB Session Management Manual</h3>
+<p>
+V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)
+</p>
+<p> <font size="1">This software is dual licensed using BSD-Style and
+LGPL. This means you can use it in compiled proprietary and commercial
+products. </font>
+<p>Useful ADOdb links: <a href="http://adodb.sourceforge.net/#download">Download</a>
+&nbsp; <a href="http://adodb.sourceforge.net/#docs">Other Docs</a>
+</p>
+<h3>Introduction</h3>
+<p>This documentation discusses the old adodb-session.php. 
+Here is the <a href=docs-session.htm>new documentation</a> on the newer adodb-session2.php.
+<p> We store state information specific to a user or web client in
+session variables. These session variables persist throughout a
+session, as the user moves from page to page. </p>
+<p>To use session variables, call session_start() at the beginning of
+your web page, before your HTTP headers are sent. Then for every
+variable you want to keep alive for the duration of the session, call
+session_register($variable_name). By default, the session handler will
+keep track of the session by using a cookie. You can save objects or
+arrays in session variables also.
+</p>
+<p>The default method of storing sessions is to store it in a file.
+However if you have special needs such as you:
+</p>
+<ul>
+  <li>Have multiple web servers that need to share session info</li>
+  <li>Need to do special processing of each session</li>
+  <li>Require notification when a session expires</li>
+</ul>
+<p>The ADOdb session handler provides you with the above
+additional capabilities by storing the session information as records
+in a database table that can be shared across multiple servers. </p>
+<p>These records will be garbage collected based on the php.ini [session] timeout settings. 
+You can register a notification function to notify you when the record has expired and 
+is about to be freed by the garbage collector.</p>
+<p><b>Important Upgrade Notice:</b> Since ADOdb 4.05, the session files
+have been moved to its own folder, adodb/session. This is a rewrite
+of the session code by Ross Smith. The old session code is in
+adodb/session/old. </p>
+<h4>ADOdb Session Handler Features</h4>
+<ul>
+  <li>Ability to define a notification function that is called when a
+session expires. Typically
+used to detect session logout and release global resources. </li>
+  <li>Optimization of database writes. We crc32 the session data and
+only perform an update
+to the session data if there is a data change. </li>
+  <li>Support for large amounts of session data with CLOBs (see
+adodb-session-clob.php). Useful
+for Oracle. </li>
+  <li>Support for encrypted session data, see
+adodb-cryptsession.php. Enabling encryption is simply a matter of
+including adodb-cryptsession.php instead of adodb-session.php. </li>
+</ul>
+<h3>Setup</h3>
+<p>There are 3 session management files that you can use:
+</p>
+<pre>adodb-session.php        : The default<br>adodb-session-clob.php   : Use this if you are storing DATA in clobs<br>adodb-cryptsession.php   : Use this if you want to store encrypted session data in the database<br><br>
+</pre>
+<p><strong>Examples</strong>
+<p><pre>
+ <font
+ color="#004040">    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';</b><br>    <br>    <b>include('adodb/session/adodb-session.php');</b><br>    session_start();<br>    <br>    #<br>    # Test session vars, the following should increment on refresh<br>    #<br>    $_SESSION['AVAR'] += 1;<br>    print "&lt;p&gt;\$_SESSION['AVAR']={$_SESSION['AVAR']}&lt;/p&gt;";<br></font></pre>
+<p>To force non-persistent connections, call adodb_session_open() first before session_start():
+<p>
+ <pre>
+ <font color="#004040"><br>    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';</b><br>    <br>    <b>include('adodb/session/adodb-session.php');<br>    adodb_sess_open(false,false,false);</b><br>    session_start();<br> </font>
+ </pre>
+<p> The 3rd parameter to adodb_sess_open($path, $sessname, $connectMode)  sets the connection method. You can pass in the following:</p>
+<table width="50%" border="1">
+  <tr>
+    <td><b>$connectMode</b></td>
+    <td><b>Connection Method</b></td>
+  </tr>
+  <tr>
+    <td>true</td>
+    <td><p>PConnect( )</p></td>
+  </tr>
+  <tr>
+    <td>false</td>
+    <td>Connect( )</td>
+  </tr>
+  <tr>
+    <td>'N'</td>
+    <td>NConnect( )</td>
+  </tr>
+  <tr>
+    <td>'P'</td>
+    <td>PConnect( )</td>
+  </tr>
+  <tr>
+    <td>'C'</td>
+    <td>Connect( )</td>
+  </tr>
+</table>
+<p>To use a encrypted sessions, simply replace the file adodb-session.php:</p>
+ <pre> <font
+ color="#004040"><br>    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';<br>    <br>    include('adodb/session/adodb-cryptsession.php');</b><br>    session_start();</font><br>
+ </pre>
+ <p>And the same technique for adodb-session-clob.php:</p>
+ <pre>  <font
+ color="#004040"><br>    include('adodb/adodb.inc.php');<br>    <br><b>    $ADODB_SESSION_DRIVER='mysql';<br>    $ADODB_SESSION_CONNECT='localhost';<br>    $ADODB_SESSION_USER ='scott';<br>    $ADODB_SESSION_PWD ='tiger';<br>    $ADODB_SESSION_DB ='sessiondb';<br>    <br>    include('adodb/session/adodb-session-clob.php');</b><br>    session_start();</font>
+ </pre>
+ <p>An alternative way to set persistant or non-persistent connections is to call the following function before session_start() is called.
+ <pre>
+       ADODB_Session::persist('P'); # 'C' for non-persistent connections
+ </pre>
+ <h4>Installation</h4>
+<p>1. Create this table in your database (MySQL syntax):
+<p><pre> <a
+ name="sessiontab"></a> <font color="#004040">
+   create table sessions (
+       SESSKEY char(32) not null,
+       EXPIRY int(11) unsigned not null,
+       EXPIREREF varchar(64),
+          DATA text not null,
+          primary key (sesskey)
+          );</font>
+ </pre>
+
+ <p>You may want to rename the 'data' field to 'session_data' as
+       'data' appears to be a reserved word for one or more of the following:
+       <ul>
+       <li>    ANSI SQL
+       <li>    IBM DB2
+       <li>    MS SQL Server
+       <li>    Postgres
+       <li>    SAP
+               </ul>
+<p>
+       If you do, then execute:
+<pre>
+               ADODB_Session::dataFieldName('session_data');
+</pre>
+ <p> For the adodb-session-clob.php version, create this:
+<p>  <pre>
+    <font
+ color="#004040"><br>    create table sessions (<br>       SESSKEY char(32) not null,<br>       EXPIRY int(11) unsigned not null,<br>       EXPIREREF varchar(64),<br>       DATA CLOB,<br>      primary key (sesskey)<br>  );</font>
+ </pre>
+ <p>2. Then define the following parameters. You can either modify this file, or define them before this file is included:
+ <pre>      <font
+ color="#004040"><br>    $ADODB_SESSION_DRIVER='database driver, eg. mysql or ibase';<br>    $ADODB_SESSION_CONNECT='server to connect to';<br>    $ADODB_SESSION_USER ='user';<br>    $ADODB_SESSION_PWD ='password';<br>    $ADODB_SESSION_DB ='database';<br>    $ADODB_SESSION_TBL = 'sessions'; # setting this is optional<br>    </font>
+ </pre><p>
+     When the session is created, $<b>ADODB_SESS_CONN</b> holds the connection object.<br>    <br>  3. Recommended is PHP 4.0.6 or later. There are documented session bugs in earlier versions of PHP.
+<h3>Notifications</h3>
+<p>You can receive notification when your session is cleaned up by the session garbage collector or
+when you call session_destroy().
+<p>PHP's session extension will automatically run a special garbage collection function based on
+your php.ini session.cookie_lifetime and session.gc_probability settings. This will in turn call
+adodb's garbage collection function, which can be setup to do notification.
+<p>
+<pre>
+       PHP Session --> ADOdb Session  --> Find all recs  --> Send          --> Delete queued
+       GC Function     GC Function        to be deleted      notification      records
+       executed at     called by                             for all recs
+       random time     Session Extension                     queued for deletion
+</pre>
+<p>When a session is created, we need to store a value in the session record (in the EXPIREREF field), typically 
+the userid of the session. Later when the session has expired,  just before the record is deleted,
+we reload the EXPIREREF field and call the notification function with the value of EXPIREREF, which 
+is the userid of the person being logged off.
+<p>ADOdb uses a global variable $ADODB_SESSION_EXPIRE_NOTIFY that you must predefine before session
+start to store the notification configuration. 
+$ADODB_SESSION_EXPIRE_NOTIFY is an array with 2 elements, the
+first being the name of the session variable you would like to store in
+the EXPIREREF field, and the 2nd is the notification function's name. </p>
+<p>For example, suppose we want to be notified when a user's session has expired,
+based on the userid. When the user logs in, we store the id in the global session variable
+$USERID. The function name is 'NotifyFn'. 
+<p>
+So we define (before session_start() is called): </p>
+<pre> <font color="#004040">
+       $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
+</font></pre>
+And when the NotifyFn is called (when the session expires), the
+$USERID is passed in as the first parameter, eg. NotifyFn($userid, $sesskey). The
+session key (which is the primary key of the record in the sessions
+table) is the 2nd parameter.
+<p> Here is an example of a Notification function that deletes some
+records in the database and temporary files: </p>
+<pre><font color="#004040">
+       function NotifyFn($expireref, $sesskey)
+       {
+               global $ADODB_SESS_CONN; # the session connection object
+               $user = $ADODB_SESS_CONN-&gt;qstr($expireref);
+               
+               $ADODB_SESS_CONN-&gt;Execute("delete from shopping_cart where user=$user");          
+               system("rm /work/tmpfiles/$expireref/*");
+       }</font>  
+                         </pre>
+<p> NOTE 1: If you have register_globals disabled in php.ini, then you
+will have to manually set the EXPIREREF. E.g. </p>
+<pre> <font color="#004040">
+$GLOBALS['USERID'] = GetUserID();
+$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');</font>
+</pre>
+<p> NOTE 2: If you want to change the EXPIREREF after the session
+record has been created, you will need to modify any session variable
+to force a database record update.
+</p>
+<h4>Neat Notification Tricks</h4>
+<p><i>ExpireRef</i> normally holds the user id of the current session.
+</p>
+<p>1. You can then write a session monitor, scanning expireref to see
+who is currently logged on.
+</p>
+<p>2. If you delete the sessions record for a specific user, eg.
+</p>
+<pre>delete from sessions where expireref = '$USER'<br></pre>
+then the user is logged out. Useful for ejecting someone from a
+site.
+<p>3. You can scan the sessions table to ensure no user
+can be logged in twice. Useful for security reasons.
+</p>
+<h3>Using Oracle CLOBs</h3>
+<p>Suppose you are storing the DATA field in a CLOB:
+ <pre><font color="#004040">
+   CREATE TABLE sessions (
+       SESSKEY VARCHAR(32) NOT NULL,
+       EXPIRY NUMBER(16)  NOT NULL,
+       EXPIREREF VARCHAR(64),
+       DATA CLOB,
+      PRIMARY KEY (sesskey)
+  );</font>
+ </pre> 
+ <p>Then your PHP code could look like this:
+        <pre>
+       ADODB_SESSION_DRIVER='oci8';
+       $ADODB_SESSION_CONNECT=$tnsname;
+       $ADODB_SESSION_USER ='scott';
+       $ADODB_SESSION_PWD = 'tiger';
+       $ADODB_SESSION_DB ='';
+       
+       $ADODB_SESSION_USE_LOBS = 'clob';
+       $ADODB_SESSION_TBL = 'sessions';
+       
+       $ADODB_SESS_DEBUG=0;
+       
+       include(ADODB_DIR.'/session/adodb-session.php');
+       
+       ADODB_Session::persist('P'); # use 'C' for non-persistent connects
+       
+       session_start();
+ </pre>
+ <p>Note that you can set persistance using ADODB_Session::persist('P').
+<h3>Compression/Encryption Schemes</h3>
+Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and
+compression schemes are supported. Currently, supported are:
+<p>
+<pre>  MD5Crypt (crypt.inc.php)<br>  MCrypt<br>  Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)<br>  GZip<br>  BZip2<br></pre>
+<p>These are stackable. E.g.
+<p><pre>ADODB_Session::filter(new ADODB_Compress_Bzip2());<br>ADODB_Session::filter(new ADODB_Encrypt_MD5());<br></pre>
+will compress and then encrypt the record in the database.
+<h3>adodb_session_regenerate_id()</h3>
+<p>Dynamically change the current session id with a newly generated one and update database. Currently only
+works with cookies. Useful to improve security by reducing the risk of session-hijacking.
+See this article on <a href=http://shiflett.org/articles/security-corner-feb2004>Session Fixation</a> for more info 
+on the theory behind this feature. Usage:
+<pre>
+       $ADODB_SESSION_DRIVER='mysql';
+       $ADODB_SESSION_CONNECT='localhost';
+       $ADODB_SESSION_USER ='root';
+       $ADODB_SESSION_PWD ='abc';
+       $ADODB_SESSION_DB ='phplens';
+       
+       include('path/to/adodb/session/adodb-session.php');
+       
+       session_start();
+       # Every 10 page loads, reset cookie for safety.
+       # This is extremely simplistic example, better 
+       # to regenerate only when the user logs in or changes
+       # user privilege levels.
+       if ((rand()%10) == 0) adodb_session_regenerate_id(); 
+</pre>
+<p>This function calls session_regenerate_id() internally or simulates it if the function does not exist.
+<h3>Vacuum/Optimize Database</h3>
+<p>During session garbage collection, if postgresql is detected,
+  ADOdb can be set to run VACUUM. If mysql is detected, then optimize database
+  could be called.You can turn this on or off using:</p>
+<pre>$turnOn = true; # or false
+ADODB_Session::optimize($turnOn);
+</pre>
+<p>The default for optimization is it is disabled.</p>
+<h2>More Info</h2>
+<p>Also see the <a href="docs-adodb.htm">core ADOdb documentation</a>.
+</p>
+</body>
+</html>
index 2d08bbb..d59a698 100644 (file)
@@ -8,6 +8,7 @@
 <body bgcolor=white>
 <table width=100% border=0><tr><td><h2>Tips on Writing Portable SQL &nbsp;</h2></td><td>
  <div align=right><img src="cute_icons_for_site/adodb.gif"></div></td></tr></table>
+  <p>Updated 6 Oct 2006. Added OffsetDate example.
   <p>Updated 18 Sep 2003. Added Portable Native SQL section.
 <p>
 
@@ -269,6 +270,10 @@ $sql2 = $datadict-><strong>CreateIndexSQL</strong>('idx_name_age', 'tabname', 'N
 <pre>$date1 = $connection-&gt;DBDate(time( ));<br>$date2 = $connection-&gt;DBTimeStamp('2002-02-23 13:03:33');</pre>
 <p>We also provide functions to convert database dates to Unix timestamps:</p>
 <pre>$unixts = $recordset-&gt;UnixDate('#2002-02-30#'); <font color="green"># MS Access date =&gt; unix timestamp</font></pre>
+<p>For date calculations, we have OffsetDate which allows you to calculate dates such as <i>yesterday</i> and <i>next week</i> in a RDBMS independant fashion. For example, if we want to set a field to 6 hour from now, use:
+<pre>
+$sql = 'update table set dtimefld='.$db-&gt;OffsetDate($db-&gtsysTimeStamp, 6/24).' where ...';
+</pre>
 <p>The maximum length of a char/varchar field is also database specific. You can 
   only assume that field lengths of up to 250 characters are supported. This is 
   normally impractical for web based forum or content management systems. You 
index aae91aa..a37ba51 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index 9c40247..027fa32 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index 6fac23a..8131619 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index e24992c..44dc982 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
 Released under both BSD license and Lesser GPL library license. 
 Whenever there is any discrepancy between the two licenses, 
 the BSD license will take precedence. See License.txt. 
index 42ea898..6926706 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
@@ -35,6 +35,7 @@ class  ADODB_ado_mssql extends ADODB_ado {
        var $ansiOuter = true; // for mssql7 or later
        var $substr = "substring";
        var $length = 'len';
+       var $_dropSeqSQL = "drop table %s";
        
        //var $_inTransaction = 1; // always open recordsets, so no transaction problems.
        
index 442af0e..a5e748b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
@@ -20,6 +20,7 @@ include_once(ADODB_DIR."/drivers/adodb-ibase.inc.php");
 class ADODB_borland_ibase extends ADODB_ibase {
        var $databaseType = "borland_ibase";    
        
+       
        function ADODB_borland_ibase()
        {
                $this->ADODB_ibase();
index 638c99c..bbd4e61 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 61d600b..964a266 100644 (file)
@@ -1,13 +1,15 @@
 <?php
 /* 
-  V4.90 8 June 2006  (c) 2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2006 John Lim (jlim#natsoft.com.my). All rights reserved.
 
-This is a version of the ADODB driver for DB2.  It uses the 'ibm_db2' PECL extension for PHP
-  (http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2.
+  This is a version of the ADODB driver for DB2.  It uses the 'ibm_db2' PECL extension
+  for PHP (http://pecl.php.net/package/ibm_db2), which in turn requires DB2 V8.2.2 or
+  higher.
 
-  Tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2.
+  Originally tested with PHP 5.1.1 and Apache 2.0.55 on Windows XP SP2.
+  More recently tested with PHP 5.1.2 and Apache 2.0.55 on Windows XP SP2.
 
-  This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard@rogers.com".
+  This file was ported from "adodb-odbc.inc.php" by Larry Menard, "larry.menard#rogers.com".
   I ripped out what I believed to be a lot of redundant or obsolete code, but there are
   probably still some remnants of the ODBC support in this file; I'm relying on reviewers
   of this code to point out any other things that can be removed.
@@ -32,7 +34,6 @@ class ADODB_db2 extends ADOConnection {
        var $sysTimeStamp = 'CURRENT TIMESTAMP';
        
        var $fmtTimeStamp = "'Y-m-d-H.i.s'";
-       #var $fmtTimeStamp = "'Y-m-d, h:i:sA'";
        var $replaceQuote = "''"; // string to use to replace quotes
        var $dataProvider = "db2";
        var $hasAffectedRows = true;
@@ -42,7 +43,9 @@ class ADODB_db2 extends ADOConnection {
        var $useFetchArray = false; // setting this to true will make array elements in FETCH_ASSOC mode case-sensitive
                                                                // breaking backward-compat
        var $_bindInputArray = false;   
-       var $_genSeqSQL = "create table %s (id integer)";
+       var $_genIDSQL = "VALUES NEXTVAL FOR %s";
+       var $_genSeqSQL = "CREATE SEQUENCE %s START WITH 1 NO MAXVALUE NO CYCLE";
+       var $_dropSeqSQL = "DROP SEQUENCE %s";
        var $_autocommit = true;
        var $_haserrorfunctions = true;
        var $_lastAffectedRows = 0;
@@ -82,7 +85,8 @@ class ADODB_db2 extends ADOConnection {
                // For db2_connect(), there is an optional 4th arg.  If present, it must be
                // an array of valid options.  So far, we don't use them.
 
-               $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+               $this->_errorMsg = @db2_conn_errormsg();
                if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
                
                return $this->_connectionID != false;
@@ -109,19 +113,31 @@ class ADODB_db2 extends ADOConnection {
                }
                if (isset($php_errormsg)) $php_errormsg = '';
 
-               $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+               $this->_errorMsg = @db2_conn_errormsg();
                if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID);
                if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
                
                return $this->_connectionID != false;
        }
 
+       // format and return date string in database timestamp format
+       function DBTimeStamp($ts)
+       {
+               if (empty($ts) && $ts !== 0) return 'null';
+               if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts);
+               return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')";
+       }
        
        // 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;
+
+               /* use TO_CHAR() if $fmt is TO_CHAR() allowed fmt */
+               if ($fmt== 'Y-m-d H:i:s')
+                       return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')";
+
                $s = '';
                
                $len = strlen($fmt);
@@ -131,31 +147,38 @@ class ADODB_db2 extends ADOConnection {
                        switch($ch) {
                        case 'Y':
                        case 'y':
+                               if ($len==1) return "year($col)";
                                $s .= "char(year($col))";
                                break;
                        case 'M':
+                               if ($len==1) return "monthname($col)";
                                $s .= "substr(monthname($col),1,3)";
                                break;
                        case 'm':
+                               if ($len==1) return "month($col)";
                                $s .= "right(digits(month($col)),2)";
                                break;
                        case 'D':
                        case 'd':
+                               if ($len==1) return "day($col)";
                                $s .= "right(digits(day($col)),2)";
                                break;
                        case 'H':
                        case 'h':
+                               if ($len==1) return "hour($col)";
                                if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";        
                                else $s .= "''";
                                break;
                        case 'i':
                        case 'I':
+                               if ($len==1) return "minute($col)";
                                if ($col != $this->sysDate)
                                        $s .= "right(digits(minute($col)),2)";
                                        else $s .= "''";
                                break;
                        case 'S':
                        case 's':
+                               if ($len==1) return "second($col)";
                                if ($col != $this->sysDate)
                                        $s .= "right(digits(second($col)),2)";
                                else $s .= "''";
@@ -207,11 +230,9 @@ class ADODB_db2 extends ADOConnection {
                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)");
+               return true;
        }
        
-       var $_dropSeqSQL = 'drop table %s';
        function DropSequence($seqname)
        {
                if (empty($this->_dropSeqSQL)) return false;
@@ -228,37 +249,17 @@ class ADODB_db2 extends ADOConnection {
        {       
                // if you have to modify the parameter below, your database is overloaded,
                // or you need to implement generation of id's yourself!
-               $MAXLOOPS = 100;
-               while (--$MAXLOOPS>=0) {
-                       $num = $this->GetOne("select id from $seq");
-                       if ($num === false) {
-                               $this->Execute(sprintf($this->_genSeqSQL ,$seq));       
-                               $start -= 1;
-                               $num = '0';
-                               $ok = $this->Execute("insert into $seq values($start)");
-                               if (!$ok) return false;
-                       } 
-                       $this->Execute("update $seq set id=id+1 where id=$num");
-                       
-                       if ($this->affected_rows() > 0) {
-                               $num += 1;
-                               $this->genID = $num;
+               $num = $this->GetOne("VALUES NEXTVAL FOR $seq");
                                return $num;
                        }
-               }
-               if ($fn = $this->raiseErrorFn) {
-                       $fn($this->databaseType,'GENID',-32000,"Unable to generate unique id after $MAXLOOPS attempts",$seq,$num);
-               }
-               return false;
-       }
 
 
        function ErrorMsg()
        {
                if ($this->_haserrorfunctions) {
                        if ($this->_errorMsg !== false) return $this->_errorMsg;
-                       if (empty($this->_connectionID)) return @db2_errormsg();
-                       return @db2_errormsg($this->_connectionID);
+                       if (empty($this->_connectionID)) return @db2_conn_errormsg();
+                       return @db2_conn_errormsg($this->_connectionID);
                } else return ADOConnection::ErrorMsg();
        }
        
@@ -271,8 +272,8 @@ class ADODB_db2 extends ADOConnection {
                                return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
                        }
 
-                       if (empty($this->_connectionID)) $e = @db2_error(); 
-                       else $e = @db2_error($this->_connectionID);
+                       if (empty($this->_connectionID)) $e = @db2_conn_error(); 
+                       else $e = @db2_conn_error($this->_connectionID);
                        
                         // bug in 4.0.6, error number can be corrupted string (should be 6 digits)
                         // so we check and patch
@@ -343,9 +344,53 @@ class ADODB_db2 extends ADOConnection {
                return $arr2;
        }
        
+       function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE )
+       {
+       global $ADODB_FETCH_MODE;
        
+               if ($this->uCaseTables) $table = strtoupper($table);
+               $schema = '';
+               $this->_findschema($table,$schema);
+
+               $savem = $ADODB_FETCH_MODE;
+               $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+               $qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table);
+               if (!$qid) {
+                       $ADODB_FETCH_MODE = $savem;
+                       return false;
+               }
+               $rs = new ADORecordSet_db2($qid);
+
+               $ADODB_FETCH_MODE = $savem;
+               /*
+               $rs->fields indices
+               0 PKTABLE_CAT
+               1 PKTABLE_SCHEM
+               2 PKTABLE_NAME
+               3 PKCOLUMN_NAME
+               4 FKTABLE_CAT
+               5 FKTABLE_SCHEM
+               6 FKTABLE_NAME
+               7 FKCOLUMN_NAME
+               */      
+               if (!$rs) return false;
+
+               $foreign_keys = array();                 
+               while (!$rs->EOF) {
+                       if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
+                               if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]])) 
+                                       $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array();
+                               $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3];                      
+                       }
+                       $rs->MoveNext();
+               }
+
+               $rs->Close();
+               return $foreign_key;
+       }
        
-       function &MetaTables($ttype=false)
+       
+       function &MetaTables($ttype=false,$schema=false)
        {
        global $ADODB_FETCH_MODE;
        
@@ -372,11 +417,12 @@ class ADODB_db2 extends ADOConnection {
                for ($i=0; $i < sizeof($arr); $i++) {
                        if (!$arr[$i][2]) continue;
                        $type = $arr[$i][3];
+                       $schemaval = ($schema) ? $arr[$i][1].'.' : '';
                        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];
+                                       if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2];
+                               } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
+                       } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
                }
                return $arr2;
        }
@@ -505,12 +551,41 @@ See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2
                                        $fld->max_length = $rs->fields[7];
                                $fld->not_null = !empty($rs->fields[10]);
                                $fld->scale = $rs->fields[8];
+                               $fld->primary_key = false;
                                $retarr[strtoupper($fld->name)] = $fld; 
                        } else if (sizeof($retarr)>0)
                                break;
                        $rs->MoveNext();
                }
-               $rs->Close(); //-- crashes 4.03pl1 -- why?
+               $rs->Close(); 
+               if (empty($retarr)) $retarr = false;
+
+             $qid = db2_primary_keys($this->_connectionID, "", $schema, $table);
+               if (empty($qid)) return $false;
+               
+               $rs =& new ADORecordSet_db2($qid);
+               $ADODB_FETCH_MODE = $savem;
+               
+               if (!$rs) return $retarr;
+               $rs->_fetch();
+               
+               /*
+               $rs->fields indices
+               0 TABLE_CAT
+               1 TABLE_SCHEM
+               2 TABLE_NAME
+               3 COLUMN_NAME
+               4 KEY_SEQ
+               5 PK_NAME
+               */
+               while (!$rs->EOF) {
+                       if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
+                               $retarr[strtoupper($rs->fields[3])]->primary_key = true;
+                       } else if (sizeof($retarr)>0)
+                               break;
+                       $rs->MoveNext();
+               }
+               $rs->Close(); 
                
                if (empty($retarr)) $retarr = false;
                return $retarr;
@@ -548,8 +623,8 @@ See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2
                        
                        if (! db2_execute($stmtid,$inputarr)) {
                                if ($this->_haserrorfunctions) {
-                                       $this->_errorMsg = db2_errormsg();
-                                       $this->_errorCode = db2_error();
+                                       $this->_errorMsg = db2_stmt_errormsg();
+                                       $this->_errorCode = db2_stmt_error();
                                }
                                return false;
                        }
@@ -558,13 +633,13 @@ See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2
                        $stmtid = $sql[1];
                        if (!db2_execute($stmtid)) {
                                if ($this->_haserrorfunctions) {
-                                       $this->_errorMsg = db2_errormsg();
-                                       $this->_errorCode = db2_error();
+                                       $this->_errorMsg = db2_stmt_errormsg();
+                                       $this->_errorCode = db2_stmt_error();
                                }
                                return false;
                        }
                } else
-                       $stmtid = db2_exec($this->_connectionID,$sql);
+                       $stmtid = @db2_exec($this->_connectionID,$sql);
                
                $this->_lastAffectedRows = 0;
                if ($stmtid) {
@@ -586,6 +661,7 @@ See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/db2/htm/db2
                                $this->_errorCode = db2_stmt_error();
                        } else
                                $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
+
                }
                return $stmtid;
        }
index 1cf0d4d..0f05226 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
- @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index c26fc98..f3d7a13 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
@@ -19,7 +19,7 @@ class ADODB_firebird extends ADODB_ibase {
        var $databaseType = "firebird"; 
        var $dialect = 3;
        
-       var $sysTimeStamp = "cast('NOW' as timestamp)";
+       var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)";
        
        function ADODB_firebird()
        {       
index d8d3bf1..efd8a0c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.  
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.  
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -47,7 +47,7 @@ class ADODB_ibase extends ADOConnection {
        var $buffers = 0;
        var $dialect = 1;
        var $sysDate = "cast('TODAY' as timestamp)";
-       var $sysTimeStamp = "cast('NOW' as timestamp)";
+       var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)";
        var $ansiOuter = true;
        var $hasAffectedRows = false;
        var $poorAffectedRows = true;
@@ -556,7 +556,7 @@ class ADODB_ibase extends ADOConnection {
        
        // old blobdecode function
        // still used to auto-decode all blob's
-       function _BlobDecode( $blob ) 
+       function _BlobDecode_old( $blob ) 
        {
                $blobid = ibase_blob_open($this->_connectionID, $blob );
                $realblob = ibase_blob_get( $blobid,$this->maxblobsize); // 2nd param is max size of blob -- Kevin Boillet <kevinboillet@yahoo.fr>
@@ -568,6 +568,32 @@ class ADODB_ibase extends ADOConnection {
                return( $realblob );
        } 
        
+       function _BlobDecode( $blob ) 
+    {
+        if  (ADODB_PHPVER >= 0x5000) {
+            $blob_data = ibase_blob_info($this->_connectionID, $blob );
+            $blobid = ibase_blob_open($this->_connectionID, $blob );
+        } else {
+
+            $blob_data = ibase_blob_info( $blob );
+            $blobid = ibase_blob_open( $blob );
+        }
+
+        if( $blob_data[0] > $this->maxblobsize ) {
+
+            $realblob = ibase_blob_get($blobid, $this->maxblobsize);
+
+            while($string = ibase_blob_get($blobid, 8192)){
+                $realblob .= $string; 
+            }
+        } else {
+            $realblob = ibase_blob_get($blobid, $blob_data[0]);
+        }
+
+        ibase_blob_close( $blobid );
+        return( $realblob );
+       }
+       
        function UpdateBlobFile($table,$column,$path,$where,$blobtype='BLOB') 
        { 
                $fd = fopen($path,'rb'); 
index 99b9c12..52b2cf6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+* @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
 * Released under both BSD license and Lesser GPL library license.
 * Whenever there is any discrepancy between the two licenses,
 * the BSD license will take precedence.
index 1f52b63..c02a471 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim. All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim. All rights reserved.
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
   the BSD license will take precedence.
@@ -58,7 +58,7 @@ class ADODB_informix72 extends ADOConnection {
        {
                // alternatively, use older method:
                //putenv("DBDATE=Y4MD-");
-
+               
                // force ISO date format
                putenv('GL_DATE=%Y-%m-%d');
                
@@ -192,7 +192,7 @@ class ADODB_informix72 extends ADOConnection {
                        }
 
                        $rs->Close();
-                       $rspKey->Close(); //!eos
+                       $rspkey->Close(); //!eos
                        return $retarr; 
                }
 
index 05f20cb..c4137cd 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
    Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 7693059..53e6d95 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
@@ -112,19 +112,21 @@ class ADODB_mssql extends ADOConnection {
        {
        global $ADODB_FETCH_MODE;
        
-               $stmt = $this->PrepareSP('sp_server_info');
-               $val = 2;
+       
                if ($this->fetchMode === false) {
                        $savem = $ADODB_FETCH_MODE;
                        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
                } else 
                        $savem = $this->SetFetchMode(ADODB_FETCH_NUM);
+                               
+               if (0) {
+                       $stmt = $this->PrepareSP('sp_server_info');
+                       $val = 2;
+                       $this->Parameter($stmt,$val,'attribute_id');
+                       $row = $this->GetRow($stmt);
+               }
                
-               
-               $this->Parameter($stmt,$val,'attribute_id');
-               $row = $this->GetRow($stmt);
-               
-               //$row = $this->GetRow("execute sp_server_info 2");
+               $row = $this->GetRow("execute sp_server_info 2");
                
                
                if ($this->fetchMode === false) {
@@ -410,7 +412,7 @@ order by constraint_name, referenced_table_name, keyno";
        { 
                if(@mssql_select_db("master")) { 
                                 $qry=$this->metaDatabasesSQL; 
-                                if($rs=@mssql_query($qry)){ 
+                                if($rs=@mssql_query($qry,$this->_connectionID)){ 
                                                 $tmpAr=$ar=array(); 
                                                 while($tmpAr=@mssql_fetch_row($rs)) 
                                                                 $ar[]=$tmpAr[0]; 
@@ -698,7 +700,7 @@ order by constraint_name, referenced_table_name, keyno";
                        }
                        $decl = $this->qstr($decl);
                        if ($this->debug) ADOConnection::outp("<font size=-1>sp_executesql N{$sql[1]},N$decl,$params</font>");
-                       $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params");
+                       $rez = mssql_query("sp_executesql N{$sql[1]},N$decl,$params", $this->_connectionID);
                        
                } else if (is_array($sql)) {
                        # PrepareSP()
index 058dcf7..5e7ae1f 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
-* @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+* @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
 * Released under both BSD license and Lesser GPL library license.
 * Whenever there is any discrepancy between the two licenses,
 * the BSD license will take precedence.
index d7e96a7..8e79d4a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -24,7 +24,7 @@ class ADODB_mysql extends ADOConnection {
        var $hasInsertID = true;
        var $hasAffectedRows = true;    
        var $metaTablesSQL = "SHOW TABLES";     
-       var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
+       var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
        var $fmtTimeStamp = "'Y-m-d H:i:s'";
        var $hasLimit = true;
        var $hasMoveFirst = true;
@@ -341,8 +341,11 @@ class ADODB_mysql extends ADOConnection {
        function OffsetDate($dayFraction,$date=false)
        {               
                if (!$date) $date = $this->sysDate;
+               
                $fraction = $dayFraction * 24 * 3600;
-               return "from_unixtime(unix_timestamp($date)+$fraction)";
+               return $date . ' + INTERVAL ' .  $fraction.' SECOND';
+               
+//             return "from_unixtime(unix_timestamp($date)+$fraction)";
        }
        
        // returns true or false
index 0915942..415ae2b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -14,7 +14,7 @@ Based on adodb 3.40
 */ 
 
 // security - hide paths
-//if (!defined('ADODB_DIR')) die();
+if (!defined('ADODB_DIR')) die();
 
 if (! defined("_ADODB_MYSQLI_LAYER")) {
  define("_ADODB_MYSQLI_LAYER", 1 );
@@ -32,7 +32,7 @@ class ADODB_mysqli extends ADOConnection {
        var $hasInsertID = true;
        var $hasAffectedRows = true;    
        var $metaTablesSQL = "SHOW TABLES";     
-       var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
+       var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
        var $fmtTimeStamp = "'Y-m-d H:i:s'";
        var $hasLimit = true;
        var $hasMoveFirst = true;
@@ -430,9 +430,12 @@ class ADODB_mysqli extends ADOConnection {
        // dayFraction is a day in floating point
        function OffsetDate($dayFraction,$date=false)
        {               
-               if (!$date) 
-                 $date = $this->sysDate;
-               return "from_unixtime(unix_timestamp($date)+($dayFraction)*24*3600)";
+               if (!$date) $date = $this->sysDate;
+               
+               $fraction = $dayFraction * 24 * 3600;
+               return $date . ' + INTERVAL ' .  $fraction.' SECOND';
+               
+//             return "from_unixtime(unix_timestamp($date)+$fraction)";
        }
        
        function &MetaTables($ttype=false,$showSchema=false,$mask=false) 
index c37d4bc..715d693 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 6ed02c0..d03fab9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  
   First cut at the Netezza Driver by Josh Eldridge joshuae74#hotmail.com
  Based on the previous postgres drivers.
index c7a1f6b..ebca543 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
 
-  version V4.90 8 June 2006 (c) 2000-2006 John Lim. All rights reserved.
+  version V4.93 10 Oct 2006 (c) 2000-2006 John Lim. All rights reserved.
 
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
@@ -63,7 +63,7 @@ class ADODB_oci8 extends ADOConnection {
        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 $metaTablesSQL = "select table_name,table_type from cat where table_type in ('TABLE','VIEW') and table_name not like 'BIN\$%'"; // bin$ tables are recycle bin tables
        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;
@@ -75,6 +75,7 @@ class ADODB_oci8 extends ADOConnection {
        var $noNullStrings = false;
        var $connectSID = false;
        var $_bind = false;
+       var $_nestedSQL = true;
        var $_hasOCIFetchStatement = false;
        var $_getarray = false; // currently not working
        var $leftOuter = '';  // oracle wierdness, $col = $value (+) for LEFT OUTER, $col (+)= $value for RIGHT OUTER
@@ -118,8 +119,8 @@ class ADODB_oci8 extends ADOConnection {
                        $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';
+                       if ($rs->fields[1] == 'NUMBER') {
+                               if ($rs->fields[3] == 0) $fld->type = 'INT';
                        $fld->max_length = $rs->fields[4];
                }       
                        $fld->not_null = (strncmp($rs->fields[5], 'NOT',3) === 0);
index 2aed0e0..4073b60 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /** 
- * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license. 
  * Whenever there is any discrepancy between the two licenses, 
  * the BSD license will take precedence. 
index a033816..dc75c79 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim. All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim. All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index ae9c588..370ab55 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index 96e5dc0..7a728ca 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index d9186a1..3b57bc5 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
@@ -136,6 +136,47 @@ order by constraint_name, referenced_table_name, keyno";
                return $arr;
        }
        
+       
+       function &MetaIndexes($table,$primary=false)
+       {
+               $table = $this->qstr($table);
+
+               $sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno, 
+                       CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,
+                       CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique
+                       FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id 
+                       INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid 
+                       INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid
+                       WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table
+                       ORDER BY O.name, I.Name, K.keyno";
+
+               global $ADODB_FETCH_MODE;
+               $save = $ADODB_FETCH_MODE;
+        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
+        if ($this->fetchMode !== FALSE) {
+               $savem = $this->SetFetchMode(FALSE);
+        }
+        
+        $rs = $this->Execute($sql);
+        if (isset($savem)) {
+               $this->SetFetchMode($savem);
+        }
+        $ADODB_FETCH_MODE = $save;
+
+        if (!is_object($rs)) {
+               return FALSE;
+        }
+
+               $indexes = array();
+               while ($row = $rs->FetchRow()) {
+                       if (!$primary && $row[5]) continue;
+                       
+            $indexes[$row[0]]['unique'] = $row[6];
+            $indexes[$row[0]]['columns'][] = $row[1];
+       }
+        return $indexes;
+       }
+       
        function _query($sql,$inputarr)
        {
                if (is_string($sql)) $sql = str_replace('||','+',$sql);
index a77bcd2..9b3e540 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index 270d2fa..402b226 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
   the BSD license will take precedence. See License.txt.
@@ -150,6 +150,8 @@ class ADODB_odbtp extends ADOConnection{
     function _connect($HostOrInterface, $UserOrDSN='', $argPassword='', $argDatabase='')
        {
                $this->_connectionID = @odbtp_connect($HostOrInterface,$UserOrDSN,$argPassword,$argDatabase);
+               odbtp_convert_datetime($this->_connectionID,true);
+               
                if ($this->_connectionID === false) {
                        $this->_errorMsg = $this->ErrorMsg() ;
                        return false;
index f291bb3..2a8b44d 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-       V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+       V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
   the BSD license will take precedence. See License.txt.
index 69df13b..5329770 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index e002efa..3460349 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
@@ -325,7 +325,8 @@ class ADODB_pdo extends ADOConnection {
                $obj = new ADOPDOStatement($stmt,$this);
                return $obj;
        }
-
+       
+       
        /* returns queryID or false */
        function _query($sql,$inputarr=false) 
        {
@@ -334,7 +335,8 @@ class ADODB_pdo extends ADOConnection {
                } else {
                        $stmt = $this->_connectionID->prepare($sql);
                }
-               
+               #adodb_backtrace();
+               #var_dump($this->_bindInputArray);
                if ($stmt) {
                        $this->_driver->debug = $this->debug;
                        if ($inputarr) $ok = $stmt->execute($inputarr);
@@ -515,7 +517,7 @@ class ADORecordSet_pdo extends ADORecordSet {
                }
                //adodb_pr($arr);
                $o->name = $arr['name'];
-               if (isset($arr['native_type'])) $o->type = $arr['native_type'];
+               if (isset($arr['native_type']) && $arr['native_type'] <> "null") $o->type = $arr['native_type'];
                else $o->type = adodb_pdo_type($arr['pdo_type']);
                $o->max_length = $arr['len'];
                $o->precision = $arr['precision'];
index 54a681d..cdfcaae 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 3cec6d1..fc803b7 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -12,20 +12,31 @@ V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights rese
 
 class ADODB_pdo_mysql extends ADODB_pdo {
        var $metaTablesSQL = "SHOW TABLES";     
-       var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
-       var $_bindInputArray = false;
+       var $metaColumnsSQL = "SHOW COLUMNS FROM `%s`";
        var $sysDate = 'CURDATE()';
        var $sysTimeStamp = 'NOW()';
-       
+       var $nameQuote = '`';
+
        function _init($parentDriver)
        {
        
                $parentDriver->hasTransactions = false;
-               $parentDriver->_bindInputArray = true;
+               $parentDriver->_bindInputArray = false;
                $parentDriver->hasInsertID = true;
                $parentDriver->_connectionID->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
        }
        
+               // dayFraction is a day in floating point
+       function OffsetDate($dayFraction,$date=false)
+       {               
+               if (!$date) $date = $this->sysDate;
+               
+               $fraction = $dayFraction * 24 * 3600;
+               return $date . ' + INTERVAL ' .  $fraction.' SECOND';
+               
+//             return "from_unixtime(unix_timestamp($date)+$fraction)";
+       }
+       
        function ServerInfo()
        {
                $arr['description'] = ADOConnection::GetOne("select version()");
index 5c2519c..ebfd4a3 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -26,7 +26,7 @@ class ADODB_pdo_oci extends ADODB_pdo_base {
        function _init($parentDriver)
        {
                $parentDriver->_bindInputArray = true;
-               
+               $parentDriver->_nestedSQL = true;
                if ($this->_initdate) {
                        $parentDriver->Execute("ALTER SESSION SET NLS_DATE_FORMAT='".$this->NLS_DATE_FORMAT."'");
                }
index d1cc363..5c0c531 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -59,6 +59,7 @@ WHERE relkind in ('r','v') AND (c.relname='%s' or c.relname = lower('%s'))
        
                $parentDriver->hasTransactions = false; ## <<< BUG IN PDO pgsql driver
                $parentDriver->hasInsertID = true;
+               $parentDriver->_nestedSQL = true;
        }
        
        function ServerInfo()
index 496a947..4dd3f82 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
- V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 14f7b00..3921f81 100644 (file)
@@ -1,6 +1,6 @@
-<?php
+_connec<?php
 /*
- V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -237,6 +237,9 @@ select viewname,'V' from pg_views where viewname like $mask";
        function qstr($s,$magic_quotes=false)
        {
                if (!$magic_quotes) {
+                       if (ADODB_PHPVER >= 0x5200) {
+                               return  "'".pg_escape_string($this->_connectionID,$s)."'";
+                       } 
                        if (ADODB_PHPVER >= 0x4200) {
                                return  "'".pg_escape_string($s)."'";
                        }
@@ -424,6 +427,7 @@ select viewname,'V' from pg_views where viewname like $mask";
        */
        function BlobEncode($blob)
        {
+               if (ADODB_PHPVER >= 0x5200) return pg_escape_bytea($this->_connectionID, $blob);
                if (ADODB_PHPVER >= 0x4200) return pg_escape_bytea($blob);
                
                /*92=backslash, 0=null, 39=single-quote*/
@@ -657,7 +661,7 @@ WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\'))';
                        if ($str)  {
                                $host = split(":", $str);
                                if ($host[0]) $str = "host=".adodb_addslashes($host[0]);
-                               else $str = 'host=localhost';
+                               else $str = '';
                                if (isset($host[1])) $str .= " port=$host[1]";
                                else if (!empty($this->port)) $str .= " port=".$this->port;
                        }
@@ -683,6 +687,12 @@ WHERE (c2.relname=\'%s\' or c2.relname=lower(\'%s\'))';
                }
                if ($this->_connectionID === false) return false;
                $this->Execute("set datestyle='ISO'");
+               
+               $info = $this->ServerInfo();
+               $this->pgVersion = (float) substr($info['version'],0,3);
+               if ($this->pgVersion >= 7.1) { // good till version 999
+                       $this->_nestedSQL = true;
+               }
                return true;
        }
        
index fb2c956..83b225c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
- V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -74,21 +74,21 @@ class ADODB_postgres7 extends ADODB_postgres64 {
                
                $rs =& $this->Execute($sql);
                
-               if ($rs && !$rs->EOF) {
-                       $arr =& $rs->GetArray();
-                       $a = array();
-                       foreach($arr as $v)
-                       {
-                               $data = explode(chr(0), $v['args']);
-                               if ($upper) {
-                                       $a[strtoupper($data[2])][] = strtoupper($data[4].'='.$data[5]);
-                               } else {
-                               $a[$data[2]][] = $data[4].'='.$data[5];
-                               }
+               if (!$rs || $rs->EOF) return false;
+               
+               $arr =& $rs->GetArray();
+               $a = array();
+               foreach($arr as $v) {
+                       $data = explode(chr(0), $v['args']);
+                       $size = count($data)-1; //-1 because the last node is empty
+                       for($i = 4; $i < $size; $i++) {
+                               if ($upper) 
+                                       $a[strtoupper($data[2])][] = strtoupper($data[$i].'='.$data[++$i]);
+                               else 
+                                       $a[$data[2]][] = $data[$i].'='.$data[++$i];
                        }
-                       return $a;
                }
-               return false;
+               return $a;
        }
 
        function _query($sql,$inputarr)
index b81f101..ab364a7 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
- V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 7759890..82af449 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index 7e968ac..53c74b4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index 5e2fcd4..206e1e1 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-version V4.90 8 June 2006 (c) 2000-2006  John Lim (jlim#natsoft.com.my).  All rights
+version V4.93 10 Oct 2006 (c) 2000-2006  John Lim (jlim#natsoft.com.my).  All rights
 reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
index 70b1f02..8f93fda 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
index f8c6fbc..b46fc9e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
   the BSD license will take precedence.
index ef9948c..023534e 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim. All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim. All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index dfc0835..02e4757 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /*
-  V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+  V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence.
@@ -9,6 +9,10 @@
   
   Contributed by Interakt Online. Thx Cristian MARIN cristic#interaktonline.com
 */
+
+
+require_once ADODB_DIR."/drivers/adodb-sybase.inc.php";
+
 class ADODB_sybase_ase extends ADODB_sybase {
        var $databaseType = "sybase_ase";
        
index 1e4237f..4f15f42 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index e2d1944..5b5ef11 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index 7d7e96f..dd82708 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index 3002521..f652c76 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index 62f1778..062e2a2 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index 654f9d2..48fbcd8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index dccfac0..37656a6 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /* 
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
   Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. See License.txt. 
index 290171f..3c22f38 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /** 
- * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license. 
  * Whenever there is any discrepancy between the two licenses, 
  * the BSD license will take precedence. 
index 0527529..b1106c0 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /** 
- * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license. 
  * Whenever there is any discrepancy between the two licenses, 
  * the BSD license will take precedence. 
index 4cadaa3..c2cec67 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /** 
- * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+ * @version V4.93 10 Oct 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
  * Released under both BSD license and Lesser GPL library license. 
   Whenever there is any discrepancy between the two licenses, 
   the BSD license will take precedence. 
index 91d15e3..2ecc46d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
index 3134408..ead02c0 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
index 677c18e..eb70927 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
@@ -16,7 +16,10 @@ This file is provided for backwards compatibility purposes
 
 */
 
-require_once dirname(__FILE__) . '/adodb-session.php';
+if (!defined('ADODB_SESSION')) {
+       require_once dirname(__FILE__) . '/adodb-session.php';
+}
+
 require_once  ADODB_SESSION . '/adodb-encrypt-md5.php';
 
 ADODB_Session::filter(new ADODB_Encrypt_MD5());
diff --git a/typo3/sysext/adodb/adodb/session/adodb-cryptsession2.php b/typo3/sysext/adodb/adodb/session/adodb-cryptsession2.php
new file mode 100644 (file)
index 0000000..06d2ecf
--- /dev/null
@@ -0,0 +1,27 @@
+<?php
+
+
+/*
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+         Contributed by Ross Smith (adodb@netebb.com). 
+  Released under both BSD license and Lesser GPL library license.
+  Whenever there is any discrepancy between the two licenses,
+  the BSD license will take precedence.
+         Set tabs to 4 for best viewing.
+*/
+
+/*
+
+This file is provided for backwards compatibility purposes
+
+*/
+
+if (!defined('ADODB_SESSION')) {
+       require_once dirname(__FILE__) . '/adodb-session2.php';
+}
+
+require_once  ADODB_SESSION . '/adodb-encrypt-md5.php';
+
+ADODB_Session::filter(new ADODB_Encrypt_MD5());
+
+?>
\ No newline at end of file
index 0a5174b..b6cdd41 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
index fc62c56..4ee5120 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
index b882714..07e10c2 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
index 1d470ea..0a19366 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
@@ -16,8 +16,9 @@ This file is provided for backwards compatibility purposes
 
 */
 
-require_once dirname(__FILE__) . '/adodb-session.php';
-
+if (!defined('ADODB_SESSION')) {
+       require_once dirname(__FILE__) . '/adodb-session.php';
+}
 ADODB_Session::clob('CLOB');
 
 ?>
\ No newline at end of file
diff --git a/typo3/sysext/adodb/adodb/session/adodb-session-clob2.php b/typo3/sysext/adodb/adodb/session/adodb-session-clob2.php
new file mode 100644 (file)
index 0000000..b684533
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+
+
+/*
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+         Contributed by Ross Smith (adodb@netebb.com). 
+  Released under both BSD license and Lesser GPL library license.
+  Whenever there is any discrepancy between the two licenses,
+  the BSD license will take precedence.
+         Set tabs to 4 for best viewing.
+*/
+
+/*
+
+This file is provided for backwards compatibility purposes
+
+*/
+
+if (!defined('ADODB_SESSION')) {
+       require_once dirname(__FILE__) . '/adodb-session2.php';
+}
+ADODB_Session::clob('CLOB');
+
+?>
\ No newline at end of file
index dde1d94..474548a 100644 (file)
@@ -2,7 +2,7 @@
 
 
 /*
-V4.90 8 June 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
          Contributed by Ross Smith (adodb@netebb.com). 
   Released under both BSD license and Lesser GPL library license.
   Whenever there is any discrepancy between the two licenses,
@@ -501,9 +501,11 @@ class ADODB_Session {
                ADODB_Session::password($password);
                ADODB_Session::database($database);
                
+               if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';
+               
                if (isset($options['table'])) ADODB_Session::table($options['table']);
-               if (isset($options['clob'])) ADODB_Session::table($options['clob']);
-               if (isset($options['field'])) ADODB_Session::dataFieldName($options['field']);
+               if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
+               if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
        }
 
        /*!
@@ -511,7 +513,8 @@ class ADODB_Session {
 
                If $conn already exists, reuse that connection
        */
-       function open($save_path, $session_name, $persist = null) {
+       function open($save_path, $session_name, $persist = null) 
+       {
                $conn =& ADODB_Session::_conn();
 
                if ($conn) {
@@ -565,7 +568,8 @@ class ADODB_Session {
        /*!
                Close the connection
        */
-       function close() {
+       function close() 
+       {
 /*
                $conn =& ADODB_Session::_conn();
                if ($conn) $conn->Close();
@@ -576,7 +580,8 @@ class ADODB_Session {
        /*
                Slurp in the session variables and return the serialized string
        */
-       function read($key) {
+       function read($key) 
+       {
                $conn   =& ADODB_Session::_conn();
                $data   = ADODB_Session::dataFieldName();
                $filter = ADODB_Session::filter();
@@ -586,7 +591,7 @@ class ADODB_Session {
                        return '';
                }
 
-               assert('$table');
+               //assert('$table');
 
                $qkey = $conn->quote($key);
                $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
@@ -629,7 +634,8 @@ class ADODB_Session {
 
                If the data has not been modified since the last read(), we do not write.
        */
-       function write($key, $val) {
+       function write($key, $val) 
+       {
        global $ADODB_SESSION_READONLY;
        
                if (!empty($ADODB_SESSION_READONLY)) return;
@@ -650,7 +656,7 @@ class ADODB_Session {
                }
                $qkey = $conn->qstr($key);
        
-               assert('$table');
+               //assert('$table');
 
                $expiry = time() + $lifetime;
 
@@ -714,6 +720,7 @@ class ADODB_Session {
                                        break;
                        }
                        
+                       $conn->StartTrans();
                        $expiryref = $conn->qstr($arr['expireref']);
                        // do we insert or update? => as for sesskey
                        $rs =& $conn->Execute("SELECT COUNT(*) AS cnt FROM $table WHERE $binary sesskey = $qkey");
@@ -722,27 +729,18 @@ class ADODB_Session {
                        } else {
                                $sql = "INSERT INTO $table (expiry, $data, sesskey,expireref) VALUES ($expiry, $lob_value, $qkey,$expiryref)";
                        }
-                       if ($rs) {
-                               $rs->Close();
-                       }
+                       if ($rs)$rs->Close();
+                       
 
                        $err = '';
                        $rs1 =& $conn->Execute($sql);
-                       if (!$rs1) {
-                               $err = $conn->ErrorMsg()."\n";
-                       }
+                       if (!$rs1) $err = $conn->ErrorMsg()."\n";
+                       
                        $rs2 =& $conn->UpdateBlob($table, $data, $val, " sesskey=$qkey", strtoupper($clob));
+                       if (!$rs2) $err .= $conn->ErrorMsg()."\n";
                        
-                       if (!$rs2) {
-                               $err .= $conn->ErrorMsg()."\n";
-                       }
                        $rs = ($rs && $rs2) ? true : false;
-                       if ($rs1) {
-                               $rs1->Close();
-                       }
-                       if (is_object($rs2)) {
-                               $rs2->Close();
-                       }
+                       $conn->CompleteTrans();
                }
 
                if (!$rs) {
@@ -777,7 +775,7 @@ class ADODB_Session {
                        return false;
                }
 
-               assert('$table');
+               //assert('$table');
 
                $qkey = $conn->quote($key);
                $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
@@ -806,16 +804,14 @@ class ADODB_Session {
                $sql = "DELETE FROM $table WHERE $binary sesskey = $qkey";
                $rs =& $conn->Execute($sql);
                ADODB_Session::_dumprs($rs);
-               if ($rs) {
-                       $rs->Close();
-               }
 
                return $rs ? true : false;
        }
 
        /*!
        */
-       function gc($maxlifetime) {
+       function gc($maxlifetime) 
+       {
                $conn                   =& ADODB_Session::_conn();
                $debug                  = ADODB_Session::debug();
                $expire_notify  = ADODB_Session::expireNotify();
@@ -827,10 +823,8 @@ class ADODB_Session {
                        return false;
                }
 
-               assert('$table');
 
                $time                   = time();
-
                $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
 
                if ($expire_notify) {
@@ -842,18 +836,18 @@ class ADODB_Session {
                        ADODB_Session::_dumprs($rs);
                        $conn->SetFetchMode($savem);
                        if ($rs) {
-                               $conn->BeginTrans();
+                               $conn->StartTrans();
                                $keys = array();
                                while (!$rs->EOF) {
                                        $ref = $rs->fields[0];
                                        $key = $rs->fields[1];
                                        $fn($ref, $key);
-                                       $del = $conn->Execute("DELETE FROM $table WHERE sesskey='$key'");
+                                       $del = $conn->Execute("DELETE FROM $table WHERE sesskey=".$conn->Param('0'),array($key));
                                        $rs->MoveNext();
                                }
                                $rs->Close();
                                
-                               $conn->CommitTrans();
+                               $conn->CompleteTrans();
                        }
                } else {
                
@@ -861,8 +855,8 @@ class ADODB_Session {
                                $sql = "SELECT sesskey FROM $table WHERE expiry < $time";
                                $arr =& $conn->GetAll($sql);
                                foreach ($arr as $row) {
-                                       $sql2 = "DELETE FROM $table WHERE sesskey='$row[0]'";
-                                       $conn->Execute($sql2);
+                                       $sql2 = "DELETE FROM $table WHERE sesskey=".$conn->Param('0');
+                                       $conn->Execute($sql2,array($row[0]));
                                }
                        } else {
                                $sql = "DELETE FROM $table WHERE expiry < $time";
diff --git a/typo3/sysext/adodb/adodb/session/adodb-session2.php b/typo3/sysext/adodb/adodb/session/adodb-session2.php
new file mode 100644 (file)
index 0000000..a773aa0
--- /dev/null
@@ -0,0 +1,941 @@
+<?php
+
+
+/*
+V4.93 10 Oct 2006  (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved.
+         Contributed by Ross Smith (adodb@netebb.com). 
+  Released under both BSD license and Lesser GPL library license.
+  Whenever there is any discrepancy between the two licenses,
+  the BSD license will take precedence.
+         Set tabs to 4 for best viewing.
+         
+
+*/
+
+/*
+
+CREATE Table SCripts
+
+Oracle
+======
+
+CREATE TABLE SESSIONS2
+(
+  SESSKEY    VARCHAR2(48 BYTE)                  NOT NULL,
+  EXPIRY     DATE                               NOT NULL,
+  EXPIREREF  VARCHAR2(200 BYTE),
+  CREATED    DATE                               NOT NULL,
+  MODIFIED   DATE                               NOT NULL,
+  SESSDATA   CLOB,
+  PRIMARY KEY(SESSKEY)
+);
+
+
+CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY);
+CREATE UNIQUE INDEX SESS2_PK ON SESSIONS2(SESSKEY);
+CREATE INDEX SESS2_EXP_REF ON SESSIONS2(EXPIREREF);
+
+
+ MySQL
+ =====
+CREATE TABLE sessions2(
+       sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
+       expiry TIMESTAMP NOT NULL ,
+       expireref VARCHAR( 250 ) DEFAULT '',
+       created TIMESTAMP NOT NULL ,
+       modified TIMESTAMP NOT NULL ,
+       sessdata LONGTEXT DEFAULT '',
+       PRIMARY KEY ( sesskey ) ,
+       INDEX sess2_expiry( expiry ),
+       INDEX sess2_expireref( expireref )
+)
+
+
+*/
+
+if (!defined('_ADODB_LAYER')) {
+       require realpath(dirname(__FILE__) . '/../adodb.inc.php');
+}
+
+if (defined('ADODB_SESSION')) return 1;
+
+define('ADODB_SESSION', dirname(__FILE__));
+define('ADODB_SESSION2', ADODB_SESSION);
+
+/* 
+       Unserialize session data manually. See http://phplens.com/lens/lensforum/msgs.php?id=9821 
+       
+       From Kerr Schere, to unserialize session data stored via ADOdb. 
+       1. Pull the session data from the db and loop through it. 
+       2. Inside the loop, you will need to urldecode the data column. 
+       3. After urldecode, run the serialized string through this function:
+
+*/
+function adodb_unserialize( $serialized_string ) 
+{
+       $variables = array( );
+       $a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
+       for( $i = 0; $i < count( $a ); $i = $i+2 ) {
+               $variables[$a[$i]] = unserialize( $a[$i+1] );
+       }
+       return( $variables );
+}
+
+/*
+       Thanks Joe Li. See http://phplens.com/lens/lensforum/msgs.php?id=11487&x=1
+       Since adodb 4.61.
+*/
+function adodb_session_regenerate_id() 
+{
+       $conn =& ADODB_Session::_conn();
+       if (!$conn) return false;
+
+       $old_id = session_id();
+       if (function_exists('session_regenerate_id')) {
+               session_regenerate_id();
+       } else {
+               session_id(md5(uniqid(rand(), true)));
+               $ck = session_get_cookie_params();
+               setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
+               //@session_start();
+       }
+       $new_id = session_id();
+       $ok =& $conn->Execute('UPDATE '. ADODB_Session::table(). ' SET sesskey='. $conn->qstr($new_id). ' WHERE sesskey='.$conn->qstr($old_id));
+       
+       /* it is possible that the update statement fails due to a collision */
+       if (!$ok) {
+               session_id($old_id);
+               if (empty($ck)) $ck = session_get_cookie_params();
+               setcookie(session_name(), session_id(), false, $ck['path'], $ck['domain'], $ck['secure']);
+               return false;
+       }
+       
+       return true;
+}
+
+/*
+    Generate database table for session data
+    @see http://phplens.com/lens/lensforum/msgs.php?id=12280
+    @return 0 if failure, 1 if errors, 2 if successful.
+       @author Markus Staab http://www.public-4u.de
+*/
+function adodb_session_create_table($schemaFile=null,$conn = null)
+{
+    // set default values
+    if ($schemaFile===null) $schemaFile = ADODB_SESSION . '/session_schema2.xml';
+    if ($conn===null) $conn =& ADODB_Session::_conn();
+
+       if (!$conn) return 0;
+
+    $schema = new adoSchema($conn);
+    $schema->ParseSchema($schemaFile);
+    return $schema->ExecuteSchema();
+}
+
+/*!
+       \static
+*/
+class ADODB_Session {
+       /////////////////////
+       // getter/setter methods
+       /////////////////////
+       
+       /*
+       
+       function Lock($lock=null)
+       {
+       static $_lock = false;
+       
+               if (!is_null($lock)) $_lock = $lock;
+               return $lock;
+       }
+       */
+       /*!
+       */
+       function driver($driver = null) 
+       {
+               static $_driver = 'mysql';
+               static $set = false;
+
+               if (!is_null($driver)) {
+                       $_driver = trim($driver);
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_DRIVER'])) {
+                               return $GLOBALS['ADODB_SESSION_DRIVER'];
+                       }
+               }
+
+               return $_driver;
+       }
+
+       /*!
+       */
+       function host($host = null) {
+               static $_host = 'localhost';
+               static $set = false;
+
+               if (!is_null($host)) {
+                       $_host = trim($host);
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_CONNECT'])) {
+                               return $GLOBALS['ADODB_SESSION_CONNECT'];
+                       }
+               }
+
+               return $_host;
+       }
+
+       /*!
+       */
+       function user($user = null) 
+       {
+               static $_user = 'root';
+               static $set = false;
+
+               if (!is_null($user)) {
+                       $_user = trim($user);
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_USER'])) {
+                               return $GLOBALS['ADODB_SESSION_USER'];
+                       }
+               }
+
+               return $_user;
+       }
+
+       /*!
+       */
+       function password($password = null) 
+       {
+               static $_password = '';
+               static $set = false;
+
+               if (!is_null($password)) {
+                       $_password = $password;
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_PWD'])) {
+                               return $GLOBALS['ADODB_SESSION_PWD'];
+                       }
+               }
+
+               return $_password;
+       }
+
+       /*!
+       */
+       function database($database = null) 
+       {
+               static $_database = '';
+               static $set = false;
+               
+               if (!is_null($database)) {
+                       $_database = trim($database);
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_DB'])) {
+                               return $GLOBALS['ADODB_SESSION_DB'];
+                       }
+               }
+               return $_database;
+       }
+
+       /*!
+       */
+       function persist($persist = null) 
+       {
+               static $_persist = true;
+
+               if (!is_null($persist)) {
+                       $_persist = trim($persist);
+               }
+
+               return $_persist;
+       }
+
+       /*!
+       */
+       function lifetime($lifetime = null) 
+       {
+               static $_lifetime;
+               static $set = false;
+
+               if (!is_null($lifetime)) {
+                       $_lifetime = (int) $lifetime;
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESS_LIFE'])) {
+                               return $GLOBALS['ADODB_SESS_LIFE'];
+                       }
+               }
+               if (!$_lifetime) {
+                       $_lifetime = ini_get('session.gc_maxlifetime');
+                       if ($_lifetime <= 1) {
+                               // bug in PHP 4.0.3 pl 1  -- how about other versions?
+                               //print "<h3>Session Error: PHP.INI setting <i>session.gc_maxlifetime</i>not set: $lifetime</h3>";
+                               $_lifetime = 1440;
+                       }
+               }
+
+               return $_lifetime;
+       }
+
+       /*!
+       */
+       function debug($debug = null) 
+       {
+               static $_debug = false;
+               static $set = false;
+
+               if (!is_null($debug)) {
+                       $_debug = (bool) $debug;
+
+                       $conn = ADODB_Session::_conn();
+                       if ($conn) {
+                               $conn->debug = $_debug;
+                       }
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESS_DEBUG'])) {
+                               return $GLOBALS['ADODB_SESS_DEBUG'];
+                       }
+               }
+
+               return $_debug;
+       }
+
+       /*!
+       */
+       function expireNotify($expire_notify = null) 
+       {
+               static $_expire_notify;
+               static $set = false;
+
+               if (!is_null($expire_notify)) {
+                       $_expire_notify = $expire_notify;
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'])) {
+                               return $GLOBALS['ADODB_SESSION_EXPIRE_NOTIFY'];
+                       }
+               }
+
+               return $_expire_notify;
+       }
+
+       /*!
+       */
+       function table($table = null) 
+       {
+               static $_table = 'sessions2';
+               static $set = false;
+
+               if (!is_null($table)) {
+                       $_table = trim($table);
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_TBL'])) {
+                               return $GLOBALS['ADODB_SESSION_TBL'];
+                       }
+               }
+
+               return $_table;
+       }
+
+       /*!
+       */
+       function optimize($optimize = null) 
+       {
+               static $_optimize = false;
+               static $set = false;
+
+               if (!is_null($optimize)) {
+                       $_optimize = (bool) $optimize;
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (defined('ADODB_SESSION_OPTIMIZE')) {
+                               return true;
+                       }
+               }
+
+               return $_optimize;
+       }
+
+       /*!
+       */
+       function syncSeconds($sync_seconds = null) {
+               //echo ("<p>WARNING: ADODB_SESSION::syncSeconds is longer used, please remove this function for your code</p>");
+               
+               return 0;
+       }
+
+       /*!
+       */
+       function clob($clob = null) {
+               static $_clob = false;
+               static $set = false;
+
+               if (!is_null($clob)) {
+                       $_clob = strtolower(trim($clob));
+                       $set = true;
+               } elseif (!$set) {
+                       // backwards compatibility
+                       if (isset($GLOBALS['ADODB_SESSION_USE_LOBS'])) {
+                               return $GLOBALS['ADODB_SESSION_USE_LOBS'];
+                       }
+               }
+
+               return $_clob;
+       }
+
+       /*!
+       */
+       function dataFieldName($data_field_name = null) {
+               //echo ("<p>WARNING: ADODB_SESSION::dataFieldName() is longer used, please remove this function for your code</p>");
+               return '';
+       }
+
+       /*!
+       */
+       function filter($filter = null) {
+               static $_filter = array();
+
+               if (!is_null($filter)) {
+                       if (!is_array($filter)) {
+                               $filter = array($filter);
+                       }
+                       $_filter = $filter;
+               }
+
+               return $_filter;
+       }
+
+       /*!
+       */
+       function encryptionKey($encryption_key = null) {
+               static $_encryption_key = 'CRYPTED ADODB SESSIONS ROCK!';
+
+               if (!is_null($encryption_key)) {
+                       $_encryption_key = $encryption_key;
+               }
+
+               return $_encryption_key;
+       }
+
+       /////////////////////
+       // private methods
+       /////////////////////
+
+       /*!
+       */
+       function &_conn($conn=null) {
+               return $GLOBALS['ADODB_SESS_CONN'];
+       }
+
+       /*!
+       */
+       function _crc($crc = null) {
+               static $_crc = false;
+
+               if (!is_null($crc)) {
+                       $_crc = $crc;
+               }
+
+               return $_crc;
+       }
+
+       /*!
+       */
+       function _init() {
+               session_module_name('user');
+               session_set_save_handler(
+                       array('ADODB_Session', 'open'),
+                       array('ADODB_Session', 'close'),
+                       array('ADODB_Session', 'read'),
+                       array('ADODB_Session', 'write'),
+                       array('ADODB_Session', 'destroy'),
+                       array('ADODB_Session', 'gc')
+               );
+       }
+
+
+       /*!
+       */
+       function _sessionKey() {
+               // use this function to create the encryption key for crypted sessions
+               // crypt the used key, ADODB_Session::encryptionKey() as key and session_id() as salt
+               return crypt(ADODB_Session::encryptionKey(), session_id());
+       }
+
+       /*!
+       */
+       function _dumprs($rs) {
+               $conn   =& ADODB_Session::_conn();
+               $debug  = ADODB_Session::debug();
+
+               if (!$conn) {
+                       return;
+               }
+
+               if (!$debug) {
+                       return;
+               }
+
+               if (!$rs) {
+                       echo "<br />\$rs is null or false<br />\n";
+                       return;
+               }
+
+               //echo "<br />\nAffected_Rows=",$conn->Affected_Rows(),"<br />\n";
+
+               if (!is_object($rs)) {
+                       return;
+               }
+
+               require_once ADODB_SESSION.'/../tohtml.inc.php';
+               rs2html($rs);
+       }
+
+       /////////////////////
+       // public methods
+       /////////////////////
+       
+       function config($driver, $host, $user, $password, $database=false,$options=false)
+       {
+               ADODB_Session::driver($driver);
+               ADODB_Session::host($host);
+               ADODB_Session::user($user);
+               ADODB_Session::password($password);
+               ADODB_Session::database($database);
+               
+               if ($driver == 'oci8' || $driver == 'oci8po') $options['lob'] = 'CLOB';
+               
+               if (isset($options['table'])) ADODB_Session::table($options['table']);
+               if (isset($options['lob'])) ADODB_Session::clob($options['lob']);
+               if (isset($options['debug'])) ADODB_Session::debug($options['debug']);
+       }
+
+       /*!
+               Create the connection to the database.
+
+               If $conn already exists, reuse that connection
+       */
+       function open($save_path, $session_name, $persist = null) 
+       {
+               $conn =& ADODB_Session::_conn();
+
+               if ($conn) {
+                       return true;
+               }
+
+               $database       = ADODB_Session::database();
+               $debug          = ADODB_Session::debug();
+               $driver         = ADODB_Session::driver();
+               $host           = ADODB_Session::host();
+               $password       = ADODB_Session::password();
+               $user           = ADODB_Session::user();
+
+               if (!is_null($persist)) {
+                       ADODB_Session::persist($persist);
+               } else {
+                       $persist = ADODB_Session::persist();
+               }
+
+# these can all be defaulted to in php.ini
+#              assert('$database');
+#              assert('$driver');
+#              assert('$host');
+
+               $conn =& ADONewConnection($driver);
+
+               if ($debug) {
+                       $conn->debug = true;            
+                       ADOConnection::outp( " driver=$driver user=$user db=$database ");
+               }
+               
+               if ($persist) {
+                       switch($persist) {
+                       default:
+                       case 'P': $ok = $conn->PConnect($host, $user, $password, $database); break;
+                       case 'C': $ok = $conn->Connect($host, $user, $password, $database); break;
+                       case 'N': $ok = $conn->NConnect($host, $user, $password, $database); break;
+                       }
+               } else {
+                       $ok = $conn->Connect($host, $user, $password, $database);
+               }
+
+               if ($ok) $GLOBALS['ADODB_SESS_CONN'] =& $conn;
+               else
+                       ADOConnection::outp('<p>Session: connection failed</p>', false);
+               
+
+               return $ok;
+       }
+
+       /*!
+               Close the connection
+       */
+       function close() 
+       {
+/*
+               $conn =& ADODB_Session::_conn();
+               if ($conn) $conn->Close();
+*/
+               return true;
+       }
+
+       /*
+               Slurp in the session variables and return the serialized string
+       */
+       function read($key) 
+       {
+               $conn   =& ADODB_Session::_conn();
+               $filter = ADODB_Session::filter();
+               $table  = ADODB_Session::table();
+
+               if (!$conn) {
+                       return '';
+               }
+
+               //assert('$table');
+
+               $qkey = $conn->quote($key);
+               $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
+       
+               $sql = "SELECT sessdata FROM $table WHERE sesskey = $binary $qkey AND expiry >= " . $conn->sysTimeStamp;
+               /* Lock code does not work as it needs to hold transaction within whole page, and we don't know if 
+                 developer has commited elsewhere... :(
+                */
+               #if (ADODB_Session::Lock())
+               #       $rs =& $conn->RowLock($table, "$binary sesskey = $qkey AND expiry >= " . time(), sessdata);
+               #else
+               
+                       $rs =& $conn->Execute($sql);
+               //ADODB_Session::_dumprs($rs);
+               if ($rs) {
+                       if ($rs->EOF) {
+                               $v = '';
+                       } else {
+                               $v = reset($rs->fields);
+                               $filter = array_reverse($filter);
+                               foreach ($filter as $f) {
+                                       if (is_object($f)) {
+                                               $v = $f->read($v, ADODB_Session::_sessionKey());
+                                       }
+                               }
+                               $v = rawurldecode($v);
+                       }
+
+                       $rs->Close();
+
+                       ADODB_Session::_crc(strlen($v) . crc32($v));
+                       return $v;
+               }
+
+               return '';
+       }
+
+       /*!
+               Write the serialized data to a database.
+
+               If the data has not been modified since the last read(), we do not write.
+       */
+       function write($key, $val) 
+       {
+       global $ADODB_SESSION_READONLY;
+       
+               if (!empty($ADODB_SESSION_READONLY)) return;
+               
+               $clob                   = ADODB_Session::clob();
+               $conn                   =& ADODB_Session::_conn();
+               $crc                    = ADODB_Session::_crc();
+               $debug                  = ADODB_Session::debug();
+               $driver                 = ADODB_Session::driver();
+               $expire_notify  = ADODB_Session::expireNotify();
+               $filter                 = ADODB_Session::filter();
+               $lifetime               = ADODB_Session::lifetime();
+               $table                  = ADODB_Session::table();
+       
+               if (!$conn) {
+                       return false;
+               }
+       
+               $sysTimeStamp = $conn->sysTimeStamp;
+               
+               //assert('$table');
+
+               $expiry = $conn->OffsetDate($lifetime/(24*3600),$sysTimeStamp);
+
+               $binary = $conn->dataProvider === 'mysql' ? '/*! BINARY */' : '';
+
+               // crc32 optimization since adodb 2.1
+               // now we only update expiry date, thx to sebastian thom in adodb 2.32
+               if ($crc !== false && $crc == (strlen($val) . cr