!C99Shell v. 1.0 pre-release build #13!

Software: Apache. PHP/5.5.15 

uname -a: Windows NT SVR-DMZ 6.1 build 7600 (Windows Server 2008 R2 Enterprise Edition) i586 

SYSTEM 

Safe-mode: OFF (not secure)

C:\Intranet\C\xampp\php\PEAR\MDB\   drwxrwxrwx
Free 4.09 GB of 39.52 GB (10.36%)
Detected drives: [ a ] [ c ] [ d ] [ e ] [ f ]
Home    Back    Forward    UPDIR    Refresh    Search    Buffer    Encoder    Tools    Proc.    FTP brute    Sec.    SQL    PHP-code    Update    Feedback    Self remove    Logout    


Viewing file:     Common.php (154.04 KB)      -rw-rw-rw-
Select action/file-type:
(+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
// +----------------------------------------------------------------------+
// | PHP Version 4                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1998-2004 Manuel Lemos, Tomas V.V.Cox,                 |
// | Stig. S. Bakken, Lukas Smith                                         |
// | All rights reserved.                                                 |
// +----------------------------------------------------------------------+
// | MDB is a merge of PEAR DB and Metabases that provides a unified DB   |
// | API as well as database abstraction for PHP applications.            |
// | This LICENSE is in the BSD license style.                            |
// |                                                                      |
// | Redistribution and use in source and binary forms, with or without   |
// | modification, are permitted provided that the following conditions   |
// | are met:                                                             |
// |                                                                      |
// | Redistributions of source code must retain the above copyright       |
// | notice, this list of conditions and the following disclaimer.        |
// |                                                                      |
// | Redistributions in binary form must reproduce the above copyright    |
// | notice, this list of conditions and the following disclaimer in the  |
// | documentation and/or other materials provided with the distribution. |
// |                                                                      |
// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken,    |
// | Lukas Smith nor the names of his contributors may be used to endorse |
// | or promote products derived from this software without specific prior|
// | written permission.                                                  |
// |                                                                      |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,          |
// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|
// |  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED  |
// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT          |
// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|
// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE          |
// | POSSIBILITY OF SUCH DAMAGE.                                          |
// +----------------------------------------------------------------------+
// | Author: Lukas Smith <smith@backendmedia.com>                         |
// +----------------------------------------------------------------------+
//
// $Id: Common.php,v 1.114.4.22 2004/04/08 19:11:58 lsmith Exp $

/**
 * @package MDB
 * @author Lukas Smith <smith@backendmedia.com>
 */

// }}}
// {{{ MDB_defaultDebugOutput()

/**
 * default debug output handler
 *
 * @param object $db reference to an MDB database object
 * @param string $message message that should be appended to the debug
 *       variable
 * @return string the corresponding error message, of FALSE
 * if the error code was unknown
 * @access public
 */
function MDB_defaultDebugOutput(&$db$message)
{
    
$db->debug_output .= $db->database $message$db->getOption('log_line_break');
}

/**
 * MDB_Common: Base class that is extended by each MDB driver
 *
 * @package MDB
 * @category Database
 * @author Lukas Smith <smith@backendmedia.com>
 */
class MDB_Common extends PEAR
{
    
// {{{ properties
    /**
    * index of the MDB object withing the global $_MDB_databases array
    * @var integer
    * @access private
    */
    
var $database 0;

    
/**
    * @var string
    * @access private
    */
    
var $host '';

    
/**
    * @var string
    * @access private
    */
    
var $port '';

    
/**
    * @var string
    * @access private
    */
    
var $user '';

    
/**
    * @var string
    * @access private
    */
    
var $password '';

    
/**
    * @var string
    * @access private
    */
    
var $database_name '';

    
/**
    * @var array
    * @access private
    */
    
var $supported = array();

    
/**
    * $options["persistent"] -> boolean persistent connection true|false?
    * $options["debug"] -> integer numeric debug level
    * $options["autofree"] -> boolean
    * $options["lob_buffer_length"] -> integer LOB buffer length
    * $options["log_line_break"] -> string line-break format
    * $options["seqname_format"] -> string pattern for sequence name
    * $options["includelob"] -> boolean
    * $options["includemanager"] -> boolean
    * $options["UseTransactions"] -> boolean
    * $options["optimize"] -> string 'performance' or 'portability'
    * @var array
    * @access private
    */
    
var $options = array(
            
'persistent' => FALSE,
            
'debug' => FALSE,
            
'autofree' => FALSE,
            
'lob_buffer_length' => 8192,
            
'log_line_break' => "\n",
            
'seqname_format' => '%s_seq',
            
'sequence_col_name' => 'sequence',
            
'includelob' => FALSE,
            
'includemanager' => FALSE,
            
'UseTransactions' => FALSE,
            
'optimize' => 'performance',
        );

    
/**
    * @var string
    * @access private
    */
    
var $escape_quotes '';

    
/**
    * @var integer
    * @access private
    */
    
var $decimal_places 2;

    
/**
    * @var string
    * @access private
    */
    
var $manager_included_constant '';

    
/**
    * @var string
    * @access private
    */
    
var $manager_include '';

    
/**
    * @var string
    * @access private
    */
    
var $manager_class_name '';

    
/**
    * @var object
    * @access private
    */
    
var $manager;

    
/**
    * @var array
    * @access private
    */
    
var $warnings = array();

    
/**
    * @var string
    * @access private
    */
    
var $debug '';

    
/**
    * @var string
    * @access private
    */
    
var $debug_output '';

    
/**
    * @var boolean
    * @access private
    */
    
var $pass_debug_handle FALSE;

    
/**
    * @var boolean
    * @access private
    */
    
var $auto_commit TRUE;

    
/**
    * @var boolean
    * @access private
    */
    
var $in_transaction FALSE;

    
/**
    * @var integer
    * @access private
    */
    
var $first_selected_row 0;

    
/**
    * @var integer
    * @access private
    */
    
var $selected_row_limit 0;

    
/**
    * DB type (mysql, oci8, odbc etc.)
    * @var string
    * @access private
    */
    
var $type;

    
/**
    * @var array
    * @access private
    */
    
var $prepared_queries = array();

    
/**
    * @var array
    * @access private
    */
    
var $result_types;

    
/**
    * @var string
    * @access private
    */
    
var $last_query '';

    
/**
    * @var integer
    * @access private
    */
    
var $fetchmode MDB_FETCHMODE_ORDERED;

    
/**
    * @var integer
    * @access private
    */
    
var $affected_rows = -1;

    
/**
    * @var array
    * @access private
    */
    
var $lobs = array();

    
/**
    * @var array
    * @access private
    */
    
var $clobs = array();

    
/**
    * @var array
    * @access private
    */
    
var $blobs = array();

    
// }}}
    // {{{ constructor

    /**
     * Constructor
     */
    
function MDB_Common()
    {
        
$database count($GLOBALS['_MDB_databases']) + 1;
        
$GLOBALS['_MDB_databases'][$database] = &$this;
        
$this->database $database;

        
$this->PEAR('MDB_Error');
        
$this->supported = array();
        
$this->errorcode_map = array();
        
$this->fetchmode MDB_FETCHMODE_ORDERED;
    }

    
// }}}
    // {{{ __toString()

    /**
     * String conversation
     *
     * @return string
     * @access public
     */
    
function __toString()
    {
        
$info get_class($this);
        
$info .= ': (phptype = ' $this->phptype ', dbsyntax = ' $this->dbsyntax ')';
        if (
$this->connection) {
            
$info .= ' [connected]';
        }
        return(
$info);
    }

    
// }}}
    // {{{ errorCode()

    /**
     * Map native error codes to MDB's portable ones.  Requires that
     * the DB implementation's constructor fills in the $errorcode_map
     * property.
     *
     * @param mixed $nativecode the native error code, as returned by the
     *      backend database extension (string or integer)
     * @return int a portable MDB error code, or FALSE if this MDB
     *      implementation has no mapping for the given error code.
     * @access public
     */
    
function errorCode($nativecode)
    {
        if (isset(
$this->errorcode_map[$nativecode])) {
            return(
$this->errorcode_map[$nativecode]);
        }
        
// Fall back to MDB_ERROR if there was no mapping.
        
return(MDB_ERROR);
    }

    
// }}}
    // {{{ errorMessage()

    /**
     * Map a MDB error code to a textual message.  This is actually
     * just a wrapper for MDB::errorMessage().
     *
     * @param integer $dbcode the MDB error code
     * @return string the corresponding error message, of FALSE
     *      if the error code was unknown
     * @access public
     */
    
function errorMessage($dbcode)
    {
        return(
MDB::errorMessage($this->errorcode_map[$dbcode]));
    }

    
// }}}
    // {{{ raiseError()

    /**
     * This method is used to communicate an error and invoke error
     * callbacks etc.  Basically a wrapper for PEAR::raiseError
     * without the message string.
     *
     * @param mixed $code integer error code, or a PEAR error object (all
     *      other parameters are ignored if this parameter is an object
     * @param int $mode error mode, see PEAR_Error docs
     * @param mixed $options If error mode is PEAR_ERROR_TRIGGER, this is the
     *      error level (E_USER_NOTICE etc).  If error mode is
     *      PEAR_ERROR_CALLBACK, this is the callback function, either as a
     *      function name, or as an array of an object and method name. For
     *      other error modes this parameter is ignored.
     * @param string $userinfo Extra debug information.  Defaults to the last
     *      query and native error code.
     * @param mixed $nativecode Native error code, integer or string depending
     *      the backend.
     * @return object a PEAR error object
     * @access public
     * @see PEAR_Error
     */
    
function &raiseError($code MDB_ERROR$mode NULL$options NULL,
        
$userinfo NULL$nativecode NULL)
    {
        
// The error is yet a MDB error object
        
if (is_object($code)) {
            
// because we the static PEAR::raiseError, our global
            // handler should be used if it is set
            
if ($mode === null && !empty($this->_default_error_mode)) {
                
$mode    $this->_default_error_mode;
                
$options $this->_default_error_options;
            }
            
$err PEAR::raiseError($codeNULL$mode$optionsNULLNULLTRUE);
            return(
$err);
        }

        if (
$userinfo === NULL) {
            
$userinfo $this->last_query;
        }

        if (
$nativecode) {
            
$userinfo .= ' [nativecode=' trim($nativecode) . ']';
        }

        
$err PEAR::raiseError(NULL$code$mode$options$userinfo'MDB_Error'TRUE);
        return(
$err);
    }

    
// }}}
    // {{{ errorNative()

    /**
     * returns an errormessage, provides by the database
     *
     * @return mixed MDB_Error or message
     * @access public
     */
    
function errorNative()
    {
        return(
$this->raiseError(MDB_ERROR_NOT_CAPABLE));
    }

    
// }}}
    // {{{ resetWarnings()

    /**
     * reset the warning array
     *
     * @access public
     */
    
function resetWarnings()
    {
        
$this->warnings = array();
    }

    
// }}}
    // {{{ getWarnings()

    /**
     * get all warnings in reverse order.
     * This means that the last warning is the first element in the array
     *
     * @return array with warnings
     * @access public
     * @see resetWarnings()
     */
    
function getWarnings()
    {
        return 
array_reverse($this->warnings);
    }

    
// }}}
    // {{{ setOption()

    /**
     * set the option for the db class
     *
     * @param string $option option name
     * @param mixed $value value for the option
     * @return mixed MDB_OK or MDB_Error
     * @access public
     */
    
function setOption($option$value)
    {
        if (isset(
$this->options[$option])) {
            
$this->options[$option] = $value;
            return 
MDB_OK;
        }
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL"unknown option $option"));
    }

    
// }}}
    // {{{ getOption()

    /**
     * returns the value of an option
     *
     * @param string $option option name
     * @return mixed the option value or error object
     * @access public
     */
    
function getOption($option)
    {
        if (isset(
$this->options[$option])) {
            return(
$this->options[$option]);
        }
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL"unknown option $option"));
    }

    
// }}}
    // {{{ captureDebugOutput()

    /**
     * set a debug handler
     *
     * @param string $capture name of the function that should be used in
     *      debug()
     * @access public
     * @see debug()
     */
    
function captureDebugOutput($capture)
    {
        
$this->pass_debug_handle $capture;
        
$this->debug = ($capture 'MDB_defaultDebugOutput' '');
    }

    
// }}}
    // {{{ debug()

    /**
     * set a debug message
     *
     * @param string $message Message with information for the user.
     * @access public
     */
    
function debug($message)
    {
        if (
strcmp($function $this->debug'')) {
            if (
$this->pass_debug_handle) {
                
$function($this$message);
            } else {
                
$function($message);
            }
        }
    }

    
// }}}
    // {{{ debugOutput()

    /**
     * output debug info
     *
     * @return string content of the debug_output class variable
     * @access public
     */
    
function debugOutput()
    {
        return(
$this->debug_output);
    }

    
// }}}
    // {{{ setError() (deprecated)

    /**
     * set an error (deprecated)
     *
     * @param string $scope Scope of the error message
     *     (usually the method tht caused the error)
     * @param string $message Message with information for the user.
     * @return boolean FALSE
     * @access private
     */
    
function setError($scope$message)
    {
        
$this->last_error $message;
        
$this->debug($scope ': ' $message);
        if ((
$function $this->error_handler) != '') {
            
$error = array(
                
'Scope' => $scope,
                
'Message' => $message
            
);
            
$function($this$error);
        }
        return(
0);
    }

    
// }}}
    // {{{ setErrorHandler() (deprecated)

    /**
     * Specify a function that is called when an error occurs.
     *
     * @param string $function Name of the function that will be called on
     *      error. If an empty string is specified, no handler function is
     *      called on error. The error handler function receives two arguments.
     *      The first argument a reference to the driver class object that
     *      triggered the error.
     *
     *      The second argument is a reference to an associative array that
     *      provides details about the error that occured. These details provide
     *      more information than it is returned by the MetabaseError function.
     *
     *      These are the currently supported error detail entries:
     *
     *      Scope
     *       String that indicates the scope of the driver object class
     *       within which the error occured.
     *
     *      Message
     *       Error message as is returned by the MetabaseError function.
     * @return string name of last function
     * @access public
     */
    
function setErrorHandler($function)
    {
        
$last_function $this->error_handler;
        
$this->error_handler $function;
        return(
$last_function);
    }

    
// }}}
    // {{{ error() (deprecated)

    /**
     * Retrieve the error message text associated with the last operation that
     * failed. Some functions may fail but they do not return the reason that
     * makes them to fail. This function is meant to retrieve a textual
     * description of the failure cause.
     *
     * @return string the error message text associated with the last failure.
     * @access public
     */
    
function error()
    {
        return(
$this->last_error);
    }

    
// }}}
    // {{{ _quote()

    /**
     * Quotes a string so it can be safely used in a query. It will quote
     * the text so it can safely be used within a query.
     *
     * @param string $text the input string to quote
     * @return string quoted string
     * @access private
     */
    
function _quote($text)
    {
        if (
strcmp($this->escape_quotes"'")) {
            
$text str_replace($this->escape_quotes$this->escape_quotes $this->escape_quotes$text);
        }
        return 
str_replace("'"$this->escape_quotes "'"$text);
    }

    
// }}}
    // {{{ quoteIdentifier()

    /**
     * Quote a string so it can be safely used as a table or column name
     *
     * Delimiting style depends on which database driver is being used.
     *
     * NOTE: just because you CAN use delimited identifiers doesn't mean
     * you SHOULD use them.  In general, they end up causing way more
     * problems than they solve.
     *
     * Portability is broken by using the following characters inside
     * delimited identifiers:
     *   + backtick (<kbd>`</kbd>) -- due to MySQL
     *   + double quote (<kbd>"</kbd>) -- due to Oracle
     *   + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- due to Access
     *
     * Delimited identifiers are known to generally work correctly under
     * the following drivers:
     *   + mssql
     *   + mysql
     *   + mysqli
     *   + oci8
     *   + odbc(access)
     *   + odbc(db2)
     *   + pgsql
     *   + sqlite
     *   + sybase
     *
     * InterBase doesn't seem to be able to use delimited identifiers
     * via PHP 4.  They work fine under PHP 5.
     *
     * @param string $str  identifier name to be quoted
     *
     * @return string  quoted identifier string
     *
     * @access public
     */
    
function quoteIdentifier($str)
    {
        return 
'"' str_replace('"''""'$str) . '"';
    }

    
// }}}
    // {{{ _loadModule()

    /**
     * loads an module
     *
     * @param string $scope information about what method is being loaded,
     *      that is used for error messages
     * @param string $module name of the module that should be loaded
     *      (only used for error messages)
     * @param string $included_constant name of the constant that should be
     *      defined when the module has been loaded
     * @param string $include name of the script that includes the module
     * @access private
     */
    
function _loadModule($scope$module$included_constant$include)
    {
        if (
strlen($included_constant) == || !defined($included_constant)) {
            if(
$include) {
                
$include 'MDB/Modules/'.$include;
                if(
MDB::isError($debug $this->getOption('debug')) || $debug 2) {
                    include_once(
$include);
                } else {
                    @include_once(
$include);
                }
            } else {
                return(
$this->raiseError(MDB_ERROR_LOADMODULENULLNULL,
                    
$scope ': it was not specified an existing ' $module ' file (' $include ')'));
            }
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ loadLob()

    /**
     * loads the LOB module
     *
     * @param string $scope information about what method is being loaded,
     *                       that is used for error messages
     * @access public
     */
    
function loadLob($scope '')
    {
        if (
defined('MDB_LOB_INCLUDED')) {
            return(
MDB_OK);
        }
        
$result $this->_loadModule($scope'LOB',
            
'MDB_LOB_INCLUDED''LOB.php');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ loadManager()

    /**
     * loads the Manager module
     *
     * @param string $scope information about what method is being loaded,
     *                       that is used for error messages
     * @access public
     */
    
function loadManager($scope '')
    {
        if (isset(
$this->manager) && is_object($this->manager)) {
            return(
MDB_OK);
        }
        
$result $this->_loadModule($scope'Manager',
            
'MDB_MANAGER_'.strtoupper($this->phptype).'_INCLUDED',
            
'Manager/'.$this->phptype.'.php');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        
$class_name 'MDB_Manager_'.$this->dbsyntax;
        if (!
class_exists($class_name)) {
            return(
$this->raiseError(MDB_ERROR_LOADMODULENULLNULL,
                
'Unable to load extension'));
        }
        @
$this->manager = new $class_name;
        return(
MDB_OK);
    }

    
// }}}
    // {{{ autoCommit()

    /**
     * Define whether database changes done on the database be automatically
     * committed. This function may also implicitly start or end a transaction.
     *
     * @param boolean $auto_commit flag that indicates whether the database
     *      changes should be committed right after executing every query
     *      statement. If this argument is 0 a transaction implicitly started.
     *      Otherwise, if a transaction is in progress it is ended by committing
     *      any database changes that were pending.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function autoCommit($auto_commit)
    {
        
$this->debug('AutoCommit: ' . ($auto_commit 'On' 'Off'));
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Auto-commit transactions: transactions are not supported'));
    }

    
// }}}
    // {{{ commit()

    /**
     * Commit the database changes done during a transaction that is in
     * progress. This function may only be called when auto-committing is
     * disabled, otherwise it will fail. Therefore, a new transaction is
     * implicitly started after committing the pending changes.
     *
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function commit()
    {
        
$this->debug('Commit Transaction');
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Commit transaction: commiting transactions are not supported'));
    }

    
// }}}
    // {{{ rollback()

    /**
     * Cancel any database changes done during a transaction that is in
     * progress. This function may only be called when auto-committing is
     * disabled, otherwise it will fail. Therefore, a new transaction is
     * implicitly started after canceling the pending changes.
     *
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function rollback()
    {
        
$this->debug('Rollback Transaction');
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Rollback transaction: rolling back transactions are not supported'));
    }

    
// }}}
    // {{{ disconnect()

    /**
     * Log out and disconnect from the database.
     *
     * @return mixed TRUE on success, FALSE if not connected and error
     *                object on error
     * @access public
     */
    
function disconnect()
    {
        if (
$this->in_transaction && !MDB::isError($this->rollback()) && !MDB::isError($this->autoCommit(TRUE))) {
            
$this->in_transaction FALSE;
        }
        return(
$this->_close());
    }

    
// }}}
    // {{{ _close()

    /**
     * all the RDBMS specific things needed to close a DB connection
     *
     * @access private
     */
    
function _close()
    {
        unset(
$GLOBALS['_MDB_databases'][$this->database]);
    }

    
// }}}
    // {{{ setDatabase()

    /**
     * Select a different database
     *
     * @param string $name name of the database that should be selected
     * @return string name of the database previously connected to
     * @access public
     */
    
function setDatabase($name)
    {
        
$previous_database_name $this->database_name;
        
$this->database_name $name;
        return(
$previous_database_name);
    }

    
// }}}
    // {{{ setDSN()

    /**
     * set the DSN
     *
     * @param mixed     $dsninfo    DSN string or array
     * @return MDB_OK
     * @access public
     */
    
function setDSN($dsn)
    {
        
$dsninfo MDB::parseDSN($dsn);
        if(isset(
$dsninfo['hostspec'])) {
            
$this->host $dsninfo['hostspec'];
        }
        if(isset(
$dsninfo['port'])) {
            
$this->port $dsninfo['port'];
        }
        if(isset(
$dsninfo['username'])) {
            
$this->user $dsninfo['username'];
        }
        if(isset(
$dsninfo['password'])) {
            
$this->password $dsninfo['password'];
        }
        if(isset(
$dsninfo['database'])) {
            
$this->database_name $dsninfo['database'];
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ getDSN()

    /**
     * return the DSN as a string
     *
     * @param string     $type    type to return
     * @return mixed DSN in the chosen type
     * @access public
     */
    
function getDSN($type 'string')
    {
        switch(
$type) {
            case 
'array':
                
$dsn = array(
                    
'phptype' => $this->phptype,
                    
'username' => $this->user,
                    
'password' => $this->password,
                    
'hostspec' => $this->host,
                    
'database' => $this->database_name
                
);
                break;
            default:
                
$dsn $this->phptype.'://'.$this->user.':'
                    
.$this->password.'@'.$this->host
                    
.($this->port ? (':'.$this->port) : '')
                    .
'/'.$this->database_name;
                break;
        }
        return(
$dsn);
    }

    
// }}}
    // {{{ createDatabase()

    /**
     * create a new database
     *
     * @param string $name name of the database that should be created
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function createDatabase($name)
    {
        
$result $this->loadManager('Create database');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->createDatabase($this$name));
    }

    
// }}}
    // {{{ dropDatabase()

    /**
     * drop an existing database
     *
     * @param string $name name of the database that should be dropped
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function dropDatabase($name)
    {
        
$result $this->loadManager('Drop database');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->dropDatabase($this$name));
    }

    
// }}}
    // {{{ createTable()

    /**
     * create a new table
     *
     * @param string $name Name of the database that should be created
     * @param array $fields Associative array that contains the definition of
     *      each field of the new table. The indexes of the array entries are
     *      the names of the fields of the table an the array entry values are
     *      associative arrays like those that are meant to be passed with the
     *      field definitions to get[Type]Declaration() functions.
     *
     *      Example
     *        array(
     *            'id' => array(
     *                'type' => 'integer',
     *                'unsigned' => 1
     *                'notnull' => 1
     *                'default' => 0
     *            ),
     *            'name' => array(
     *                'type' => 'text',
     *                'length' => 12
     *            ),
     *            'password' => array(
     *                'type' => 'text',
     *                'length' => 12
     *            )
     *        );
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function createTable($name$fields)
    {
        
$result $this->loadManager('Create table');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->createTable($this$name$fields));
    }

    
// }}}
    // {{{ dropTable()

    /**
     * drop an existing table
     *
     * @param string $name name of the table that should be dropped
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function dropTable($name)
    {
        
$result $this->loadManager('Drop table');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->dropTable($this$name));
    }

    
// }}}
    // {{{ alterTable()

    /**
     * alter an existing table
     *
     * @param string $name name of the table that is intended to be changed.
     * @param array  $changes associative array that contains the details of
     *       each type of change that is intended to be performed. The types of
     *       changes that are currently supported are defined as follows:
     *
     *  name
     *      New name for the table.
     *
     *  AddedFields
     *      Associative array with the names of fields to be added as indexes of
     *      the array. The value of each entry of the array should be set to
     *      another associative array with the properties of the fields to be
     *      added. The properties of the fields should be the same as defined by
     *      the Metabase parser.
     *
     *      Additionally, there should be an entry named Declaration that is
     *      expected to contain the portion of the field declaration already in
     *       DBMS specific SQL code as it is used in the CREATE TABLE statement.
     *
     *  RemovedFields
     *      Associative array with the names of fields to be removed as indexes of
     *      the array. Currently the values assigned to each entry are ignored. An
     *      empty array should be used for future compatibility.
     *
     *  RenamedFields
     *      Associative array with the names of fields to be renamed as indexes of
     *      the array. The value of each entry of the array should be set to another
     *      associative array with the entry named name with the new field name and
     *      the entry named Declaration that is expected to contain the portion of
     *      the field declaration already in DBMS specific SQL code as it is used
     *      in the CREATE TABLE statement.
     *
     *  ChangedFields
     *      Associative array with the names of the fields to be changed as indexes
     *      of the array. Keep in mind that if it is intended to change either the
     *      name of a field and any other properties, the ChangedFields array
     *      entries should have the new names of the fields as array indexes.
     *
     *      The value of each entry of the array should be set to another
     *      associative array with the properties of the fields to that are meant
     *      to be changed as array entries. These entries should be assigned to the
     *      new values of the respective properties. The properties of the fields
     *      should be the* same as defined by the Metabase parser.
     *
     *      If the default property is meant to be added, removed or changed, there
     *      should also be an entry with index ChangedDefault assigned to 1.
     *      Similarly, if the notnull constraint is to be added or removed, there
     *      should also be an entry with index ChangedNotNull assigned to 1.
     *
     *      Additionally, there should be an entry named Declaration that is
     *      expected to contain the portion of the field changed declaration
     *      already in DBMS specific SQL code as it is used in the CREATE TABLE
     *      statement.
     *
     *  Example
     *      array(
     *          'name' => 'userlist',
     *          'AddedFields' => array(
     *              'quota' => array(
     *                  'type' => 'integer',
     *                  'unsigned' => 1,
     *                  'Declaration' => 'quota INT'
     *              )
     *          ),
     *          'RemovedFields' => array(
     *              'file_limit' => array(),
     *              'time_limit' => array()
     *          ),
     *          'ChangedFields' => array(
     *              'gender' => array(
     *                  'default' => 'M',
     *                  'ChangeDefault' => 1,
     *                  'Declaration' => "gender CHAR(1) DEFAULT 'M'"
     *              )
     *          ),
     *          'RenamedFields' => array(
     *              'sex' => array(
     *                  'name' => 'gender',
     *                  'Declaration' => "gender CHAR(1) DEFAULT 'M'"
     *              )
     *          )
     *      )
     *
     * @param boolean $check indicates whether the function should just check
     *       if the DBMS driver can perform the requested table alterations if
     *       the value is TRUE or actually perform them otherwise.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function alterTable($name$changes$check)
    {
        
$result $this->loadManager('Alter table');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->alterTable($this$name$changes$check));
    }

    
// }}}
    // {{{ listDatabases()

    /**
     * list all databases
     *
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listDatabases()
    {
        
$result $this->loadManager('List databases');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listDatabases($this));
    }

    
// }}}
    // {{{ listUsers()

    /**
     * list all users
     *
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listUsers()
    {
        
$result $this->loadManager('List users');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listUsers($this));
    }

    
// }}}
    // {{{ listViews()

    /**
     * list all viewes in the current database
     *
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listViews()
    {
        
$result $this->loadManager('List views');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listViews($this));
    }

    
// }}}
    // {{{ listFunctions()

    /**
     * list all functions in the current database
     *
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listFunctions()
    {
        
$result $this->loadManager('List functions');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listFunctions($this));
    }

    
// }}}
    // {{{ listTables()

    /**
     * list all tables in the current database
     *
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listTables()
    {
        
$result $this->loadManager('List tables');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listTables($this));
    }

    
// }}}
    // {{{ listTableFields()

    /**
     * list all fields in a tables in the current database
     *
     * @param string $table name of table that should be used in method
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listTableFields($table)
    {
        
$result $this->loadManager('List table fields');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listTableFields($this$table));
    }

    
// }}}
    // {{{ getTableFieldDefinition()

    /**
     * get the stucture of a field into an array
     *
     * @param string $table name of table that should be used in method
     * @param string $fields name of field that should be used in method
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function getTableFieldDefinition($table$field)
    {
        
$result $this->loadManager('Get table field definition');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->getTableFieldDefinition($this$table$field));
    }

    
// }}}
    // {{{ getFieldDeclaration()

    /**
     * get declaration of a field
     *
     * @param string $field_name name of the field to be created
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Boolean value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return mixed string on success, a MDB error on failure
     * @access public
     */
    
function getFieldDeclaration($field_name$field)
    {
        
$result $this->loadManager('Get table field definition');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->getFieldDeclaration($this$field_name$field));
    }

    
// }}}
    // {{{ getFieldDeclarationList()

    /**
     * get declaration of a number of field in bulk
     *
     * @param string $fields a multidimensional associative array.
     * The first dimension determines the field name, while the second
     * dimension is keyed with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Boolean value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     *
     *       default
     *           Boolean value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return mixed string on success, a MDB error on failure
     * @access public
     */
    
function getFieldDeclarationList($fields)
    {
        
$result $this->loadManager('Get table field list');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->getFieldDeclarationList($this$fields));
    }

    
// }}}
    // {{{ _isSequenceName()

    /**
     * list all tables in the current database
     *
     * @param string $sqn string that containts name of a potential sequence
     * @return mixed name of the sequence if $sqn is a name of a sequence, else FALSE
     * @access private
     */
    
function _isSequenceName($sqn)
    {
        
$result $this->loadManager('is sequence name');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->_isSequenceName($this$sqn));
    }

    
// }}}
    // {{{ createIndex()

    /**
     * get the stucture of a field into an array
     *
     * @param string $table name of the table on which the index is to be
     *       created
     * @param string $name name of the index to be created
     * @param array $definition associative array that defines properties of
     *       the index to be created. Currently, only one property named FIELDS
     *       is supported. This property is also an associative with the names
     *       of the index fields as array indexes. Each entry of this array is
     *       set to another type of associative array that specifies properties
     *       of the index that are specific to each field.
     *
     *       Currently, only the sorting property is supported. It should be
     *       used to define the sorting direction of the index. It may be set
     *       to either ascending or descending. Not all DBMS support index
     *       sorting direction configuration. The DBMS drivers of those that do
     *       not support it ignore this property. Use the function support() to
     *       determine whether the DBMS driver can manage indexes.
     *
     *       Example
     *          array(
     *              'FIELDS' => array(
     *                  'user_name' => array(
     *                      'sorting' => 'ascending'
     *                  ),
     *                  'last_login' => array()
     *              )
     *          )
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function createIndex($table$name$definition)
    {
        
$result $this->loadManager('Create index');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->createIndex($this$table$name$definition));
    }

    
// }}}
    // {{{ dropIndex()

    /**
     * drop existing index
     *
     * @param string $table name of table that should be used in method
     * @param string $name name of the index to be dropped
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function dropIndex($table$name)
    {
        
$result $this->loadManager('Drop index');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->dropIndex($this$table $name));
    }

    
// }}}
    // {{{ listTableIndexes()

    /**
     * list all indexes in a table
     *
     * @param string $table name of table that should be used in method
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listTableIndexes($table)
    {
        
$result $this->loadManager('List table index');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listTableIndexes($this$table));
    }

    
// }}}
    // {{{ getTableIndexDefinition()

    /**
     * get the stucture of an index into an array
     *
     * @param string $table name of table that should be used in method
     * @param string $index name of index that should be used in method
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function getTableIndexDefinition($table$index)
    {
        
$result $this->loadManager('Get table index definition');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->getTableIndexDefinition($this$table$index));
    }

    
// }}}
    // {{{ createSequence()

    /**
     * create sequence
     *
     * @param string $name name of the sequence to be created
     * @param string $start start value of the sequence; default is 1
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function createSequence($name$start 1)
    {
        
$result $this->loadManager('Create sequence');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->createSequence($this$name$start));
    }

    
// }}}
    // {{{ dropSequence()

    /**
     * drop existing sequence
     *
     * @param string $name name of the sequence to be dropped
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function dropSequence($name)
    {
        
$result $this->loadManager('Drop sequence');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->dropSequence($this$name));
    }

    
// }}}
    // {{{ listSequences()

    /**
     * list all tables in the current database
     *
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function listSequences()
    {
        
$result $this->loadManager('List sequences');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->listSequences($this));
    }

    
// }}}
    // {{{ getSequenceDefinition()

    /**
     * get the stucture of a sequence into an array
     *
     * @param string $sequence name of sequence that should be used in method
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function getSequenceDefinition($sequence)
    {
        
$result $this->loadManager('Get sequence definition');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->manager->getSequenceDefinition($this$sequence));
    }

    
// }}}
    // {{{ query()

    /**
     * Send a query to the database and return any results
     *
     * @param string $query the SQL query
     * @param mixed   $types  array that contains the types of the columns in
     *                        the result set
     * @return mixed a result handle or MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function query($query$types NULL)
    {
        
$this->debug("Query: $query");
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL'Query: database queries are not implemented'));
    }

    
// }}}
    // {{{ setSelectedRowRange()

    /**
     * set the range of the next query
     *
     * @param string $first first row to select
     * @param string $limit number of rows to select
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function setSelectedRowRange($first$limit)
    {
        if (!isset(
$this->supported['SelectRowRanges'])) {
            return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
                
'Set selected row range: selecting row ranges is not supported by this driver'));
        }
        
$first = (int)$first;
        if (
$first 0) {
            return(
$this->raiseError(MDB_ERROR_SYNTAXNULLNULL,
                
'Set selected row range: it was not specified a valid first selected range row'));
        }
        
$limit = (int)$limit;
        if (
$limit 1) {
            return(
$this->raiseError(MDB_ERROR_SYNTAXNULLNULL,
                
'Set selected row range: it was not specified a valid selected range row limit'));
        }
        
$this->first_selected_row $first;
        
$this->selected_row_limit $limit;
        return(
MDB_OK);
    }

    
// }}}
    // {{{ limitQuery()

    /**
     * Generates a limited query
     *
     * @param string $query query
     * @param mixed   $types  array that contains the types of the columns in
     *                        the result set
     * @param integer $from the row to start to fetching
     * @param integer $count the numbers of rows to fetch
     * @return mixed a valid ressource pointer or a MDB_Error
     * @access public
     */
    
function limitQuery($query$types NULL$from$count)
    {
        
$result $this->setSelectedRowRange($from$count);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->query($query$types));
    }

    
// }}}
    // {{{ subSelect()

    /**
     * simple subselect emulation: leaves the query untouched for all RDBMS
     * that support subselects
     *
     * @access public
     *
     * @param string $query the SQL query for the subselect that may only
     *                      return a column
     * @param string $quote determines if the data needs to be quoted before
     *                      being returned
     *
     * @return string the query
     */
    
function subSelect($query$quote FALSE)
    {
        if (
$this->supported['SubSelects'] == 1) {
            return(
$query);
        }
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL'Subselect: subselect not implemented'));
    }

    
// }}}
    // {{{ replace()

    /**
     * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT
     * query, except that if there is already a row in the table with the same
     * key field values, the REPLACE query just updates its values instead of
     * inserting a new row.
     *
     * The REPLACE type of query does not make part of the SQL standards. Since
     * pratically only MySQL implements it natively, this type of query is
     * emulated through this method for other DBMS using standard types of
     * queries inside a transaction to assure the atomicity of the operation.
     *
     * @param string $table name of the table on which the REPLACE query will
     *       be executed.
     * @param array $fields associative array that describes the fields and the
     *       values that will be inserted or updated in the specified table. The
     *       indexes of the array are the names of all the fields of the table.
     *       The values of the array are also associative arrays that describe
     *       the values and other properties of the table fields.
     *
     *       Here follows a list of field properties that need to be specified:
     *
     *       Value
     *           Value to be assigned to the specified field. This value may be
     *           of specified in database independent type format as this
     *           function can perform the necessary datatype conversions.
     *
     *           Default: this property is required unless the Null property is
     *           set to 1.
     *
     *       Type
     *           Name of the type of the field. Currently, all types Metabase
     *           are supported except for clob and blob.
     *
     *           Default: no type conversion
     *
     *       Null
     *           Boolean property that indicates that the value for this field
     *           should be set to NULL.
     *
     *           The default value for fields missing in INSERT queries may be
     *           specified the definition of a table. Often, the default value
     *           is already NULL, but since the REPLACE may be emulated using
     *           an UPDATE query, make sure that all fields of the table are
     *           listed in this function argument array.
     *
     *           Default: 0
     *
     *       Key
     *           Boolean property that indicates that this field should be
     *           handled as a primary key or at least as part of the compound
     *           unique index of the table that will determine the row that will
     *           updated if it exists or inserted a new row otherwise.
     *
     *           This function will fail if no key field is specified or if the
     *           value of a key field is set to NULL because fields that are
     *           part of unique index they may not be NULL.
     *
     *           Default: 0
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function replace($table$fields)
    {
        if (!
$this->supported['Replace']) {
            return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL'Replace: replace query is not supported'));
        }
        
$count count($fields);
        for(
$keys 0$condition $insert $values ''reset($fields), $field 0;
            
$field $count;
            
next($fields), $field++)
        {
            
$name key($fields);
            if (
$field 0) {
                
$insert .= ', ';
                
$values .= ', ';
            }
            
$insert .= $name;
            if (isset(
$fields[$name]['Null']) && $fields[$name]['Null']) {
                
$value 'NULL';
            } else {
                if(isset(
$fields[$name]['Type'])) {
                    switch (
$fields[$name]['Type']) {
                        case 
'text':
                            
$value $this->getTextValue($fields[$name]['Value']);
                            break;
                        case 
'boolean':
                            
$value $this->getBooleanValue($fields[$name]['Value']);
                            break;
                        case 
'integer':
                            
$value $this->getIntegerValue($fields[$name]['Value']);
                            break;
                        case 
'decimal':
                            
$value $this->getDecimalValue($fields[$name]['Value']);
                            break;
                        case 
'float':
                            
$value $this->getFloatValue($fields[$name]['Value']);
                            break;
                        case 
'date':
                            
$value $this->getDateValue($fields[$name]['Value']);
                            break;
                        case 
'time':
                            
$value $this->getTimeValue($fields[$name]['Value']);
                            break;
                        case 
'timestamp':
                            
$value $this->getTimestampValue($fields[$name]['Value']);
                            break;
                        default:
                            return(
$this->raiseError(MDB_ERROR_CANNOT_REPLACENULLNULL,
                                
'no supported type for field "' $name '" specified'));
                    }
                } else {
                    
$value $fields[$name]['Value'];
                }
            }
            
$values .= $value;
            if (isset(
$fields[$name]['Key']) && $fields[$name]['Key']) {
                if (
$value === 'NULL') {
                    return(
$this->raiseError(MDB_ERROR_CANNOT_REPLACENULLNULL,
                        
'key values may not be NULL'));
                }
                
$condition .= ($keys ' AND ' ' WHERE ') . $name '=' $value;
                
$keys++;
            }
        }
        if (
$keys == 0) {
            return(
$this->raiseError(MDB_ERROR_CANNOT_REPLACENULLNULL,
                
'not specified which fields are keys'));
        }
        
$in_transaction $this->in_transaction;
        if (!
$in_transaction && MDB::isError($result $this->autoCommit(FALSE))) {
            return(
$result);
        }
        
$success $this->query("DELETE FROM $table$condition");
        if (!
MDB::isError($success)) {
            
$affected_rows $this->affected_rows;
            
$success $this->query("INSERT INTO $table ($insert) VALUES ($values)");
            
$affected_rows += $this->affected_rows;
        }

        if (!
$in_transaction) {
            if (!
MDB::isError($success)) {
                if (!
MDB::isError($success $this->commit())
                    && !
MDB::isError($success $this->autoCommit(TRUE))
                    && isset(
$this->supported['AffectedRows'])
                ) {
                    
$this->affected_rows $affected_rows;
                }
            } else {
                
$this->rollback();
                
$this->autoCommit(TRUE);
            }
        }
        return(
$success);
    }

    
// }}}
    // {{{ prepareQuery()

    /**
     * Prepares a query for multiple execution with execute().
     * With some database backends, this is emulated.
     * prepareQuery() requires a generic query as string like
     * 'INSERT INTO numbers VALUES(?,?,?)'. The ? are wildcards.
     * Types of wildcards:
     *    ? - a quoted scalar value, i.e. strings, integers
     *
     * @param string $ the query to prepare
     * @return mixed resource handle for the prepared query on success, a DB
     *        error on failure
     * @access public
     * @see execute
     */
    
function prepareQuery($query)
    {
        
$this->debug("PrepareQuery: $query");
        
$positions = array();
        for(
$position 0;
            
$position strlen($query) && is_integer($question strpos($query'?'$position));
        ) {
            if (
is_integer($quote strpos($query"'"$position))
                && 
$quote $question
            
) {
                if (!
is_integer($end_quote strpos($query"'"$quote 1))) {
                    return(
$this->raiseError(MDB_ERROR_SYNTAXNULLNULL,
                        
'Prepare query: query with an unterminated text string specified'));
                }
                switch (
$this->escape_quotes) {
                    case 
'':
                    case 
"'":
                        
$position $end_quote 1;
                        break;
                    default:
                        if (
$end_quote == $quote 1) {
                            
$position $end_quote 1;
                        } else {
                            if (
$query[$end_quote-1] == $this->escape_quotes) {
                                
$position $end_quote;
                            } else {
                                
$position $end_quote 1;
                            }
                        }
                        break;
                }
            } else {
                
$positions[] = $question;
                
$position $question 1;
            }
        }
        
$this->prepared_queries[] = array(
            
'Query' => $query,
            
'Positions' => $positions,
            
'Values' => array(),
            
'Types' => array()
            );
        
$prepared_query count($this->prepared_queries);
        if (
$this->selected_row_limit 0) {
            
$this->prepared_queries[$prepared_query-1]['First'] = $this->first_selected_row;
            
$this->prepared_queries[$prepared_query-1]['Limit'] = $this->selected_row_limit;
        }
        return(
$prepared_query);
    }

    
// }}}
    // {{{ _validatePreparedQuery()

    /**
     * validate that a handle is infact a prepared query
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @access private
     */
    
function _validatePreparedQuery($prepared_query)
    {
        if (
$prepared_query || $prepared_query count($this->prepared_queries)) {
            return(
$this->raiseError(MDB_ERROR_INVALIDNULLNULL,
                
'Validate prepared query: invalid prepared query'));
        }
        if (
gettype($this->prepared_queries[$prepared_query-1]) != 'array') {
            return(
$this->raiseError(MDB_ERROR_INVALIDNULLNULL,
                
'Validate prepared query: prepared query was already freed'));
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ freePreparedQuery()

    /**
     * Release resources allocated for the specified prepared query.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function freePreparedQuery($prepared_query)
    {
        
$result $this->_validatePreparedQuery($prepared_query);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        
$this->prepared_queries[$prepared_query-1] = '';
        return(
MDB_OK);
    }

    
// }}}
    // {{{ _executePreparedQuery()

    /**
     * Execute a prepared query statement.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param string $query query to be executed
     * @param array $types array that contains the types of the columns in
     *       the result set
     * @return mixed a result handle or MDB_OK on success, a MDB error on failure
     * @access private
     */
    
function _executePreparedQuery($prepared_query$query$types NULL)
    {
        return(
$this->query($query$types));
    }

    
// }}}
    // {{{ executeQuery()

    /**
     * Execute a prepared query statement.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param array $types array that contains the types of the columns in the
     *       result set
     * @return mixed a result handle or MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function executeQuery($prepared_query$types NULL)
    {
        
$result $this->_validatePreparedQuery($prepared_query);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        
$index $prepared_query-1;
        
$success MDB_OK;
        
$this->clobs[$prepared_query] = $this->blobs[$prepared_query] = array();
        
$query '';
        for(
$last_position $position 0;
            
$position count($this->prepared_queries[$index]['Positions']);
            
$position++) {
            if (!isset(
$this->prepared_queries[$index]['Values'][$position])) {
                return(
$this->raiseError(MDB_ERROR_NEED_MORE_DATANULLNULL,
                    
'Execute query: it was not defined query argument '.($position 1)));
            }
            
$current_position $this->prepared_queries[$index]['Positions'][$position];
            
$query .= substr($this->prepared_queries[$index]['Query'], $last_position$current_position $last_position);
            
$value $this->prepared_queries[$index]['Values'][$position];
            if (
$this->prepared_queries[$index]['IsNULL'][$position]) {
                
$query .= $value;
            } else {
                switch (
$this->prepared_queries[$index]['Types'][$position]) {
                    case 
'clob':
                        if (!
MDB::isError($success $this->getClobValue($prepared_query$position 1$value))) {
                            
$this->clobs[$prepared_query][$position 1] = $success;
                            
$query .= $this->clobs[$prepared_query][$position 1];
                        }
                        break;
                    case 
'blob':
                        if (!
MDB::isError($success $this->getBlobValue($prepared_query$position 1$value))) {
                            
$this->blobs[$prepared_query][$position 1] = $success;
                            
$query .= $this->blobs[$prepared_query][$position 1];
                        }
                        break;
                    default:
                        
$query .= $value;
                        break;
                }
            }
            
$last_position $current_position 1;
        }
        if (!
MDB::isError($success)) {
            
$query .= substr($this->prepared_queries[$index]['Query'], $last_position);
            if (
$this->selected_row_limit 0) {
                
$this->prepared_queries[$index]['First'] = $this->first_selected_row;
                
$this->prepared_queries[$index]['Limit'] = $this->selected_row_limit;
            }
            if (isset(
$this->prepared_queries[$index]['Limit'])
                && 
$this->prepared_queries[$index]['Limit'] > 0
            
) {
                
$this->first_selected_row $this->prepared_queries[$index]['First'];
                
$this->selected_row_limit $this->prepared_queries[$index]['Limit'];
            } else {
                
$this->first_selected_row $this->selected_row_limit 0;
            }
            
$success $this->_executePreparedQuery($prepared_query$query$types);
        }
        for(
reset($this->clobs[$prepared_query]), $clob 0;
            
$clob count($this->clobs[$prepared_query]);
            
$clob++, next($this->clobs[$prepared_query])) {
            
$this->freeClobValue($prepared_querykey($this->clobs[$prepared_query]), $this->clobs[$prepared_query][key($this->clobs[$prepared_query])], $success);
        }
        unset(
$this->clobs[$prepared_query]);
        for(
reset($this->blobs[$prepared_query]), $blob 0;
            
$blob count($this->blobs[$prepared_query]);
            
$blob++, next($this->blobs[$prepared_query])) {
            
$this->freeBlobValue($prepared_querykey($this->blobs[$prepared_query]), $this->blobs[$prepared_query][key($this->blobs[$prepared_query])], $success);
        }
        unset(
$this->blobs[$prepared_query]);
        return(
$success);
    }

    
// }}}
    // {{{ execute()

    /**
     * Executes a prepared SQL query
     * With execute() the generic query of prepare is assigned with the given
     * data array. The values of the array inserted into the query in the same
     * order like the array order
     *
     * @param resource $prepared_query query handle from prepare()
     * @param array $types array that contains the types of the columns in
     *        the result set
     * @param array $params numeric array containing the data to insert into
     *        the query
     * @param array $param_types array that contains the types of the values
     *        defined in $params
     * @return mixed a new result handle or a MDB_Error when fail
     * @access public
     * @see prepare()
     */
    
function execute($prepared_query$types NULL$params FALSE$param_types NULL)
    {
        
$this->setParamArray($prepared_query$params$param_types);

        return(
$this->executeQuery($prepared_query$types));
    }

    
// }}}
    // {{{ executeMultiple()

    /**
     * This function does several execute() calls on the same statement handle.
     * $params must be an array indexed numerically from 0, one execute call is
     * done for every 'row' in the array.
     *
     * If an error occurs during execute(), executeMultiple() does not execute
     * the unfinished rows, but rather returns that error.
     *
     * @param resource $stmt query handle from prepare()
     * @param array $types array that contains the types of the columns in
     *        the result set
     * @param array $params numeric array containing the
     *        data to insert into the query
     * @param array $parAM_types array that contains the types of the values
     *        defined in $params
     * @return mixed a result handle or MDB_OK on success, a MDB error on failure
     * @access public
     * @see prepare(), execute()
     */
    
function executeMultiple($prepared_query$types NULL$params$param_types NULL)
    {
        for(
$i 0$j count($params); $i $j$i++) {
            
$result $this->execute($prepared_query$types$params[$i], $param_types);
            if (
MDB::isError($result)) {
                return(
$result);
            }
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ setParam()

    /**
     * Set the value of a parameter of a prepared query.
     *
     * @param int $prepared_query argument is a handle that was returned
     *       by the function prepareQuery()
     * @param int $parameter the order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $type designation of the type of the parameter to be set.
     *       The designation of the currently supported types is as follows:
     *           text, boolean, integer, decimal, float, date, time, timestamp,
     *           clob, blob
     * @param mixed $value value that is meant to be assigned to specified
     *       parameter. The type of the value depends on the $type argument.
     * @param boolean $is_null flag that indicates whether whether the
     *       parameter is a NULL
     * @param string $field name of the field that is meant to be assigned
     *       with this parameter value when it is of type clob or blob
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function setParam($prepared_query$parameter$type$value$is_null 0$field '')
    {
        
$result $this->_validatePreparedQuery($prepared_query);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        
$index $prepared_query 1;
        if (
$parameter || $parameter count($this->prepared_queries[$index]['Positions'])) {
            return(
$this->raiseError(MDB_ERROR_SYNTAXNULLNULL,
                
'Query set: it was not specified a valid argument number'));
        }
        
$this->prepared_queries[$index]['Values'][$parameter-1] = $value;
        
$this->prepared_queries[$index]['Types'][$parameter-1] = $type;
        
$this->prepared_queries[$index]['Fields'][$parameter-1] = $field;
        
$this->prepared_queries[$index]['IsNULL'][$parameter-1] = $is_null;
        return(
MDB_OK);
    }

    
// }}}
    // {{{ setParamArray()

    /**
     * Set the values of multiple a parameter of a prepared query in bulk.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param array $params array thats specifies all necessary infromation
     *       for setParam() the array elements must use keys corresponding to
     *       the number of the position of the parameter.
     * @param array $types array thats specifies the types of the fields
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamArray($prepared_query$params$types NULL)
    {
        if (
is_array($types)) {
            if (
count($params) != count($types)) {
                return 
$this->raiseError(MDB_ERROR_SYNTAXNULLNULL,
                    
'setParamArray: the number of given types ('.count($types).')'
                    
.'is not corresponding to the number of given parameters ('.count($params).')');
            }
            for(
$i 0$j count($params); $i $j; ++$i) {
                switch (
$types[$i]) {
                    case 
'NULL':
                        
$success $this->setParam($prepared_query$i 1$params[$i][0], 'NULL'1'');
                        break;
                    case 
'text':
                        
$success $this->setParam($prepared_query$i 1'text'$this->getTextValue($params[$i]));
                        break;
                    case 
'clob':
                        
$success $this->setParam($prepared_query$i 1'clob'$params[$i][0], 0$params[$i][1]);
                        break;
                    case 
'blob':
                        
$success $this->setParam($prepared_query$i 1'blob'$params[$i][0], 0$params[$i][1]);
                        break;
                    case 
'integer':
                        
$success $this->setParam($prepared_query$i 1'integer'$this->getIntegerValue($params[$i]));
                        break;
                    case 
'boolean':
                        
$success $this->setParam($prepared_query$i 1'boolean'$this->getBooleanValue($params[$i]));
                        break;
                    case 
'date':
                        
$success $this->setParam($prepared_query$i 1'date'$this->getDateValue($params[$i]));
                        break;
                    case 
'timestamp':
                        
$success $this->setParam($prepared_query$i 1'timestamp'$this->getTimestampValue($params[$i]));
                        break;
                    case 
'time':
                        
$success $this->setParam($prepared_query$i 1'time'$this->getTimeValue($params[$i]));
                        break;
                    case 
'float':
                        
$success $this->setParam($prepared_query$i 1'float'$this->getFloatValue($params[$i]));
                        break;
                    case 
'decimal':
                        
$success $this->setParam($prepared_query$i 1'decimal'$this->getDecimalValue($params[$i]));
                        break;
                    default:
                        
$success $this->setParam($prepared_query$i 1'text'$this->getTextValue($params[$i]));
                        break;
                }
                if (
MDB::isError($success)) {
                    return(
$success);
                }
            }
        } else {
            for(
$i 0$j count($params); $i $j; ++$i) {
                
$success $this->setParam($prepared_query$i 1'text'$this->getTextValue($params[$i]));
                if (
MDB::isError($success)) {
                    return(
$success);
                }
            }
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ setParamNull()

    /**
     * Set the value of a parameter of a prepared query to NULL.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $type designation of the type of the parameter to be set.
     *       The designation of the currently supported types is list in the
     *       usage of the function  setParam()
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamNull($prepared_query$parameter$type)
    {
        return(
$this->setParam($prepared_query$parameter$type'NULL'1''));
    }

    
// }}}
    // {{{ setParamText()

    /**
     * Set a parameter of a prepared query with a text value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $value text value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamText($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'text'$this->getTextValue($value)));
    }

    
// }}}
    // {{{ setParamClob()

    /**
     * Set a parameter of a prepared query with a character large object value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param int $value handle of large object created with createLOB()
     *       function from which it will be read the data value that is meant
     *       to be assigned to specified parameter.
     * @param string $field name of the field of a INSERT or UPDATE query to
     *       which it will be assigned the value to specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamClob($prepared_query$parameter$value$field)
    {
        return(
$this->setParam($prepared_query$parameter'clob'$value0$field));
    }

    
// }}}
    // {{{ setParamBlob()

    /**
     * Set a parameter of a prepared query with a binary large object value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param int $value handle of large object created with createLOB()
     *       function from which it will be read the data value that is meant
     *       to be assigned to specified parameter.
     * @param string $field name of the field of a INSERT or UPDATE query to
     *       which it will be assigned the value to specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamBlob($prepared_query$parameter$value$field)
    {
        return(
$this->setParam($prepared_query$parameter'blob'$value0$field));
    }

    
// }}}
    // {{{ setParamInteger()

    /**
     * Set a parameter of a prepared query with a text value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param int $value an integer value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamInteger($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'integer'$this->getIntegerValue($value)));
    }

    
// }}}
    // {{{ setParamBoolean()

    /**
     * Set a parameter of a prepared query with a boolean value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param boolean $value boolean value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamBoolean($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'boolean'$this->getBooleanValue($value)));
    }

    
// }}}
    // {{{ setParamDate()

    /**
     * Set a parameter of a prepared query with a date value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $value date value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamDate($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'date'$this->getDateValue($value)));
    }

    
// }}}
    // {{{ setParamTimestamp()

    /**
     * Set a parameter of a prepared query with a time stamp value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $value time stamp value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamTimestamp($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'timestamp'$this->getTimestampValue($value)));
    }

    
// }}}
    // {{{ setParamTime()

    /**
     * Set a parameter of a prepared query with a time value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $value time value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamTime($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'time'$this->getTimeValue($value)));
    }

    
// }}}
    // {{{ setParamFloat()

    /**
     * Set a parameter of a prepared query with a float value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $value float value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamFloat($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'float'$this->getFloatValue($value)));
    }

    
// }}}
    // {{{ setParamDecimal()

    /**
     * Set a parameter of a prepared query with a decimal value.
     *
     * @param int $prepared_query argument is a handle that was returned by
     *       the function prepareQuery()
     * @param int $parameter order number of the parameter in the query
     *       statement. The order number of the first parameter is 1.
     * @param string $value decimal value that is meant to be assigned to
     *       specified parameter.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     * @see setParam()
     */
    
function setParamDecimal($prepared_query$parameter$value)
    {
        return(
$this->setParam($prepared_query$parameter'decimal'$this->getDecimalValue($value)));
    }

    
// }}}
    // {{{ setResultTypes()

    /**
     * Define the list of types to be associated with the columns of a given
     * result set.
     *
     * This function may be called before invoking fetchInto(), fetchOne(),
     * fetchRow(), fetchCol() and fetchAll() so that the necessary data type
     * conversions are performed on the data to be retrieved by them. If this
     * function is not called, the type of all result set columns is assumed
     * to be text, thus leading to not perform any conversions.
     *
     * @param resource $result result identifier
     * @param string $types array variable that lists the
     *       data types to be expected in the result set columns. If this array
     *       contains less types than the number of columns that are returned
     *       in the result set, the remaining columns are assumed to be of the
     *       type text. Currently, the types clob and blob are not fully
     *       supported.
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access public
     */
    
function setResultTypes($result$types)
    {
        
$result_value intval($result);
        if (isset(
$this->result_types[$result_value])) {
            return(
$this->raiseError(MDB_ERROR_INVALIDNULLNULL,
                
'Set result types: attempted to redefine the types of the columns of a result set'));
        }
        
$columns $this->numCols($result);
        if (
MDB::isError($columns)) {
            return(
$columns);
        }
        if (
$columns count($types)) {
            return(
$this->raiseError(MDB_ERROR_SYNTAXNULLNULL,
                
'Set result types: it were specified more result types (' count($types) . ') than result columns (' $columns ')'));
        }
        
$valid_types = array(
            
'text'      => MDB_TYPE_TEXT,
            
'boolean'   => MDB_TYPE_BOOLEAN,
            
'integer'   => MDB_TYPE_INTEGER,
            
'decimal'   => MDB_TYPE_DECIMAL,
            
'float'     => MDB_TYPE_FLOAT,
            
'date'      => MDB_TYPE_DATE,
            
'time'      => MDB_TYPE_TIME,
            
'timestamp' => MDB_TYPE_TIMESTAMP,
            
'clob'      => MDB_TYPE_CLOB,
            
'blob'      => MDB_TYPE_BLOB
        
);
        for(
$column 0$column count($types); $column++) {
            if (!isset(
$valid_types[$types[$column]])) {
                return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
                    
'Set result types: ' $types[$column] . ' is not a supported column type'));
            }
            
$this->result_types[$result_value][$column] = $valid_types[$types[$column]];
        }
        while (
$column $columns) {
            
$this->result_types[$result_value][$column] = MDB_TYPE_TEXT;
            
$column++;
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ affectedRows()

    /**
     * returns the affected rows of a query
     *
     * @return mixed MDB_Error or number of rows
     * @access public
     */
    
function affectedRows()
    {
        if (
$this->affected_rows == -1) {
            return(
$this->raiseError(MDB_ERROR_NEED_MORE_DATA));
        }
        return(
$this->affected_rows);
    }

    
// }}}
    // {{{ getColumnNames()

    /**
     * Retrieve the names of columns returned by the DBMS in a query result.
     *
     * @param resource $result result identifier
     * @return mixed associative array variable
     *       that holds the names of columns. The indexes of the array are
     *       the column names mapped to lower case and the values are the
     *       respective numbers of the columns starting from 0. Some DBMS may
     *       not return any columns when the result set does not contain any
     *       rows.
     *      a MDB error on failure
     * @access public
     */
    
function getColumnNames($result)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Get column names: obtaining result column names is not implemented'));
    }

    
// }}}
    // {{{ numCols()

    /**
     * Count the number of columns returned by the DBMS in a query result.
     *
     * @param resource $result result identifier
     * @return mixed integer value with the number of columns, a MDB error
     *       on failure
     * @access public
     */
    
function numCols($result)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Number of columns: obtaining the number of result columns is not implemented'));
    }

    
// }}}
    // {{{ endOfResult()

    /**
     * check if the end of the result set has been reached
     *
     * @param resource $result result identifier
     * @return mixed TRUE or FALSE on sucess, a MDB error on failure
     * @access public
     */
    
function endOfResult($result)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'End of result: end of result method not implemented'));
    }

    
// }}}
    // {{{ setFetchMode()

    /**
     * Sets which fetch mode should be used by default on queries
     * on this connection.
     *
     * @param integer $fetchmode MDB_FETCHMODE_ORDERED or MDB_FETCHMODE_ASSOC,
     *       possibly bit-wise OR'ed with MDB_FETCHMODE_FLIPPED.
     * @access public
     * @see MDB_FETCHMODE_ORDERED
     * @see MDB_FETCHMODE_ASSOC
     * @see MDB_FETCHMODE_FLIPPED
     */
    
function setFetchMode($fetchmode)
    {
        switch (
$fetchmode) {
            case 
MDB_FETCHMODE_ORDERED:
            case 
MDB_FETCHMODE_ASSOC:
                
$this->fetchmode $fetchmode;
                break;
            default:
                return(
$this->raiseError('invalid fetchmode mode'));
        }
    }

    
// }}}
    // {{{ fetch()

    /**
     * fetch value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed string on success, a MDB error on failure
     * @access public
     */
    
function fetch($result$row$field)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Fetch: fetch result method not implemented'));
    }

    
// }}}
    // {{{ fetchLob()

    /**
     * fetch a lob value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed string on success, a MDB error on failure
     * @access public
     */
    
function fetchLob($result$row$field)
    {
        
$lob count($this->lobs) + 1;
        
$this->lobs[$lob] = array(
            
'Result' => $result,
            
'Row' => $row,
            
'Field' => $field,
            
'Position' => 0
        
);
        
$dst_lob = array(
            
'Database' => $this,
            
'Error' => '',
            
'Type' => 'resultlob',
            
'ResultLOB' => $lob
        
);
        if (
MDB::isError($lob $this->createLob($dst_lob))) {
            return(
$this->raiseError(MDB_ERRORNULLNULL,
                
'Fetch LOB result: ' $dst_lob['Error']));
        }
        return(
$lob);
    }

    
// }}}
    // {{{ _retrieveLob()

    /**
     * fetch a float value from a result set
     *
     * @param int $lob handle to a lob created by the createLob() function
     * @return mixed MDB_OK on success, a MDB error on failure
     * @access private
     */
    
function _retrieveLob($lob)
    {
        if (!isset(
$this->lobs[$lob])) {
            return(
$this->raiseError(MDB_ERROR_NEED_MORE_DATANULLNULL,
                
'Fetch LOB result: it was not specified a valid lob'));
        }
        if (!isset(
$this->lobs[$lob]['Value'])) {
            
$this->lobs[$lob]['Value'] = $this->fetch($this->lobs[$lob]['Result'], $this->lobs[$lob]['Row'], $this->lobs[$lob]['Field']);
        }
        return(
MDB_OK);
    }

    
// }}}
    // {{{ endOfResultLob()

    /**
     * Determine whether it was reached the end of the large object and
     * therefore there is no more data to be read for the its input stream.
     *
     * @param int $lob handle to a lob created by the createLob() function
     * @return mixed TRUE or FALSE on success, a MDB error on failure
     * @access public
     */
    
function endOfResultLob($lob)
    {
        
$result $this->_retrieveLob($lob);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->lobs[$lob]['Position'] >= strlen($this->lobs[$lob]['Value']));
    }

    
// }}}
    // {{{ _readResultLob()

    /**
     * Read data from large object input stream.
     *
     * @param int $lob handle to a lob created by the createLob() function
     * @param blob $data reference to a variable that will hold data to be
     *       read from the large object input stream
     * @param int $length integer value that indicates the largest ammount of
     *       data to be read from the large object input stream.
     * @return mixed length on success, a MDB error on failure
     * @access private
     */
    
function _readResultLob($lob, &$data$length)
    {
        
$result $this->_retrieveLob($lob);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        
$length min($lengthstrlen($this->lobs[$lob]['Value']) - $this->lobs[$lob]['Position']);
        
$data substr($this->lobs[$lob]['Value'], $this->lobs[$lob]['Position'], $length);
        
$this->lobs[$lob]['Position'] += $length;
        return(
$length);
    }

    
// }}}
    // {{{ _destroyResultLob()

    /**
     * Free any resources allocated during the lifetime of the large object
     * handler object.
     *
     * @param int $lob handle to a lob created by the createLob() function
     * @access private
     */
    
function _destroyResultLob($lob)
    {
        if (isset(
$this->lobs[$lob])) {
            
$this->lobs[$lob] = '';
        }
    }

    
// }}}
    // {{{ fetchClob()

    /**
     * fetch a clob value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure,
     *        a MDB error on failure
     * @access public
     */
    
function fetchClob($result$row$field)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'fetch clob result method is not implemented'));
    }

    
// }}}
    // {{{ fetchBlob()

    /**
     * fetch a blob value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure
     * @access public
     */
    
function fetchBlob($result$row$field)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'fetch blob result method is not implemented'));
    }

    
// }}}
    // {{{ resultIsNull()

    /**
     * Determine whether the value of a query result located in given row and
     *    field is a NULL.
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed TRUE or FALSE on success, a MDB error on failure
     * @access public
     */
    
function resultIsNull($result$row$field)
    {
        
$result $this->fetch($result$row$field);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(!isset(
$result));
    }

    
// }}}
    // {{{ _baseConvertResult()

    /**
     * general type conversion method
     *
     * @param mixed $value refernce to a value to be converted
     * @param int $type constant that specifies which type to convert to
     * @return object a MDB error on failure
     * @access private
     */
    
function _baseConvertResult($value$type)
    {
        switch (
$type) {
            case 
MDB_TYPE_TEXT:
                return(
$value);
            case 
MDB_TYPE_BLOB:
                return(
$value);
            case 
MDB_TYPE_CLOB:
                return(
$value);
            case 
MDB_TYPE_INTEGER:
                return(
intval($value));
            case 
MDB_TYPE_BOOLEAN:
                return (
$value == 'Y') ? TRUE FALSE;
            case 
MDB_TYPE_DECIMAL:
                return(
$value);
            case 
MDB_TYPE_FLOAT:
                return(
doubleval($value));
            case 
MDB_TYPE_DATE:
                return(
$value);
            case 
MDB_TYPE_TIME:
                return(
$value);
            case 
MDB_TYPE_TIMESTAMP:
                return(
$value);
            case 
MDB_TYPE_CLOB:
                return(
$value);
            case 
MDB_TYPE_BLOB:
                return(
$this->raiseError(MDB_ERROR_INVALIDNULLNULL,
                    
'BaseConvertResult: attempt to convert result value to an unsupported type ' $type));
            default:
                return(
$this->raiseError(MDB_ERROR_INVALIDNULLNULL,
                    
'BaseConvertResult: attempt to convert result value to an unknown type ' $type));
        }
    }

    
// }}}
    // {{{ convertResult()

    /**
     * convert a value to a RDBMS indepdenant MDB type
     *
     * @param mixed $value value to be converted
     * @param int $type constant that specifies which type to convert to
     * @return mixed converted value or a MDB error on failure
     * @access public
     */
    
function convertResult($value$type)
    {
        return(
$this->_baseConvertResult($value$type));
    }

    
// }}}
    // {{{ convertResultRow()

    /**
     * convert a result row
     *
     * @param resource $result result identifier
     * @param array $row array with data
     * @return mixed MDB_OK on success,  a MDB error on failure
     * @access public
     */
    
function convertResultRow($result$row)
    {
        
$result_value intval($result);
        if (isset(
$this->result_types[$result_value])) {
            
$current_column = -1;
            foreach(
$row as $key => $column) {
                ++
$current_column;
                if (!isset(
$this->result_types[$result_value][$current_column])
                   ||!isset(
$column)
                ) {
                    continue;
                }
                switch (
$type $this->result_types[$result_value][$current_column]) {
                    case 
MDB_TYPE_TEXT:
                    case 
MDB_TYPE_BLOB:
                    case 
MDB_TYPE_CLOB:
                        break;
                    case 
MDB_TYPE_INTEGER:
                        
$row[$key] = intval($row[$key]);
                        break;
                    default:
                        
$value $this->convertResult($row[$key], $type);
                        if (
MDB::isError($value)) {
                            return 
$value;
                        }
                        
$row[$key] = $value;
                        break;
                }
            }
        }
        return (
$row);
    }

    
// }}}
    // {{{ fetchDate()

    /**
     * fetch a date value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure
     * @access public
     */
    
function fetchDate($result$row$field)
    {
        
$value $this->fetch($result$row$field);
        return(
$this->convertResult($valueMDB_TYPE_DATE));
    }

    
// }}}
    // {{{ fetchTimestamp()

    /**
     * fetch a timestamp value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure
     * @access public
     */
    
function fetchTimestamp($result$row$field)
    {
        
$value $this->fetch($result$row$field);
        return(
$this->convertResult($valueMDB_TYPE_TIMESTAMP));
    }

    
// }}}
    // {{{ fetchTime()

    /**
     * fetch a time value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure
     * @access public
     */
    
function fetchTime($result$row$field)
    {
        
$value $this->fetch($result$row$field);
        return(
$this->convertResult($valueMDB_TYPE_TIME));
    }

    
// }}}
    // {{{ fetchBoolean()

    /**
     * fetch a boolean value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure
     * @access public
     */
    
function fetchBoolean($result$row$field)
    {
        
$value $this->fetch($result$row$field);
        return(
$this->convertResult($valueMDB_TYPE_BOOLEAN));
    }

    
// }}}
    // {{{ fetchFloat()

    /**
     * fetch a float value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure
     * @access public
     */
    
function fetchFloat($result$row$field)
    {
        
$value $this->fetch($result$row$field);
        return(
$this->convertResult($valueMDB_TYPE_FLOAT));
    }

    
// }}}
    // {{{ fetchDecimal()

    /**
     * fetch a decimal value from a result set
     *
     * @param resource $result result identifier
     * @param int $row number of the row where the data can be found
     * @param int $field field number where the data can be found
     * @return mixed content of the specified data cell, a MDB error on failure
     * @access public
     */
    
function fetchDecimal($result$row$field)
    {
        
$value $this->fetch($result$row$field);
        return(
$this->convertResult($valueMDB_TYPE_DECIMAL));
    }

    
// }}}
    // {{{ numRows()

    /**
     * returns the number of rows in a result object
     *
     * @param ressource $result a valid result ressouce pointer
     * @return mixed MDB_Error or the number of rows
     * @access public
     */
    
function numRows($result)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL'Num Rows: number of rows method not implemented'));
    }

    
// }}}
    // {{{ freeResult()

    /**
     * Free the internal resources associated with $result.
     *
     * @param  $result result identifier
     * @return boolean TRUE on success, FALSE if $result is invalid
     * @access public
     */
    
function freeResult($result)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL'Free Result: free result method not implemented'));
    }

    
// }}}
    // {{{ getIntegerDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare an integer type
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       unsigned
     *           Boolean flag that indicates whether the field should be
     *           declared as unsigned integer if possible.
     *
     *       default
     *           Integer value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getIntegerDeclaration($name$field)
    {
        if (isset(
$field['unsigned'])) {
            
$this->warnings[] = "unsigned integer field \"$name\" is being
                declared as signed integer"
;
        }
        return(
"$name INT" . (isset($field['default']) ? ' DEFAULT ' $field['default'] : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getTextDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare an text type
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       length
     *           Integer value that determines the maximum length of the text
     *           field. If this argument is missing the field should be
     *           declared to have the longest length allowed by the DBMS.
     *
     *       default
     *           Text value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getTextDeclaration($name$field)
    {
        return((isset(
$field['length']) ? "$name CHAR (" $field['length'] . ')' "$name TEXT") . (isset($field['default']) ? ' DEFAULT ' $this->getTextValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getClobDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare an character
     * large object type field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       length
     *           Integer value that determines the maximum length of the large
     *           object field. If this argument is missing the field should be
     *           declared to have the longest length allowed by the DBMS.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getClobDeclaration($name$field)
    {
        return((isset(
$field['length']) ? "$name CHAR (" $field['length'] . ')' "$name TEXT") . (isset($field['default']) ? ' DEFAULT ' $this->getTextValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getBlobDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare an binary large
     * object type field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       length
     *           Integer value that determines the maximum length of the large
     *           object field. If this argument is missing the field should be
     *           declared to have the longest length allowed by the DBMS.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getBlobDeclaration($name$field)
    {
        return((isset(
$field['length']) ? "$name CHAR (" $field['length'] . ')' "$name TEXT") . (isset($field['default']) ? ' DEFAULT ' $this->getTextValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getBooleanDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare a boolean type
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Boolean value to be used as default for this field.
     *
     *       notnullL
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getBooleanDeclaration($name$field)
    {
        return(
"$name CHAR (1)" . (isset($field['default']) ? ' DEFAULT ' $this->getBooleanValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getDateDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare a date type
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Date value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getDateDeclaration($name$field)
    {
        return(
"$name CHAR (" strlen("YYYY-MM-DD") . ")" . (isset($field['default']) ? ' DEFAULT ' $this->getDateValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getTimestampDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare a timestamp
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Timestamp value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getTimestampDeclaration($name$field)
    {
        return(
"$name CHAR (" strlen("YYYY-MM-DD HH:MM:SS") . ")" . (isset($field['default']) ? ' DEFAULT ' $this->getTimestampValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getTimeDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare a time
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Time value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getTimeDeclaration($name$field)
    {
        return(
"$name CHAR (" strlen("HH:MM:SS") . ")" . (isset($field['default']) ? ' DEFAULT ' $this->getTimeValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getFloatDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare a float type
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Float value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getFloatDeclaration($name$field)
    {
        return(
"$name TEXT " . (isset($field['default']) ? ' DEFAULT ' $this->getFloatValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getDecimalDeclaration()

    /**
     * Obtain DBMS specific SQL code portion needed to declare a decimal type
     * field to be used in statements like CREATE TABLE.
     *
     * @param string $name name the field to be declared.
     * @param string $field associative array with the name of the properties
     *       of the field being declared as array indexes. Currently, the types
     *       of supported field properties are as follows:
     *
     *       default
     *           Decimal value to be used as default for this field.
     *
     *       notnull
     *           Boolean flag that indicates whether this field is constrained
     *           to not be set to NULL.
     * @return string DBMS specific SQL code portion that should be used to
     *       declare the specified field.
     * @access public
     */
    
function getDecimalDeclaration($name$field)
    {
        return(
"$name TEXT " . (isset($field['default']) ? ' DEFAULT ' $this->getDecimalValue($field['default']) : '') . (isset($field['notnull']) ? ' NOT NULL' ''));
    }

    
// }}}
    // {{{ getIntegerValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getIntegerValue($value)
    {
        return((
$value === NULL) ? 'NULL' : (int)$value);
    }

    
// }}}
    // {{{ getTextValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that already contains any DBMS specific
     *       escaped character sequences.
     * @access public
     */
    
function getTextValue($value)
    {
        return((
$value === NULL) ? 'NULL' "'".$this->_quote($value)."'");
    }

    
// }}}
    // {{{ getClobValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param resource $prepared_query query handle from prepare()
     * @param  $parameter
     * @param  $clob
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getClobValue($prepared_query$parameter$clob)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Get CLOB field value: prepared queries with values of type "clob" are not yet supported'));
    }

    
// }}}
    // {{{ freeClobValue()

    /**
     * free a character large object
     *
     * @param resource $prepared_query query handle from prepare()
     * @param string $blob
     * @param string $value
     * @access public
     */
    
function freeClobValue($prepared_query$clob, &$value)
    {
    }

    
// }}}
    // {{{ getBlobValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param resource $prepared_query query handle from prepare()
     * @param  $parameter
     * @param  $blob
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getBlobValue($prepared_query$parameter$blob)
    {
        return(
$this->raiseError(MDB_ERROR_UNSUPPORTEDNULLNULL,
            
'Get BLOB field value: prepared queries with values of type "blob" are not yet supported'));
    }

    
// }}}
    // {{{ freeBlobValue()

    /**
     * free a binary large object
     *
     * @param resource $prepared_query query handle from prepare()
     * @param string $blob
     * @param string $value
     * @access public
     */
    
function freeBlobValue($prepared_query$blob, &$value)
    {
    }

    
// }}}
    // {{{ getBooleanValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getBooleanValue($value)
    {
        return((
$value === NULL) ? 'NULL' : ($value "'Y'" "'N'"));
    }

    
// }}}
    // {{{ getDateValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getDateValue($value)
    {
        return((
$value === NULL) ? 'NULL' "'$value'");
    }

    
// }}}
    // {{{ getTimestampValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getTimestampValue($value)
    {
        return((
$value === NULL) ? 'NULL' "'$value'");
    }

    
// }}}
    // {{{ getTimeValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     *       compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getTimeValue($value)
    {
        return((
$value === NULL) ? 'NULL' "'$value'");
    }

    
// }}}
    // {{{ getFloatValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getFloatValue($value)
    {
        return((
$value === NULL) ? 'NULL' "'$value'");
    }

    
// }}}
    // {{{ getDecimalValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getDecimalValue($value)
    {
        return((
$value === NULL) ? 'NULL' "'$value'");
    }

    
// }}}
    // {{{ getValue()

    /**
     * Convert a text value into a DBMS specific format that is suitable to
     * compose query statements.
     *
     * @param string $type type to which the value should be converted to
     * @param string $value text string value that is intended to be converted.
     * @return string text string that represents the given argument value in
     *       a DBMS specific format.
     * @access public
     */
    
function getValue($type$value)
    {
        if (empty(
$type)) {
            return(
$this->raiseError(MDB_ERROR_SYNTAXNULLNULL,
                
'getValue: called without type to convert to'));
        }
        if (
method_exists($this,"get{$type}Value")) {
            return 
$this->{"get{$type}Value"}($value);
        }
        return 
$value;
    }

    
// }}}
    // {{{ support()

    /**
     * Tell whether a DB implementation or its backend extension
     * supports a given feature.
     *
     * @param string $feature name of the feature (see the MDB class doc)
     * @return boolean whether this DB implementation supports $feature
     * @access public
     */
    
function support($feature)
    {
        return(isset(
$this->supported[$feature]) && $this->supported[$feature]);
    }

    
// }}}
    // {{{ getSequenceName()

    /**
     * adds sequence name formating to a sequence name
     *
     * @param string $sqn name of the sequence
     * @return string formatted sequence name
     * @access public
     */
    
function getSequenceName($sqn)
    {
        return 
sprintf($this->options['seqname_format'],
            
preg_replace('/[^a-z0-9_]/i''_'$sqn));
    }

    
// }}}
    // {{{ nextId()

    /**
     * returns the next free id of a sequence
     *
     * @param string $seq_name name of the sequence
     * @param boolean $ondemand when TRUE the seqence is
     *                           automatic created, if it
     *                           not exists
     * @return mixed MDB_Error or id
     * @access public
     */
    
function nextId($seq_name$ondemand FALSE)
    {
        return(
$this->raiseError(MDB_ERROR_NOT_CAPABLENULLNULL,
            
'Next Sequence: getting next sequence value not supported'));
    }

    
// }}}
    // {{{ currId()

    /**
     * returns the current id of a sequence
     *
     * @param string $seq_name name of the sequence
     * @return mixed MDB_Error or id
     * @access public
     */
    
function currId($seq_name)
    {
        
$this->warnings[] = 'database does not support getting current
            sequence value, the sequence value was incremented'
;
        
$this->expectError(MDB_ERROR_NOT_CAPABLE);
        
$id $this->nextId($seq_name);
        
$this->popExpect(MDB_ERROR_NOT_CAPABLE);
        if (
MDB::isError($id)) {
            if (
$id->getCode() == MDB_ERROR_NOT_CAPABLE) {
                return(
$this->raiseError(MDB_ERROR_NOT_CAPABLENULLNULL,
                    
'Current Sequence: getting current sequence value not supported'));
            }
            return(
$id);
        }
        return(
$id);
    }

    
// }}}
    // {{{ fetchInto()

    /**
     * Fetch a row and return data in an array.
     *
     * @param resource $result result identifier
     * @param int $fetchmode ignored
     * @param int $rownum the row number to fetch
     * @return mixed data array or NULL on success, a MDB error on failure
     * @access public
     */
    
function fetchInto($result$fetchmode MDB_FETCHMODE_DEFAULT$rownum NULL)
    {
        
$result_value intval($result);
        if (
MDB::isError($this->endOfResult($result))) {
            
$this->freeResult($result);
            
$result $this->raiseError(MDB_ERROR_NEED_MORE_DATANULLNULL,
                
'Fetch field: result set is empty');
        }
        if (
$rownum == NULL) {
            ++
$this->highest_fetched_row[$result_value];
            
$rownum $this->highest_fetched_row[$result_value];
        } else {
            
$this->highest_fetched_row[$result_value] =
                
max($this->highest_fetched_row[$result_value], $row);
        }
        if (
$fetchmode == MDB_FETCHMODE_DEFAULT) {
            
$fetchmode $this->fetchmode;
        }
        
$columns $this->numCols($result);
        if (
MDB::isError($columns)) {
            return(
$columns);
        }
        if (
$fetchmode MDB_FETCHMODE_ASSOC) {
            
$column_names $this->getColumnNames($result);
        }
        for(
$column 0$column $columns$column++) {
            if (!
$this->resultIsNull($result$rownum$column)) {
                
$value $this->fetch($result$rownum$column);
                if (
$value === FALSE) {
                    if (
$this->options['autofree']) {
                        
$this->freeResult($result);
                    }
                    return(
NULL);
                } elseif (
MDB::isError($value)) {
                    if (
$value->getMessage() == '') {
                        if (
$this->options['autofree']) {
                            
$this->freeResult($result);
                        }
                        return(
NULL);
                    } else {
                        return(
$value);
                    }
                }
            }
            
$row[$column] = $value;
        }
        if (
$fetchmode MDB_FETCHMODE_ASSOC) {
            
$row array_combine($column_names$row);
            if (
is_array($row) && $this->options['optimize'] == 'portability') {
                
$row array_change_key_case($rowCASE_LOWER);
            }
        }
        if (isset(
$this->result_types[$result_value])) {
            
$row $this->convertResultRow($result$row);
        }
        return(
$row);
    }

    
// }}}
    // {{{ fetchOne()

    /**
     * Fetch and return a field of data (it uses fetchInto for that)
     *
     * @param resource $result result identifier
     * @return mixed data on success, a MDB error on failure
     * @access public
     */
    
function fetchOne($result)
    {
        
$row $this->fetchInto($resultMDB_FETCHMODE_ORDERED);
        if (!
$this->options['autofree'] || $row != NULL) {
            
$this->freeResult($result);
        }
        if (
is_array($row)) {
            return(
$row[0]);
        }
        return(
$row);
    }

    
// }}}
    // {{{ fetchRow()

    /**
     * Fetch and return a row of data (it uses fetchInto for that)
     *
     * @param resource $result result identifier
     * @param int $fetchmode how the array data should be indexed
     * @param int $rownum the row number to fetch
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function fetchRow($result$fetchmode MDB_FETCHMODE_DEFAULT$rownum NULL)
    {
        
$row $this->fetchInto($result$fetchmode$rownum);
        if (!
$this->options['autofree'] || $row != NULL) {
            
$this->freeResult($result);
        }
        return(
$row);
    }

    
// }}}
    // {{{ fetchCol()

    /**
     * Fetch and return a column of data (it uses fetchInto for that)
     *
     * @param resource $result result identifier
     * @param int $colnum the row number to fetch
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function fetchCol($result$colnum 0)
    {
        
$fetchmode is_numeric($colnum) ? MDB_FETCHMODE_ORDERED MDB_FETCHMODE_ASSOC;
        
$column = array();
        
$row $this->fetchInto($result$fetchmode);
        if (
is_array($row)) {
            if (!
array_key_exists($colnum$row)) {
                return(
$this->raiseError(MDB_ERROR_TRUNCATED));
            }
            do {
                
$column[] = $row[$colnum];
            } while (
is_array($row $this->fetchInto($result$fetchmode)));
        }
        if (!
$this->options['autofree']) {
            
$this->freeResult($result);
        }
        if (
MDB::isError($row)) {
            return(
$row);
        }
        return(
$column);
    }

    
// }}}
    // {{{ fetchAll()

    /**
     * Fetch and return a column of data (it uses fetchInto for that)
     *
     * @param resource $result result identifier
     * @param int $fetchmode how the array data should be indexed
     * @param boolean $rekey if set to TRUE, the $all will have the first
     *       column as its first dimension
     * @param boolean $force_array used only when the query returns exactly
     *       two columns. If TRUE, the values of the returned array will be
     *       one-element arrays instead of scalars.
     * @param boolean $group if TRUE, the values of the returned array is
     *       wrapped in another array.  If the same key value (in the first
     *       column) repeats itself, the values will be appended to this array
     *       instead of overwriting the existing values.
     * @return mixed data array on success, a MDB error on failure
     * @access public
     * @see getAssoc()
     */
    
function fetchAll($result$fetchmode MDB_FETCHMODE_DEFAULT$rekey FALSE$force_array FALSE$group FALSE)
    {
        if (
$rekey) {
            
$cols $this->numCols($result);
            if (
MDB::isError($cols)) {
                return(
$cols);
            }
            if (
$cols 2) {
                return(
$this->raiseError(MDB_ERROR_TRUNCATED));
            }
        }
        
$all = array();
        while (
is_array($row $this->fetchInto($result$fetchmode))) {
            if (
$rekey) {
                if (
$fetchmode MDB_FETCHMODE_ASSOC) {
                    
$key reset($row);
                    unset(
$row[key($row)]);
                } else {
                    
$key array_shift($row);
                }
                if (!
$force_array && count($row) == 1) {
                    
$row array_shift($row);
                }
                if (
$group) {
                    
$all[$key][] = $row;
                } else {
                    
$all[$key] = $row;
                }
            } else {
                if (
$fetchmode MDB_FETCHMODE_FLIPPED) {
                    foreach (
$row as $key => $val) {
                        
$all[$key][] = $val;
                    }
                } else {
                   
$all[] = $row;
                }
            }
        }
        if (!
$this->options['autofree']) {
            
$this->freeResult($result);
        }
        if (
MDB::isError($row)) {
            return(
$row);
        }
        return(
$all);
    }

    
// }}}
    // {{{ queryOne()

    /**
     * Execute the specified query, fetch the value from the first column of
     * the first row of the result set and then frees
     * the result set.
     *
     * @param string $query the SELECT query statement to be executed.
     * @param string $type optional argument that specifies the expected
     *       datatype of the result set field, so that an eventual conversion
     *       may be performed. The default datatype is text, meaning that no
     *       conversion is performed
     * @return mixed field value on success, a MDB error on failure
     * @access public
     */
    
function queryOne($query$type NULL)
    {
        if (
$type != NULL) {
            
$type = array($type);
        }
        
$result $this->query($query$type);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->fetchOne($result));
    }

    
// }}}
    // {{{ queryRow()

    /**
     * Execute the specified query, fetch the values from the first
     * row of the result set into an array and then frees
     * the result set.
     *
     * @param string $query the SELECT query statement to be executed.
     * @param array $types optional array argument that specifies a list of
     *       expected datatypes of the result set columns, so that the eventual
     *       conversions may be performed. The default list of datatypes is
     *       empty, meaning that no conversion is performed.
     * @param int $fetchmode how the array data should be indexed
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function queryRow($query$types NULL$fetchmode MDB_FETCHMODE_DEFAULT)
    {
        
$result $this->query($query$types);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->fetchRow($result$fetchmode));
    }

    
// }}}
    // {{{ queryCol()

    /**
     * Execute the specified query, fetch the value from the first column of
     * each row of the result set into an array and then frees the result set.
     *
     * @param string $query the SELECT query statement to be executed.
     * @param string $type optional argument that specifies the expected
     *       datatype of the result set field, so that an eventual conversion
     *       may be performed. The default datatype is text, meaning that no
     *       conversion is performed
     * @param int $colnum the row number to fetch
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function queryCol($query$type NULL$colnum 0)
    {
        if (
$type != NULL) {
            
$type = array($type);
        }
        
$result $this->query($query$type);
        if (
MDB::isError($result)) {
            return(
$result);
        }
        return(
$this->fetchCol($result$colnum));
    }

    
// }}}
    // {{{ queryAll()

    /**
     * Execute the specified query, fetch all the rows of the result set into
     * a two dimensional array and then frees the result set.
     *
     * @param string $query the SELECT query statement to be executed.
     * @param array $types optional array argument that specifies a list of
     *       expected datatypes of the result set columns, so that the eventual
     *       conversions may be performed. The default list of datatypes is
     *       empty, meaning that no conversion is performed.
     * @param int $fetchmode how the array data should be indexed
     * @param boolean $rekey if set to TRUE, the $all will have the first
     *       column as its first dimension
     * @param boolean $force_array used only when the query returns exactly
     *       two columns. If TRUE, the values of the returned array will be
     *       one-element arrays instead of scalars.
     * @param boolean $group if TRUE, the values of the returned array is
     *       wrapped in another array.  If the same key value (in the first
     *       column) repeats itself, the values will be appended to this array
     *       instead of overwriting the existing values.
     * @return mixed data array on success, a MDB error on failure
     * @access public
     */
    
function queryAll($query$types NULL$fetchmode MDB_FETCHMODE_DEFAULT,
        
$rekey FALSE$force_array FALSE$group FALSE)
    {
        if (
MDB::isError($result $this->query($query$types))) {
            return(
$result);
        }
        return(
$this->fetchAll($result$fetchmode$rekey$force_array$group));
    }

    
// }}}
    // {{{ getOne()

    /**
     * Fetch the first column of the first row of data returned from
     * a query.  Takes care of doing the query and freeing the results
     * when finished.
     *
     * @param string $query the SQL query
     * @param string $type string that contains the type of the column in the
     *       result set
     * @param array $params if supplied, prepare/execute will be used
     *       with this array as execute parameters
     * @param array $param_types array that contains the types of the values
     *       defined in $params
     * @return mixed MDB_Error or the returned value of the query
     * @access public
     */
    
function getOne($query$type NULL$params = array(), $param_types NULL)
    {
        if (
$type != NULL) {
            
$type = array($type);
        }
        
settype($params'array');
        if (
count($params) > 0) {
            
$prepared_query $this->prepareQuery($query);
            if (
MDB::isError($prepared_query)) {
                return(
$prepared_query);
            }
            
$this->setParamArray($prepared_query$params$param_types);
            
$result $this->executeQuery($prepared_query$type);
        } else {
            
$result $this->query($query$type);
        }

        if (
MDB::isError($result)) {
            return(
$result);
        }

        
$value $this->fetchOne($resultMDB_FETCHMODE_ORDERED);
        if (
MDB::isError($value)) {
            return(
$value);
        }
        if (isset(
$prepared_query)) {
            
$result $this->freePreparedQuery($prepared_query);
            if (
MDB::isError($result)) {
                return(
$result);
            }
        }

        return(
$value);
    }

    
// }}}
    // {{{ getRow()

    /**
     * Fetch the first row of data returned from a query.  Takes care
     * of doing the query and freeing the results when finished.
     *
     * @param string $query the SQL query
     * @param array $types array that contains the types of the columns in
     *       the result set
     * @param array $params array if supplied, prepare/execute will be used
     *       with this array as execute parameters
     * @param array $param_types array that contains the types of the values
     *       defined in $params
     * @param integer $fetchmode the fetch mode to use
     * @return array the first row of results as an array indexed from
     * 0, or a MDB error code.
     * @access public
     */
    
function getRow($query$types NULL$params = array(), $param_types NULL$fetchmode MDB_FETCHMODE_DEFAULT)
    {
        
settype($params'array');
        if (
count($params) > 0) {
            
$prepared_query $this->prepareQuery($query);
            if (
MDB::isError($prepared_query)) {
                return(
$prepared_query);
            }
            
$this->setParamArray($prepared_query$params$param_types);
            
$result $this->executeQuery($prepared_query$types);
        } else {
            
$result $this->query($query$types);
        }

        if (
MDB::isError($result)) {
            return(
$result);
        }

        
$row $this->fetchRow($result$fetchmode);
        if (
MDB::isError($row)) {
            return(
$row);
        }
        if (isset(
$prepared_query)) {
            
$result $this->freePreparedQuery($prepared_query);
            if (
MDB::isError($result)) {
                return(
$result);
            }
        }

        return(
$row);
    }

    
// }}}
    // {{{ getCol()

    /**
     * Fetch a single column from a result set and return it as an
     * indexed array.
     *
     * @param string $query the SQL query
     * @param string $type string that contains the type of the column in the
     *       result set
     * @param array $params array if supplied, prepare/execute will be used
     *       with this array as execute parameters
     * @param array $param_types array that contains the types of the values
     *       defined in $params
     * @param mixed $colnum which column to return(integer [column number,
     *       starting at 0] or string [column name])
     * @return array an indexed array with the data from the first
     * row at index 0, or a MDB error code.
     * @access public
     */
    
function getCol($query$type NULL$params = array(), $param_types NULL$colnum 0)
    {
        if (
$type != NULL) {
            
$type = array($type);
        }
        
settype($params'array');
        if (
count($params) > 0) {
            
$prepared_query $this->prepareQuery($query);

            if (
MDB::isError($prepared_query)) {
                return(
$prepared_query);
            }
            
$this->setParamArray($prepared_query$params$param_types);
            
$result $this->executeQuery($prepared_query$type);
        } else {
            
$result $this->query($query$type);
        }

        if (
MDB::isError($result)) {
            return(
$result);
        }

        
$col $this->fetchCol($result$colnum);
        if (
MDB::isError($col)) {
            return(
$col);
        }
        if (isset(
$prepared_query)) {
            
$result $this->freePreparedQuery($prepared_query);
            if (
MDB::isError($result)) {
                return(
$result);
            }
        }
        return(
$col);
    }

    
// }}}
    // {{{ getAssoc()

    /**
     * Fetch the entire result set of a query and return it as an
     * associative array using the first column as the key.
     *
     * If the result set contains more than two columns, the value
     * will be an array of the values from column 2-n.  If the result
     * set contains only two columns, the returned value will be a
     * scalar with the value of the second column (unless forced to an
     * array with the $force_array parameter).  A MDB error code is
     * returned on errors.  If the result set contains fewer than two
     * columns, a MDB_ERROR_TRUNCATED error is returned.
     *
     * For example, if the table 'mytable' contains:
     *
     *   ID      TEXT       DATE
     * --------------------------------
     *   1       'one'      944679408
     *   2       'two'      944679408
     *   3       'three'    944679408
     *
     * Then the call getAssoc('SELECT id,text FROM mytable') returns:
     *    array(
     *      '1' => 'one',
     *      '2' => 'two',
     *      '3' => 'three',
     *    )
     *
     * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns:
     *    array(
     *      '1' => array('one', '944679408'),
     *      '2' => array('two', '944679408'),
     *      '3' => array('three', '944679408')
     *    )
     *
     * If the more than one row occurs with the same value in the
     * first column, the last row overwrites all previous ones by
     * default.  Use the $group parameter if you don't want to
     * overwrite like this.  Example:
     *
     * getAssoc('SELECT category,id,name FROM mytable', NULL, NULL
     *           MDB_FETCHMODE_ASSOC, FALSE, TRUE) returns:
     *    array(
     *      '1' => array(array('id' => '4', 'name' => 'number four'),
     *                   array('id' => '6', 'name' => 'number six')
     *             ),
     *      '9' => array(array('id' => '4', 'name' => 'number four'),
     *                   array('id' => '6', 'name' => 'number six')
     *             )
     *    )
     *
     * Keep in mind that database functions in PHP usually return string
     * values for results regardless of the database's internal type.
     *
     * @param string $query the SQL query
     * @param array $types array that contains the types of the columns in
     *       the result set
     * @param array $params array if supplied, prepare/execute will be used
     *       with this array as execute parameters
     * @param array $param_types array that contains the types of the values
     *       defined in $params
     * @param boolean $force_array used only when the query returns
     * exactly two columns.  If TRUE, the values of the returned array
     * will be one-element arrays instead of scalars.
     * @param boolean $group if TRUE, the values of the returned array
     *       is wrapped in another array.  If the same key value (in the first
     *       column) repeats itself, the values will be appended to this array
     *       instead of overwriting the existing values.
     * @return array associative array with results from the query.
     * @access public
     */
    
function getAssoc($query$types NULL$params = array(), $param_types NULL,
        
$fetchmode MDB_FETCHMODE_ORDERED$force_array FALSE$group FALSE)
    {
        
settype($params'array');
        if (
count($params) > 0) {
            
$prepared_query $this->prepareQuery($query);

            if (
MDB::isError($prepared_query)) {
                return(
$prepared_query);
            }
            
$this->setParamArray($prepared_query$params$param_types);
            
$result $this->executeQuery($prepared_query$types);
        } else {
            
$result $this->query($query$types);
        }

        if (
MDB::isError($result)) {
            return(
$result);
        }

        
$all $this->fetchAll($result$fetchmodeTRUE$force_array$group);
        if (
MDB::isError($all)) {
            return(
$all);
        }
        if (isset(
$prepared_query)) {
            
$result $this->freePreparedQuery($prepared_query);
            if (
MDB::isError($result)) {
                return(
$result);
            }
        }
        return(
$all);
    }

    
// }}}
    // {{{ getAll()

    /**
     * Fetch all the rows returned from a query.
     *
     * @param string $query the SQL query
     * @param array $types array that contains the types of the columns in
     *       the result set
     * @param array $params array if supplied, prepare/execute will be used
     *       with this array as execute parameters
     * @param array $param_types array that contains the types of the values
     *       defined in $params
     * @param integer $fetchmode the fetch mode to use
     * @return array an nested array, or a MDB error
     * @access public
     */
    
function getAll($query$types NULL$params = array(), $param_types NULL$fetchmode MDB_FETCHMODE_DEFAULT)
    {
        
settype($params'array');
        if (
count($params) > 0) {
            
$prepared_query $this->prepareQuery($query);

            if (
MDB::isError($prepared_query)) {
                return(
$prepared_query);
            }
            
$this->setParamArray($prepared_query$params$param_types);
            
$result $this->executeQuery($prepared_query$types);
        } else {
            
$result $this->query($query$types);
        }

        if (
MDB::isError($result)) {
            return(
$result);
        }

        
$all $this->fetchAll($result$fetchmode);
        if (
MDB::isError($all)) {
            return(
$all);
        }
        if (isset(
$prepared_query)) {
            
$result $this->freePreparedQuery($prepared_query);
            if (
MDB::isError($result)) {
                return(
$result);
            }
        }
        return(
$all);
    }

    
// }}}
    // {{{ tableInfo()

    /**
     * returns meta data about the result set
     *
     * @param resource $result result identifier
     * @param mixed $mode depends on implementation
     * @return array an nested array, or a MDB error
     * @access public
     */
    
function tableInfo($result$mode NULL)
    {
        return(
$this->raiseError(MDB_ERROR_NOT_CAPABLE));
    }

    
// }}}
    // {{{ createLob()

    /**
     * Create a handler object of a specified class with functions to
     * retrieve data from a large object data stream.
     *
     * @param array $arguments An associative array with parameters to create
     *                  the handler object. The array indexes are the names of
     *                  the parameters and the array values are the respective
     *                  parameter values.
     *
     *                  Some parameters are specific of the class of each type
     *                  of handler object that is created. The following
     *                  parameters are common to all handler object classes:
     *
     *                  Type
     *
     *                      Name of the type of the built-in supported class
     *                      that will be used to create the handler object.
     *                      There are currently four built-in types of handler
     *                      object classes: data, resultlob, inputfile and
     *                      outputfile.
     *
     *                      The data handler class is the default class. It
     *                      simply reads data from a given data string.
     *
     *                      The resultlob handler class is meant to read data
     *                      from a large object retrieved from a query result.
     *                      This class is not used directly by applications.
     *
     *                      The inputfile handler class is meant to read data
     *                      from a file to use in prepared queries with large
     *                      object field parameters.
     *
     *                      The outputfile handler class is meant to write to
     *                      a file data from result columns with large object
     *                      fields. The functions to read from this type of
     *                      large object do not return any data. Instead, the
     *                      data is just written to the output file with the
     *                      data retrieved from a specified large object handle.
     *
     *                  Class
     *
     *                      Name of the class of the handler object that will be
     *                      created if the Type argument is not specified. This
     *                      argument should be used when you need to specify a
     *                      custom handler class.
     *
     *                  Database
     *
     *                      Database object as returned by MDB::connect.
     *                      This is an option argument needed by some handler
     *                      classes like resultlob.
     *
     *                  The following arguments are specific of the inputfile
     *                  handler class:
     *
     *                      File
     *
     *                          Integer handle value of a file already opened
     *                          for writing.
     *
     *                      FileName
     *
     *                          Name of a file to be opened for writing if the
     *                          File argument is not specified.
     *
     *                  The following arguments are specific of the outputfile
     *                  handler class:
     *
     *                      File
     *
     *                          Integer handle value of a file already opened
     *                          for writing.
     *
     *                      FileName
     *
     *                          Name of a file to be opened for writing if the
     *                          File argument is not specified.
     *
     *                      BufferLength
     *
     *                          Integer value that specifies the length of a
     *                          buffer that will be used to read from the
     *                          specified large object.
     *
     *                      LOB
     *
     *                          Integer handle value that specifies a large
     *                          object from which the data to be stored in the
     *                          output file will be written.
     *
     *                      Result
     *
     *                          Integer handle value as returned by the function
     *                          MDB::query() or MDB::executeQuery() that specifies
     *                          the result set that contains the large object value
     *                          to be retrieved. If the LOB argument is specified,
     *                          this argument is ignored.
     *
     *                      Row
     *
     *                          Integer value that specifies the number of the
     *                          row of the result set that contains the large
     *                          object value to be retrieved. If the LOB
     *                          argument is specified, this argument is ignored.
     *
     *                      Field
     *
     *                          Integer or string value that specifies the
     *                          number or the name of the column of the result
     *                          set that contains the large object value to be
     *                          retrieved. If the LOB argument is specified,
     *                          this argument is ignored.
     *
     *                      Binary
     *
     *                          Boolean value that specifies whether the large
     *                          object column to be retrieved is of binary type
     *                          (blob) or otherwise is of character type (clob).
     *                          If the LOB argument is specified, this argument
     *                          is ignored.
     *
     *                  The following argument is specific of the data
     *                  handler class:
     *
     *                  Data
     *
     *                      String of data that will be returned by the class
     *                      when it requested with the readLOB() method.
     *
     *                  The following argument is specific of the resultlob
     *                  handler class:
     *
     *                      ResultLOB
     *
     *                          Integer handle value of a large object result
     *                          row field.
     * @return integer handle value that should be passed as argument insubsequent
     * calls to functions that retrieve data from the large object input stream.
     * @access public
     */
    
function createLob($arguments)
    {
        
$result $this->loadLob('Create LOB');
        if (
MDB::isError($result)) {
            return(
$result);
        }
        
$class_name 'MDB_LOB';
        if (isset(
$arguments['Type'])) {
            switch (
$arguments['Type']) {
                case 
'data':
                    break;
                case 
'resultlob':
                    
$class_name 'MDB_LOB_Result';
                    break;
                case 
'inputfile':
                    
$class_name 'MDB_LOB_Input_File';
                    break;
                case 
'outputfile':
                    
$class_name 'MDB_LOB_Output_File';
                    break;
                default:
                    if (isset(
$arguments['Error'])) {
                        
$arguments['Error'] = $arguments['Type'] . ' is not a valid type of large object';
                    }
                    return(
$this->raiseError());
            }
        } else {
            if (isset(
$arguments['Class'])) {
                
$class $arguments['Class'];
            }
        }
        
$lob count($GLOBALS['_MDB_lobs']) + 1;
        
$GLOBALS['_MDB_lobs'][$lob] = &new $class_name;
        if (isset(
$arguments['Database'])) {
            
$GLOBALS['_MDB_lobs'][$lob]->database $arguments['Database'];
        } else {
            
$GLOBALS['_MDB_lobs'][$lob]->database = &$this;
        }
        if (
MDB::isError($result $GLOBALS['_MDB_lobs'][$lob]->create($arguments))) {
            
$GLOBALS['_MDB_lobs'][$lob]->database->destroyLob($lob);
            return(
$result);
        }
        return(
$lob);
    }

    
// }}}
    // {{{ readLob()

    /**
     * Read data from large object input stream.
     *
     * @param integer $lob argument handle that is returned by the
     *                          MDB::createLob() method.
     * @param string $data reference to a variable that will hold data
     *                          to be read from the large object input stream
     * @param integer $length    value that indicates the largest ammount ofdata
     *                          to be read from the large object input stream.
     * @return mixed the effective number of bytes read from the large object
     *                      input stream on sucess or an MDB error object.
     * @access public
     * @see endOfLob()
     */
    
function readLob($lob, &$data$length)
    {
        return(
$GLOBALS['_MDB_lobs'][$lob]->readLob($data$length));
    }

    
// }}}
    // {{{ endOfLob()

    /**
     * Determine whether it was reached the end of the large object and
     * therefore there is no more data to be read for the its input stream.
     *
     * @param integer $lob argument handle that is returned by the
     *                          MDB::createLob() method.
     * @access public
     * @return boolean flag that indicates whether it was reached the end of the large object input stream
     */
    
function endOfLob($lob)
    {
        return(
$GLOBALS['_MDB_lobs'][$lob]->endOfLob());
    }

    
// }}}
    // {{{ destroyLob()

    /**
     * Free any resources allocated during the lifetime of the large object
     * handler object.
     *
     * @param integer $lob argument handle that is returned by the
     *                          MDB::createLob() method.
     * @access public
     */
    
function destroyLob($lob)
    {
        
$GLOBALS['_MDB_lobs'][$lob]->destroy();
        unset(
$GLOBALS['_MDB_lobs'][$lob]);
    }

    
// }}}
    // {{{ Destructor

    /**
    * this function closes open transactions to be executed at shutdown
    *
    * @access private
    */
    
function _MDB_Common()
    {
        if (
$this->in_transaction && !MDB::isError($this->rollback())) {
            
$this->autoCommit(TRUE);
        }
    }
};
?>

:: Command execute ::

Enter:
 
Select:
 

:: Search ::
  - regexp 

:: Upload ::
 
[ ok ]

:: Make Dir ::
 
[ ok ]
:: Make File ::
 
[ ok ]

:: Go Dir ::
 
:: Go File ::
 

--[ c99shell v. 1.0 pre-release build #13 powered by Captain Crunch Security Team | http://ccteam.ru | Generation time: 0.0624 ]--