jon             Fri Mar 23 11:26:55 2001 EDT

  Added files:                 
    /php4/pear/DB       ifx.php 

  Modified files:              
    /php4/pear/DB       MAINTAINERS 
  Log:
  Adding an Informix (ifx) database implementation.
  
  Submitted by: "Tomas V.V.Cox" <[EMAIL PROTECTED]>
  
  
Index: php4/pear/DB/MAINTAINERS
diff -u php4/pear/DB/MAINTAINERS:1.3 php4/pear/DB/MAINTAINERS:1.4
--- php4/pear/DB/MAINTAINERS:1.3        Wed Dec 13 06:41:04 2000
+++ php4/pear/DB/MAINTAINERS    Fri Mar 23 11:26:55 2001
@@ -9,3 +9,4 @@
 pgsql     : Rui Hirokawa <[EMAIL PROTECTED]>
             Stig Bakken <[EMAIL PROTECTED]>
 sybase    : 
+ifx       : Tomas V.V.Cox <[EMAIL PROTECTED]>

Index: php4/pear/DB/ifx.php
+++ php4/pear/DB/ifx.php
<?php
//
// +----------------------------------------------------------------------+
// | PHP version 4.0                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2001 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license,      |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors:    Tomas V.V.Cox <[EMAIL PROTECTED]>                           |
// +----------------------------------------------------------------------+
//
// Database independent query interface definition for PHP's Informix
// extension.
//

// Legend:
// For more info on Informix errors see:
// http://www.informix.com/answers/english/ierrors.htm
//

require_once 'DB/common.php';

class DB_ifx extends DB_common
{
    var $connection;
    var $numrows;
    var $row;
    var $affected = 0;
    var $fetchmode = DB_FETCHMODE_ASSOC; /* Default fetch mode */

    function DB_ifx()
    {
        $this->phptype = 'ifx';
        $this->dbsyntax = 'ifx';
        $this->features = array(
            'prepare' => false,
            'pconnect' => true,
            'transactions' => false
        );
        $this->errorcode_map = array();
    }

    /**
     * Connect to a database and log in as the specified user.
     *
     * @param $dsn the data source name (see DB::parseDSN for syntax)
     * @param $persistent (optional) whether the connection should
     *        be persistent
     *
     * @return int DB_OK on success, a DB error code on failure
     */
    function connect(&$dsn, $persistent = false)
    {
        $dsninfo = DB::parseDSN($dsn);
        $dbhost = $dsninfo['hostspec'] ? '@' . $dsninfo['hostspec'] : '';
        $dbname = $dsninfo['database'] ? $dsninfo['database'] . $dbhost : '';
        $user = $dsninfo['username'] ? $dsninfo['username'] : '';
        $pw = $dsninfo['password'] ? $dsninfo['password'] : '';

        $connect_function = $persistent ? 'ifx_pconnect' : 'ifx_connect';
        $this->connection = @$connect_function($dbname, $user, $pw);
        if ($this->connection == false) {
            return $this->ifxraiseError();
        }
        return DB_OK;
    }

    /**
     * Log out and disconnect from the database.
     *
     * @return bool TRUE on success, FALSE if not connected.
     */
    function disconnect()
    {
        return @ifx_close($this->connection);
    }

    /**
     * Send a query to Informix and return the results as a
     * Informix resource identifier.
     *
     * @param $query the SQL query
     *
     * @return int returns a valid Informix result for successful SELECT
     * queries, DB_OK for other successful queries.  A DB error code
     * is returned on failure.
     */
    function simpleQuery($query)
    {
        $this->last_query = $query;
        // the scroll is needed for fetching absolute row numbers
        // in a select query result
        $cursor = (preg_match('/(SELECT)/i', $query)) ? IFX_SCROLL : null;
        if (!$result = @ifx_prepare($query, $this->connection, $cursor)) {
            return $this->ifxraiseError();
        }
        if (!@ifx_do($result)) {
            return $this->ifxraiseError();
        }
        $this->affected = ifx_affected_rows ($result);
        // Determine which queries that should return data, and which
        // should return an error code only.
        if (preg_match('/(SELECT)/i', $query)) {
            return $result;
        } else {
            return DB_OK;
        }
    }

    /**
     * Gets the number of rows affected by the last query.
     * if the last query was a select, returns an _estimate_ value.
     *
     * @return number of rows affected by the last query
     */
    function affectedRows()
    {
        return $this->affected;
    }

    /**
     * Fetch a row and return as array.
     *
     * @param $result Informix result identifier
     * @param $fetchmode how the resulting array should be indexed
     * @param $rownum the row number to fetch
     *
     * @return int an array on success, a DB error code on failure, NULL
     *             if there is no more data
     */
    function &fetchRow($result, $fetchmode, $rownum=null)
    {
        $rownum = (!empty($rownum) && ($rownum > 0)) ? $rownum : null;
        if (!$row = @ifx_fetch_row($result, $rownum)) {
            return NULL;
        }
        switch ($fetchmode){
            case DB_FETCHMODE_ASSOC:
                return $row;
            case DB_FETCHMODE_ORDERED:
                $i=0;
                foreach ($row as $key => $val) {
                    $order[$i++] = $val;
                }
                return $order;
            default:
                return $this->raiseError(DB_ERROR_UNSUPPORTED);
        }
    }

    function numRows($result)
    {
        return $this->raiseError(DB_ERROR_NOT_CAPABLE);
    }

    /**
     * Get the number of columns in a result set.
     *
     * @param $result Informix result identifier
     *
     * @return int the number of columns per row in $result
     */
    function numCols($result)
    {
        if (!$cols = @ifx_num_fields($result)) {
            return $this->ifxraiseError();
        }
        return $cols;
    }

    /**
     * Free the internal resources associated with $result.
     *
     * @param $result Informix result identifier
     *
     * @return bool TRUE on success, DB_error on error
     */
    function freeResult($result)
    {
        if (!@ifx_free_result($result)) {
            return $this->ifxraiseError();
        }
        return true;
    }

    function fetchInto($res, &$arr, $mode)
    {
        return $this->raiseError(DB_ERROR_UNSUPPORTED);
    }

    function ifxraiseError($errno = null)
    {
        if ($errno == null) {
            $errno = $this->errorCode();
        }

        return $this->raiseError($errno, false, false, false,
                            $this->errorNative());
    }

    /**
     * Map native error codes to DB's portable ones.  Requires that
     * the DB implementation's constructor fills in the $errorcode_map
     * property.
     *
     * @return int a portable DB error code, or DB_ERROR if this DB
     * implementation has no mapping for the given error code.
     */

    function errorCode()
    {
        if (ereg('SQLCODE=(.*)]', ifx_error(), $match)) {
            $code = $match[1];
            $codes = array(
                '-201'    => DB_ERROR_SYNTAX,
                '-206'    => DB_ERROR_NOSUCHTABLE,
                '-217'    => DB_ERROR_NOSUCHFIELD,
                '-329'    => DB_ERROR_NODBSELECTED,
                '-1204'   => DB_ERROR_INVALID_DATE,
                '-1205'   => DB_ERROR_INVALID_DATE,
                '-1206'   => DB_ERROR_INVALID_DATE,
                '-1209'   => DB_ERROR_INVALID_DATE,
                '-1210'   => DB_ERROR_INVALID_DATE,
                '-1212'   => DB_ERROR_INVALID_DATE
            );
            if (isset($codes[$code])) {
                return $codes[$code];
            }
        }
        return DB_ERROR;
    }

    /**
     * Get the native error message of the last error (if any) that
     * occured on the current connection.
     *
     * @return int native Informix error code
     */
    function errorNative()
    {
        return ifx_error() . ' ' . ifx_errormsg();
    }
}

?>

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to