cvs: php4 /pear DB.php /pear/DB common.php error.php mysql.php result.php warning.php

From: Date: Mon, 04 Dec 2000 06:56:33 +0000
Subject: cvs: php4 /pear DB.php /pear/DB common.php error.php mysql.php result.php warning.php
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-2911@lists.php.net to get a copy of this message
sbergmann Sun Dec 3 22:56:33 2000 EDT Added files: /php4/pear/DB error.php result.php warning.php Modified files: /php4/pear DB.php /php4/pear/DB common.php mysql.php Log: I couldn't read it in order to understand it in order to extend it :-)

Index: php4/pear/DB.php diff -u php4/pear/DB.php:1.34 php4/pear/DB.php:1.35 --- php4/pear/DB.php:1.34 Sun Oct 15 02:02:54 2000 +++ php4/pear/DB.php Sun Dec 3 22:56:29 2000 @@ -17,506 +17,440 @@ // | | // +----------------------------------------------------------------------+ // -// $Id: DB.php,v 1.34 2000/10/15 09:02:54 ssb Exp $ +// $Id: DB.php,v 1.35 2000/12/04 06:56:29 sbergmann Exp $ // // Database independent query interface. // -require_once "PEAR.php"; + require_once "PEAR.php"; + require_once "DB/ERROR.php"; + require_once "DB/RESULT.php"; + require_once "DB/WARNING.php"; + + /* + * The method mapErrorCode in each DB_dbtype implementation maps + * native error codes to one of these. + * + * If you add an error code here, make sure you also add a textual + * version of it in DB::errorMessage(). + */ + + define( "DB_OK", 0 ); + define( "DB_ERROR", -1 ); + define( "DB_ERROR_SYNTAX", -2 ); + define( "DB_ERROR_CONSTRAINT", -3 ); + define( "DB_ERROR_NOT_FOUND", -4 ); + define( "DB_ERROR_ALREADY_EXISTS", -5 ); + define( "DB_ERROR_UNSUPPORTED", -6 ); + define( "DB_ERROR_MISMATCH", -7 ); + define( "DB_ERROR_INVALID", -8 ); + define( "DB_ERROR_NOT_CAPABLE", -9 ); + define( "DB_ERROR_TRUNCATED", -10 ); + define( "DB_ERROR_INVALID_NUMBER", -11 ); + define( "DB_ERROR_INVALID_DATE", -12 ); + define( "DB_ERROR_DIVZERO", -13 ); + define( "DB_ERROR_NODBSELECTED", -14 ); + define( "DB_ERROR_CANNOT_CREATE", -15 ); + define( "DB_ERROR_CANNOT_DELETE", -16 ); + define( "DB_ERROR_CANNOT_DROP", -17 ); + define( "DB_ERROR_NOSUCHTABLE", -18 ); + define( "DB_ERROR_NOSUCHFIELD", -19 ); + define( "DB_ERROR_NEED_MORE_DATA", -20 ); + define( "DB_ERROR_NOT_LOCKED", -21 ); + define( "DB_ERROR_VALUE_COUNT_ON_ROW", -22 ); + + /* + * Warnings are not detected as errors by DB::isError(), and are not + * fatal. You can detect whether an error is in fact a warning with + * DB::isWarning(). + */ + + define( "DB_WARNING", -1000 ); + define( "DB_WARNING_READ_ONLY", -1001 ); + + /* + * These constants are used when storing information about prepared + * statements (using the "prepare" method in DB_dbtype). + * + * The prepare/execute model in DB is mostly borrowed from the ODBC + * extension, in a query the "?" character means a scalar parameter. + * There is one extension though, a "*" character means an opaque + * parameter. An opaque parameter is simply a file name, the real + * data are in that file (useful for stuff like putting uploaded files + * into your database). + */ + + define( "DB_PARAM_SCALAR", 1); + define( "DB_PARAM_OPAQUE", 2); + + /* + * These constants define different ways of returning binary data + * from queries. Again, this model has been borrowed from the ODBC + * extension. + * + * DB_BINMODE_PASSTHRU sends the data directly through to the browser + * when data is fetched from the database. + * DB_BINMODE_RETURN lets you return data as usual. + * DB_BINMODE_CONVERT returns data as well, only it is converted to + * hex format, for example the string "123" would become "313233". + */ + + define( "DB_BINMODE_PASSTHRU", 1 ); + define( "DB_BINMODE_RETURN", 2 ); + define( "DB_BINMODE_CONVERT", 3 ); + + /** + * This is a special constant that tells DB the user hasn't specified + * any particular get mode, so the default should be used. + */ + + define( "DB_FETCHMODE_DEFAULT", 0 ); + + /** + * Column data indexed by numbers, ordered from 0 and up + */ + + define( "DB_FETCHMODE_ORDERED", 1 ); + + /** + * Column data indexed by column names + */ + + define( "DB_FETCHMODE_ASSOC", 2 ); + + /** + * For multi-dimensional results: normally the first level of arrays + * is the row number, and the second level indexed by column number or name. + * DB_FETCHMODE_FLIPPED switches this order, so the first level of arrays + * is the column name, and the second level the row number. + */ + + define( "DB_FETCHMODE_FLIPPED", 4 ); + + /* for compatibility */ + + define( "DB_GETMODE_ORDERED", DB_FETCHMODE_ORDERED ); + define( "DB_GETMODE_ASSOC", DB_FETCHMODE_ASSOC ); + define( "DB_GETMODE_FLIPPED", DB_FETCHMODE_FLIPPED ); + + /** + * The main "DB" class is simply a container class with some static + * methods for creating DB objects as well as some utility functions + * common to all parts of DB. + * + * The object model of DB is as follows (indentation means inheritance): + * + * DB The main DB class. This is simply a utility class + * with some "static" methods for creating DB objects as + * well as common utility functions for other DB classes. + * + * DB_common The base for each DB implementation. Provides default + * | implementations (in OO lingo virtual methods) for + * | the actual DB implementations as well as a bunch of + * | query utility functions. + * | + * +-DB_mysql The DB implementation for MySQL. Inherits DB_common. + * When calling DB::factory or DB::connect for MySQL + * connections, the object returned is an instance of this + * class. + * + * @version 2 + * @author Stig Bakken <ssb@fast.no> + * @since PHP 4.0 + */ -/* - * The method mapErrorCode in each DB_dbtype implementation maps - * native error codes to one of these. - * - * If you add an error code here, make sure you also add a textual - * version of it in DB::errorMessage(). - */ -define("DB_OK", 0); -define("DB_ERROR", -1); -define("DB_ERROR_SYNTAX", -2); -define("DB_ERROR_CONSTRAINT", -3); -define("DB_ERROR_NOT_FOUND", -4); -define("DB_ERROR_ALREADY_EXISTS", -5); -define("DB_ERROR_UNSUPPORTED", -6); -define("DB_ERROR_MISMATCH", -7); -define("DB_ERROR_INVALID", -8); -define("DB_ERROR_NOT_CAPABLE", -9); -define("DB_ERROR_TRUNCATED", -10); -define("DB_ERROR_INVALID_NUMBER", -11); -define("DB_ERROR_INVALID_DATE", -12); -define("DB_ERROR_DIVZERO", -13); -define("DB_ERROR_NODBSELECTED", -14); -define("DB_ERROR_CANNOT_CREATE", -15); -define("DB_ERROR_CANNOT_DELETE", -16); -define("DB_ERROR_CANNOT_DROP", -17); -define("DB_ERROR_NOSUCHTABLE", -18); -define("DB_ERROR_NOSUCHFIELD", -19); -define("DB_ERROR_NEED_MORE_DATA", -20); -define("DB_ERROR_NOT_LOCKED", -21); -define("DB_ERROR_VALUE_COUNT_ON_ROW", -22); - - -/* - * Warnings are not detected as errors by DB::isError(), and are not - * fatal. You can detect whether an error is in fact a warning with - * DB::isWarning(). - */ -define("DB_WARNING", -1000); -define("DB_WARNING_READ_ONLY", -1001); - - -/* - * These constants are used when storing information about prepared - * statements (using the "prepare" method in DB_dbtype). - * - * The prepare/execute model in DB is mostly borrowed from the ODBC - * extension, in a query the "?" character means a scalar parameter. - * There is one extension though, a "*" character means an opaque - * parameter. An opaque parameter is simply a file name, the real - * data are in that file (useful for stuff like putting uploaded files - * into your database). - */ -define("DB_PARAM_SCALAR", 1); -define("DB_PARAM_OPAQUE", 2); - - -/* - * These constants define different ways of returning binary data - * from queries. Again, this model has been borrowed from the ODBC - * extension. - * - * DB_BINMODE_PASSTHRU sends the data directly through to the browser - * when data is fetched from the database. - * DB_BINMODE_RETURN lets you return data as usual. - * DB_BINMODE_CONVERT returns data as well, only it is converted to - * hex format, for example the string "123" would become "313233". - */ -define("DB_BINMODE_PASSTHRU", 1); -define("DB_BINMODE_RETURN", 2); -define("DB_BINMODE_CONVERT", 3); - - - -/** - * This is a special constant that tells DB the user hasn't specified - * any particular get mode, so the default should be used. - */ -define('DB_FETCHMODE_DEFAULT', 0); -/** - * Column data indexed by numbers, ordered from 0 and up - */ -define('DB_FETCHMODE_ORDERED', 1); -/** - * Column data indexed by column names - */ -define('DB_FETCHMODE_ASSOC', 2); -/** - * For multi-dimensional results: normally the first level of arrays - * is the row number, and the second level indexed by column number or name. - * DB_FETCHMODE_FLIPPED switches this order, so the first level of arrays - * is the column name, and the second level the row number. - */ -define('DB_FETCHMODE_FLIPPED', 4); - -/* for compatibility */ -define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); -define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); -define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED); - -/** - * The main "DB" class is simply a container class with some static - * methods for creating DB objects as well as some utility functions - * common to all parts of DB. - * - * The object model of DB is as follows (indentation means inheritance): - * - * DB The main DB class. This is simply a utility class - * with some "static" methods for creating DB objects as - * well as common utility functions for other DB classes. - * - * DB_common The base for each DB implementation. Provides default - * | implementations (in OO lingo virtual methods) for - * | the actual DB implementations as well as a bunch of - * | query utility functions. - * | - * +-DB_mysql The DB implementation for MySQL. Inherits DB_common. - * When calling DB::factory or DB::connect for MySQL - * connections, the object returned is an instance of this - * class. - * - * @version 2 - * @author Stig Bakken <ssb@fast.no> - * @since PHP 4.0 - */ -class DB { - /** - * Create a new DB object for the specified database type - * - * @param $type string database type, for example "mysql" - * - * @return object a newly created DB object, or a DB error code on - * error - */ - function &factory($type) { - @include_once("DB/${type}.php"); - $classname = 'DB_' . $type; - $obj = @new $classname; - if (!$obj) { - return new DB_Error(DB_ERROR_NOT_FOUND); - } - return $obj; - } - - /** - * Create a new DB object and connect to the specified database - * - * @param $dsn string "data source name", see the DB::parseDSN - * method for a description of the dsn format. - * - * @param $persistent bool whether this connection should be - * persistent. Ignored if the backend extension does not support - * persistent connections. - * - * @return object a newly created DB object, or a DB error code on - * error - */ - function &connect($dsn, $persistent = false) { - $dsninfo = DB::parseDSN($dsn); - $type = $dsninfo['phptype']; - @include_once("DB/${type}.php"); - $classname = 'DB_' . $type; - $obj = @new $classname; - if (!$obj) { - return new DB_Error(DB_ERROR_NOT_FOUND); - } - $err = $obj->connect($dsninfo, $persistent); - if (DB::isError($err)) { - return $err; - } - return $obj; - } - - /** - * Return the DB API version - * - * @return int the DB API version number - */ - function apiVersion() { - return 2; + class DB + { + /** + * Create a new DB object for the specified database type + * + * @param $type string database type, for example "mysql" + * + * @return object a newly created DB object, or a DB error code on + * error + */ + + function &factory( $type ) + { + @include_once( "DB/${type}.php" ); + + $classname = "DB_" . $type; + $obj = @new $classname; + + if( !$obj ) + { + return new DB_Error( DB_ERROR_NOT_FOUND ); + } + + return $obj; } - /** - * Tell whether a result code from a DB method is an error - * - * @param $value int result code - * - * @return bool whether $value is an error - */ - function isError($value) { - return is_object($value) && - (get_class($value) == "db_error" || - is_subclass_of($value, "db_error")); - } - - /** - * Tell whether a result code from a DB method is a warning. - * Warnings differ from errors in that they are generated by DB, - * and are not fatal. - * - * @param $value mixed result value - * - * @return bool whether $value is a warning - */ - function isWarning($value) { - return is_object($value) && - (get_class($value) == "db_warning" || - is_subclass_of($value, "db_warning")); - } - - /** - * Return a textual error message for a DB error code - * - * @param $value int error code - * - * @return string error message, or false if the error code was - * not recognized - */ - function errorMessage($value) { - if (!isset($errorMessages)) { - $errorMessages = array( - DB_ERROR => "unknown error", - DB_ERROR_ALREADY_EXISTS => "already exists", - DB_ERROR_CANNOT_CREATE => "can not create", - DB_ERROR_CANNOT_DELETE => "can not delete", - DB_ERROR_CANNOT_DROP => "can not drop", - DB_ERROR_CONSTRAINT => "constraint violation", - DB_ERROR_DIVZERO => "division by zero", - DB_ERROR_INVALID => "invalid", - DB_ERROR_INVALID_DATE => "invalid date or time", - DB_ERROR_INVALID_NUMBER => "invalid number", - DB_ERROR_MISMATCH => "mismatch", - DB_ERROR_NODBSELECTED => "no database selected", - DB_ERROR_NOSUCHFIELD => "no such field", - DB_ERROR_NOSUCHTABLE => "no such table", - DB_ERROR_NOT_CAPABLE => "DB backend not capable", - DB_ERROR_NOT_FOUND => "not found", - DB_ERROR_NOT_LOCKED => "not locked", - DB_ERROR_SYNTAX => "syntax error", - DB_ERROR_UNSUPPORTED => "not supported", - DB_ERROR_VALUE_COUNT_ON_ROW => "value count on row", - DB_OK => "no error", - DB_WARNING => "unknown warning", - DB_WARNING_READ_ONLY => "read only" - ); - } - if (DB::isError($value)) { - $value = $value->code; - } - return $errorMessages[$value]; - } - - /** - * Parse a data source name - * - * @param $dsn string Data Source Name to be parsed - * - * @return array an associative array with the following keys: - * <dl> - * <dt>phptype</dt> - * <dd>Database backend used in PHP (mysql, odbc etc.)</dd> - * <dt>dbsyntax</dt> - * <dd>Database used with regards to SQL syntax etc.</dd> - * <dt>protocol</dt> - * <dd>Communication protocol to use (tcp, unix etc.)</dd> - * <dt>hostspec</dt> - * <dd>Host specification (hostname[:port])</dd> - * <dt>database</dt> - * <dd>Database to use on the DBMS server</dd> - * <dt>username</dt> - * <dd>User name for login</dd> - * <dt>password</dt> - * <dd>Password for login</dd> - * </dl> - * </p> - * - * <p> - * The format of the supplied DSN is in its fullest form: - * <ul> - * <li>phptype(dbsyntax)://username:password@protocol+hostspec/database</li> - * </ul> - * Most variations are allowed: - * <ul> - * <li>phptype://username:password@protocol+hostspec/database</li> - * <li>phptype://username:password@hostspec/database</li> - * <li>phptype://username:password@hostspec</li> - * <li>phptype://hostspec/database</li> - * <li>phptype://hostspec</li> - * <li>phptype(dbsyntax)</li> - * <li>phptype</li> - * </ul> - * </p> - * - * @return bool FALSE is returned on error - */ - function parseDSN($dsn) { - if (is_array($dsn)) - return $dsn; - - $parsed = array( - 'phptype' => false, - 'dbsyntax' => false, - 'protocol' => false, - 'hostspec' => false, - 'database' => false, - 'username' => false, - 'password' => false - ); - if (preg_match('|^([^:]+)://|', $dsn, $arr)) { - $dbtype = $arr[1]; - $dsn = preg_replace('|^[^:]+://|', '', $dsn); - // match "phptype(dbsyntax)" - if (preg_match('|^([^\(]+)\((.+)\)$|', $dbtype, $arr)) { - $parsed['phptype'] = $arr[1]; - $parsed['dbsyntax'] = $arr[2]; - } else { - $parsed['phptype'] = $dbtype; - } - } else { - // match "phptype(dbsyntax)" - if (preg_match('|^([^\(]+)\((.+)\)$|', $dsn, $arr)) { - $parsed['phptype'] = $arr[1]; - $parsed['dbsyntax'] = $arr[2]; - } else { - $parsed['phptype'] = $dsn; - } - return $parsed; - } - - if (preg_match('|^(.*)/([^/]+)/?$|', $dsn, $arr)) { - $parsed['database'] = $arr[2]; - $dsn = $arr[1]; - } - - if (preg_match('|^([^:]+):([^@]+)@?(.*)$|', $dsn, $arr)) { - $parsed['username'] = $arr[1]; - $parsed['password'] = $arr[2]; - $dsn = $arr[3]; - } elseif (preg_match('|^([^:]+)@(.*)$|', $dsn, $arr)) { - $parsed['username'] = $arr[1]; - $dsn = $arr[2]; - } - - if (preg_match('|^([^\+]+)\+(.*)$|', $dsn, $arr)) { - $parsed['protocol'] = $arr[1]; - $dsn = $arr[2]; - } - - if (!$parsed['database']) - $dsn = preg_replace('|/+$|', '', $dsn); - - $parsed['hostspec'] = urldecode($dsn); - - if (!$parsed['dbsyntax']) { - $parsed['dbsyntax'] = $parsed['phptype']; - } - - return $parsed; - } -} - -/** - * This class implements a wrapper for a DB result set. - * A new instance of this class will be returned by the DB implementation - * after processing a query that returns data. - * - * @author Stig Bakken <ssb@fast.no> - */ -class DB_result { + /** + * Create a new DB object and connect to the specified database + * + * @param $dsn string "data source name", see the DB::parseDSN + * method for a description of the dsn format. + * + * @param $persistent bool whether this connection should be + * persistent. Ignored if the backend extension does not support + * persistent connections. + * + * @return object a newly created DB object, or a DB error code on + * error + */ + + function &connect( $dsn, $persistent = false ) + { + $dsninfo = DB::parseDSN( $dsn ); + $type = $dsninfo[ "phptype" ]; + $classname = "DB_" . $type; + + @include_once( "DB/${type}.php" ); + $obj = @new $classname; + + if( !$obj ) + { + return new DB_Error( DB_ERROR_NOT_FOUND ); + } + + $err = $obj->connect( $dsninfo, $persistent ); + + if( DB::isError( $err ) ) + { + return $err; + } - var $dbh; - var $result; + return $obj; + } /** - * DB_result constructor. - * @param $dbh DB object reference - * @param $result result resource id - */ - function DB_result(&$dbh, $result) { - $this->dbh = &$dbh; - $this->result = $result; + * Return the DB API version + * + * @return int the DB API version number + */ + + function apiVersion() + { + return 2; } - /** - * Fetch and return a row of data. - * @return array a row of data, or false on error - */ - function fetchRow($fetchmode = DB_FETCHMODE_DEFAULT) { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->dbh->fetchmode; - } - return $this->dbh->fetchRow($this->result, $fetchmode); + /** + * Tell whether a result code from a DB method is an error + * + * @param $value int result code + * + * @return bool whether $value is an error + */ + + function isError( $value ) + { + return is_object( $value ) && + ( get_class( $value ) == "db_error" || + is_subclass_of( $value, "db_error" ) + ); } /** - * Fetch a row of data into an existing array. - * - * @param $arr reference to data array - * @return int error code - */ - function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT) { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->dbh->fetchmode; - } - return $this->dbh->fetchInto($this->result, $arr, $fetchmode); + * Tell whether a result code from a DB method is a warning. + * Warnings differ from errors in that they are generated by DB, + * and are not fatal. + * + * @param $value mixed result value + * + * @return bool whether $value is a warning + */ + + function isWarning( $value ) + { + return is_object( $value ) && + ( get_class( $value ) == "db_warning" || + is_subclass_of( $value, "db_warning" ) + ); } - /** - * Get the the number of columns in a result set. - * - * @return int the number of columns, or a DB error code - */ - function numCols() { - return $this->dbh->numCols($this->result); - } - /** - * Frees the resources allocated for this result set. - * @return int error code - */ - function free() { - $err = $this->dbh->freeResult($this->result); - if (DB::isError($err)) { - return $err; - } - $this->result = false; - return true; + * Return a textual error message for a DB error code + * + * @param $value int error code + * + * @return string error message, or false if the error code was + * not recognized + */ + + function errorMessage( $value ) + { + if( !isset( $errorMessages ) ) + { + $errorMessages = array( + DB_ERROR => "unknown error", + DB_ERROR_ALREADY_EXISTS => "already exists", + DB_ERROR_CANNOT_CREATE => "can not create", + DB_ERROR_CANNOT_DELETE => "can not delete", + DB_ERROR_CANNOT_DROP => "can not drop", + DB_ERROR_CONSTRAINT => "constraint violation", + DB_ERROR_DIVZERO => "division by zero", + DB_ERROR_INVALID => "invalid", + DB_ERROR_INVALID_DATE => "invalid date or time", + DB_ERROR_INVALID_NUMBER => "invalid number", + DB_ERROR_MISMATCH => "mismatch", + DB_ERROR_NODBSELECTED => "no database selected", + DB_ERROR_NOSUCHFIELD => "no such field", + DB_ERROR_NOSUCHTABLE => "no such table", + DB_ERROR_NOT_CAPABLE => "DB backend not capable", + DB_ERROR_NOT_FOUND => "not found", + DB_ERROR_NOT_LOCKED => "not locked", + DB_ERROR_SYNTAX => "syntax error", + DB_ERROR_UNSUPPORTED => "not supported", + DB_ERROR_VALUE_COUNT_ON_ROW => "value count on row", + DB_OK => "no error", + DB_WARNING => "unknown warning", + DB_WARNING_READ_ONLY => "read only" + ); + } + + if( DB::isError( $value ) ) + { + $value = $value->code; + } + + return $errorMessages[ $value ]; } -} -/** - * DB_Error implements a class for reporting portable database error - * messages. - * - * @author Stig Bakken <ssb@fast.no> - */ -class DB_Error extends PEAR_Error { - /** - * DB_Error constructor. - * - * @param $code mixed DB error code, or string with error message. - * @param $mode int what "error mode" to operate in - * @param $level what error level to use for $mode & PEAR_ERROR_TRIGGER - * @param $debuginfo additional debug info, such as the last query - * - * @access public - * - * @see PEAR_Error - */ - function DB_Error($code = DB_ERROR, - $mode = PEAR_ERROR_RETURN, - $level = E_USER_NOTICE, - $debuginfo = null) { - if (is_int($code)) { - $this->PEAR_Error("DB Error: " . DB::errorMessage($code), $code, $mode, $level, $debuginfo); - } else { - $this->PEAR_Error("DB Error: $code", 0, $mode, $level, $debuginfo); - } - } -} - -/** - * DB_Warning implements a class for reporting portable database - * warning messages. - * - * @author Stig Bakken <ssb@fast.no> - */ -class DB_Warning extends PEAR_Error { - /** - * DB_Warning constructor. - * - * @param $code mixed DB error code, or string with error message. - * @param $mode int what "error mode" to operate in - * @param $level what error level to use for $mode == PEAR_ERROR_TRIGGER - * @param $debuginfo additional debug info, such as the last query - * - * @access public - * - * @see PEAR_Error - */ - function DB_Warning($code = DB_WARNING, - $mode = PEAR_ERROR_RETURN, - $level = E_USER_NOTICE, - $debuginfo = null) { - if (is_int($code)) { - $this->PEAR_Error("DB Warning: " . DB::errorMessage($code), $code, $mode, $level, $debuginfo); - } else { - $this->PEAR_Error("DB Warning: $code", 0, $mode, $level, $debuginfo); - } - } -} - -// Local variables: -// tab-width: 4 -// c-basic-offset: 4 -// End: + /** + * Parse a data source name + * + * @param $dsn string Data Source Name to be parsed + * + * @return array an associative array with the following keys: + * <dl> + * <dt>phptype</dt> + * <dd>Database backend used in PHP (mysql, odbc etc.)</dd> + * <dt>dbsyntax</dt> + * <dd>Database used with regards to SQL syntax etc.</dd> + * <dt>protocol</dt> + * <dd>Communication protocol to use (tcp, unix etc.)</dd> + * <dt>hostspec</dt> + * <dd>Host specification (hostname[:port])</dd> + * <dt>database</dt> + * <dd>Database to use on the DBMS server</dd> + * <dt>username</dt> + * <dd>User name for login</dd> + * <dt>password</dt> + * <dd>Password for login</dd> + * </dl> + * </p> + * + * <p> + * The format of the supplied DSN is in its fullest form: + * <ul> + * <li>phptype(dbsyntax)://username:password@protocol+hostspec/database</li> + * </ul> + * Most variations are allowed: + * <ul> + * <li>phptype://username:password@protocol+hostspec/database</li> + * <li>phptype://username:password@hostspec/database</li> + * <li>phptype://username:password@hostspec</li> + * <li>phptype://hostspec/database</li> + * <li>phptype://hostspec</li> + * <li>phptype(dbsyntax)</li> + * <li>phptype</li> + * </ul> + * </p> + * + * @return bool FALSE is returned on error + */ + + function parseDSN( $dsn ) + { + if( is_array( $dsn ) ) + { + return $dsn; + } + + $parsed = array( + "phptype" => false, + "dbsyntax" => false, + "protocol" => false, + "hostspec" => false, + "database" => false, + "username" => false, + "password" => false + ); + + if( preg_match( "|^([^:]+)://|", $dsn, $arr ) ) + { + $dbtype = $arr[ 1 ]; + $dsn = preg_replace( "|^[^:]+://|", '', $dsn ); + + // match "phptype(dbsyntax)" + if( preg_match( "|^([^\(]+)\((.+)\)$|", $dbtype, $arr ) ) + { + $parsed[ "phptype" ] = $arr[ 1 ]; + $parsed[ "dbsyntax" ] = $arr[ 2 ]; + } + + else + { + $parsed[ "phptype" ] = $dbtype; + } + + } + + else + { + // match "phptype(dbsyntax)" + if( preg_match( "|^([^\(]+)\((.+)\)$|", $dsn, $arr ) ) + { + $parsed[ "phptype" ] = $arr[ 1 ]; + $parsed[ "dbsyntax" ] = $arr[ 2 ]; + } + + else + { + $parsed[ "phptype" ] = $dsn; + } + + return $parsed; + } + + if( preg_match( "|^(.*)/([^/]+)/?$|", $dsn, $arr ) ) + { + $parsed[ "database" ] = $arr[ 2 ]; + $dsn = $arr[ 1 ]; + } + + if( preg_match( "|^([^:]+):([^@]+)@?(.*)$|", $dsn, $arr ) ) + { + $parsed[ "username" ] = $arr[ 1 ]; + $parsed[ "password" ] = $arr[ 2 ]; + $dsn = $arr[ 3 ]; + } + + elseif( preg_match( "|^([^:]+)@(.*)$|", $dsn, $arr ) ) + { + $parsed[ "username" ] = $arr[ 1 ]; + $dsn = $arr[ 2 ]; + } + + if( preg_match( "|^([^\+]+)\+(.*)$|", $dsn, $arr ) ) + { + $parsed[ "protocol" ] = $arr[ 1 ]; + $dsn = $arr[ 2 ]; + } + + if( !$parsed[ "database" ] ) + { + $dsn = preg_replace( "|/+$|", "", $dsn ); + } + + $parsed[ "hostspec" ] = urldecode( $dsn ); + + if( !$parsed[ "dbsyntax"] ) + { + $parsed[ "dbsyntax" ] = $parsed[ "phptype" ]; + } + + return $parsed; + } + } ?> Index: php4/pear/DB/common.php diff -u php4/pear/DB/common.php:1.24 php4/pear/DB/common.php:1.25 --- php4/pear/DB/common.php:1.24 Sat Oct 14 19:22:26 2000 +++ php4/pear/DB/common.php Sun Dec 3 22:56:29 2000 @@ -20,596 +20,793 @@ // Base class for DB implementations. // -/** - * DB_common is a base class for DB implementations, and should be - * inherited by all such. - */ -class DB_common { + /** + * DB_common is a base class for DB implementations, and should be + * inherited by all such. + */ + + class DB_common + { // {{{ properties + + var $features; // assoc of capabilities for this DB implementation + var $errorcode_map; // assoc mapping native error codes to DB ones + var $type; // DB type (mysql, oci8, odbc etc.) + var $prepare_tokens; + var $prepare_types; + var $prepare_maxstmt; + var $error_mode = PEAR_ERROR_RETURN; + var $error_level = E_USER_NOTICE; + var $error_callback; + var $last_query = ''; + var $fetchmode = DB_FETCHMODE_DEFAULT; + + // }}} + // {{{ toString() + + function toString() + { + $info = get_class( $this ); + + $info .= ": (phptype=" . $this->phptype . + ", dbsyntax=" . $this->dbsyntax . + ")"; + + if( $this->connection ) + { + $info .= " [connected]"; + } - var $features; // assoc of capabilities for this DB implementation - var $errorcode_map; // assoc mapping native error codes to DB ones - var $type; // DB type (mysql, oci8, odbc etc.) - var $prepare_tokens; - var $prepare_types; - var $prepare_maxstmt; - var $error_mode = PEAR_ERROR_RETURN; - var $error_level = E_USER_NOTICE; - var $error_callback; - var $last_query = ''; - var $fetchmode = DB_FETCHMODE_DEFAULT; - - // }}} - // {{{ toString() - - function toString() { - $info = get_class($this); - $info .= - ": (phptype=" . $this->phptype . - ", dbsyntax=" . $this->dbsyntax . - ")"; - if ($this->connection) { - $info .= " [connected]"; - } - return $info; - } + return $info; + } - // }}} + // }}} // {{{ constructor - function DB_common() { - $this->features = array(); - $this->errorcode_map = array(); - $this->fetchmode = DB_FETCHMODE_ORDERED; - } + function DB_common() + { + $this->features = array(); + $this->errorcode_map = array(); + $this->fetchmode = DB_FETCHMODE_ORDERED; + } // }}} // {{{ quoteString() - /** - * Quotes a string so it can be safely used within string delimiters - * in a query. - * - * @param $string the input string to quote - * - * @return string the quoted string - */ - function quoteString($string) { - return str_replace("'", "\'", $string); - } - - // }}} - // {{{ provides() - - /** - * Tell whether a DB implementation or its backend extension - * supports a given feature. - * - * @param $feature name of the feature (see the DB class doc) - * - * @return bool whether this DB implementation supports $feature - */ - function provides($feature) { - return $this->features[$feature]; - } - - // }}} - // {{{ errorCode() - - /** - * Map native error codes to DB's portable ones. Requires that - * the DB implementation's constructor fills in the $errorcode_map - * property. - * - * @param $nativecode the native error code, as returned by the backend - * database extension (string or integer) - * - * @return int a portable DB error code, or FALSE if this DB - * implementation has no mapping for the given error code. - */ - function errorCode($nativecode) { - if ($this->errorcode_map[$nativecode]) { - return $this->errorcode_map[$nativecode]; - } - //php_error(E_WARNING, get_class($this)."::errorCode: no mapping for $nativecode"); - // Fall back to DB_ERROR if there was no mapping. Ideally, - // this should never happen. - return $this->raiseError(DB_ERROR, false, false, false, $nativecode); - } - - // }}} - // {{{ errorMessage() - - /** - * Map a DB error code to a textual message. This is actually - * just a wrapper for DB::errorMessage(). - * - * @param $dbcode the DB error code - * - * @return string the corresponding error message, of FALSE - * if the error code was unknown - */ - function errorMessage($dbcode) { - return DB::errorMessage($this->errorcode_map[$dbcode]); - } + /** + * Quotes a string so it can be safely used within string delimiters + * in a query. + * + * @param $string the input string to quote + * + * @return string the quoted string + */ + + function quoteString( $string ) + { + return str_replace( "'", "\'", $string ); + } + + // }}} + // {{{ provides() + + /** + * Tell whether a DB implementation or its backend extension + * supports a given feature. + * + * @param $feature name of the feature (see the DB class doc) + * + * @return bool whether this DB implementation supports $feature + */ + + function provides( $feature ) + { + return $this->features[ $feature ]; + } + + // }}} + // {{{ errorCode() + + /** + * Map native error codes to DB's portable ones. Requires that + * the DB implementation's constructor fills in the $errorcode_map + * property. + * + * @param $nativecode the native error code, as returned by the backend + * database extension (string or integer) + * + * @return int a portable DB error code, or FALSE if this DB + * implementation has no mapping for the given error code. + */ + + function errorCode( $nativecode ) + { + if( $this->errorcode_map[ $nativecode ] ) + { + return $this->errorcode_map[ $nativecode ]; + } + + //php_error(E_WARNING, get_class($this)."::errorCode: no mapping for $nativecode"); + // Fall back to DB_ERROR if there was no mapping. Ideally, + // this should never happen. + + return $this->raiseError( DB_ERROR, false, false, false, $nativecode ); + } + + // }}} + // {{{ errorMessage() + + /** + * Map a DB error code to a textual message. This is actually + * just a wrapper for DB::errorMessage(). + * + * @param $dbcode the DB error code + * + * @return string the corresponding error message, of FALSE + * if the error code was unknown + */ + + function errorMessage( $dbcode ) + { + return DB::errorMessage( $this->errorcode_map[ $dbcode ] ); + } - // }}} + // }}} // {{{ raiseError() - /** - * This method is called by DB to generate an error. - * - */ - function &raiseError($code = DB_ERROR, $mode = false, $level = false, - $debuginfo = false, $nativecode = false) { - if (!$mode) { - $mode = $this->error_mode; - } - if ($mode == PEAR_ERROR_CALLBACK) { - if (!is_string($level) && - !(is_array($level) && sizeof($level) == 2 && - is_object($level[0]) && is_string($level[1]))) { - $level = $this->error_callback; - } - } else { - if (!$level) { - $level = $this->error_level; - } - } - if (!$debuginfo) { - $debuginfo = $this->last_query; - } - if ($nativecode) { - $debuginfo .= " [nativecode=$nativecode]"; - } - return new DB_Error($code, $mode, $level, $debuginfo); - } + /** + * This method is called by DB to generate an error. + * + */ + + function &raiseError( $code = DB_ERROR, $mode = false, $level = false, $debuginfo = false, $nativecode = false ) + { + if( !$mode ) + { + $mode = $this->error_mode; + } + + if( $mode == PEAR_ERROR_CALLBACK ) + { + if( !is_string( $level ) && + !( is_array( $level ) && sizeof( $level ) == 2 && + is_object( $level[ 0 ] ) && is_string( $level[ 1 ] ) ) ) + { + $level = $this->error_callback; + } + } + + else + { + if( !$level ) + { + $level = $this->error_level; + } + } + + if( !$debuginfo ) + { + $debuginfo = $this->last_query; + } + + if( $nativecode ) + { + $debuginfo .= " [nativecode=$nativecode]"; + } + return new DB_Error( $code, $mode, $level, $debuginfo ); + } + // }}} // {{{ setErrorHandling() - /** - * Sets how errors generated by this DB object should be handled. - * - * @param $mode int - * one of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, - * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE or - * PEAR_ERROR_CALLBACK. - * - * @param $options mixed - * Ignored unless $mode is PEAR_ERROR_TRIGGER or - * PEAR_ERROR_CALLBACK. When $mode is PEAR_ERROR_TRIGGER, - * this parameter is expected to be an integer among - * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR. When - * $mode is PEAR_ERROR_CALLBACK, this parameter is expected - * to be the callback function or method. A callback - * function is a string with the name of the function, a - * callback method is an array of two elements: the element - * at index 0 is an object, and the element at index 1 is - * the name of the method to call in the object. - * - * @see PEAR_ERROR_RETURN - * @see PEAR_ERROR_PRINT - * @see PEAR_ERROR_TRIGGER - * @see PEAR_ERROR_DIE - * @see PEAR_ERROR_CALLBACK - */ - function setErrorHandling($mode, $options = false) { - switch ($mode) { - case PEAR_ERROR_RETURN: - case PEAR_ERROR_PRINT: - case PEAR_ERROR_TRIGGER: - case PEAR_ERROR_DIE: - $this->error_mode = $mode; - if (!$options) { - $this->error_level = E_USER_NOTICE; - } else { - $this->error_level = $options; - } - break; - case PEAR_ERROR_CALLBACK: - $this->error_mode = $mode; - if (is_string($options) || - (is_array($options) && sizeof($options) == 2 && - is_object($options[0]) && is_string($options[1]))) { - $this->error_callback = $options; - } else { - trigger_error(E_USER_WARNING, "invalid error callback"); - } - $this->error_level = PEAR_ERROR_RETURN; - break; - default: - trigger_error(E_USER_WARNING, "invalid error mode"); - break; - } - } + /** + * Sets how errors generated by this DB object should be handled. + * + * @param $mode int + * one of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE or + * PEAR_ERROR_CALLBACK. + * + * @param $options mixed + * Ignored unless $mode is PEAR_ERROR_TRIGGER or + * PEAR_ERROR_CALLBACK. When $mode is PEAR_ERROR_TRIGGER, + * this parameter is expected to be an integer among + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR. When + * $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is an object, and the element at index 1 is + * the name of the method to call in the object. + * + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + */ + + function setErrorHandling( $mode, $options = false ) + { + switch( $mode ) + { + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: $this->error_mode = $mode; + + if( !$options ) + { + $this->error_level = E_USER_NOTICE; + } + + else + { + $this->error_level = $options; + } + + break; + + case PEAR_ERROR_CALLBACK: $this->error_mode = $mode; + + if( is_string( $options ) || + ( is_array( $options ) && sizeof( $options ) == 2 && + is_object( $options[ 0 ] ) && is_string( $options[ 1 ] ) ) ) + { + $this->error_callback = $options; + } + + else + { + trigger_error( E_USER_WARNING, "invalid error callback" ); + } + + $this->error_level = PEAR_ERROR_RETURN; + + break; + + default: trigger_error( E_USER_WARNING, "invalid error mode" ); + + break; + } + } // }}} // {{{ setFetchMode() - /** - * Sets which fetch mode should be used by default on queries - * on this connection. - * - * @param $fetchmode int DB_FETCHMODE_ORDERED or - * DB_FETCHMODE_ASSOC, possibly bit-wise OR'ed with - * DB_FETCHMODE_FLIPPED. - * - * @see DB_FETCHMODE_ORDERED - * @see DB_FETCHMODE_ASSOC - * @see DB_FETCHMODE_FLIPPED - */ - function setFetchMode($fetchmode) { - switch ($fetchmode) { - case DB_FETCHMODE_ORDERED: - case DB_FETCHMODE_ASSOC: - $this->fetchmode = $fetchmode; - break; - default: - return $this->raiseError("invalid get mode"); - } - } + /** + * Sets which fetch mode should be used by default on queries + * on this connection. + * + * @param $fetchmode int DB_FETCHMODE_ORDERED or + * DB_FETCHMODE_ASSOC, possibly bit-wise OR'ed with + * DB_FETCHMODE_FLIPPED. + * + * @see DB_FETCHMODE_ORDERED + * @see DB_FETCHMODE_ASSOC + * @see DB_FETCHMODE_FLIPPED + */ + + function setFetchMode( $fetchmode ) + { + switch( $fetchmode ) + { + case DB_FETCHMODE_ORDERED: + case DB_FETCHMODE_ASSOC: $this->fetchmode = $fetchmode; + + break; + + default: return $this->raiseError("invalid get mode"); + } + } // }}} // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). With + * PostgreSQL, this is emulated. + */ + + function prepare( $query ) + { + $tokens = split( "[\&\?]", $query ); + $token = 0; + $types = array(); + + for( $i = 0; $i < strlen( $query ); $i++ ) + { + switch( $query[ $i ] ) + { + case "?": $types[ $token++ ] = DB_PARAM_SCALAR; + + break; + + case "&": $types[ $token++ ] = DB_PARAM_OPAQUE; + + break; + } + } + + $this->prepare_tokens[] = &$tokens; + end( $this->prepare_tokens ); + + $k = key( $this->prepare_tokens ); + $this->prepare_types[ $k ] = $types; - /** - * Prepares a query for multiple execution with execute(). With - * PostgreSQL, this is emulated. - */ - function prepare($query) { - $tokens = split('[\&\?]', $query); - $token = 0; - $types = array(); - for ($i = 0; $i < strlen($query); $i++) { - switch ($query[$i]) { - case '?': - $types[$token++] = DB_PARAM_SCALAR; - break; - case '&': - $types[$token++] = DB_PARAM_OPAQUE; - break; - } - } - $this->prepare_tokens[] = &$tokens; - end($this->prepare_tokens); - $k = key($this->prepare_tokens); - $this->prepare_types[$k] = $types; - return $k; - } + return $k; + } // }}} // {{{ execute_emulate_query() - /** - * @return a string containing the real query run when emulating - * prepare/execute. A DB error code is returned on failure. - */ - function execute_emulate_query($stmt, $data = false) { - $p = &$this->prepare_tokens; - $stmt = (int)$this->prepare_maxstmt++; - if (!isset($this->prepare_tokens[$stmt]) || - !is_array($this->prepare_tokens[$stmt]) || - !sizeof($this->prepare_tokens[$stmt])) { - return $this->raiseError(DB_ERROR_INVALID); - } - $qq = &$this->prepare_tokens[$stmt]; - $qp = sizeof($qq) - 1; - if ((!$data && $qp > 0) || - (!is_array($data) && $qp > 1) || - (is_array($data) && $qp > sizeof($data))) { - return $this->raiseError(DB_ERROR_NEED_MORE_DATA); - } - $realquery = $qq[0]; - for ($i = 0; $i < $qp; $i++) { - if ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) { - if (is_array($data)) { - $fp = fopen($data[$i], "r"); - } else { - $fp = fopen($data, "r"); - } - $pdata = ''; - if ($fp) { - while (($buf = fread($fp, 4096)) != false) { - $pdata .= $buf; - } - } - } else { - if (is_array($data)) { - $pdata = &$data[$i]; - } else { - $pdata = &$data; - } - } - $realquery .= "'" . $this->quoteString($pdata) . "'"; - $realquery .= $qq[$i + 1]; - } - return $realquery; - } + /** + * @return a string containing the real query run when emulating + * prepare/execute. A DB error code is returned on failure. + */ + + function execute_emulate_query( $stmt, $data = false ) + { + $p = &$this->prepare_tokens; + $stmt = (int)$this->prepare_maxstmt++; + + if( !isset( $this->prepare_tokens[ $stmt ] ) || + !is_array( $this->prepare_tokens[ $stmt ] ) || + !sizeof( $this->prepare_tokens[ $stmt ] ) ) + { + return $this->raiseError( DB_ERROR_INVALID ); + } + + $qq = &$this->prepare_tokens[ $stmt ]; + $qp = sizeof($qq) - 1; + + if( ( !$data && $qp > 0 ) || + ( !is_array( $data ) && $qp > 1 ) || + ( is_array( $data ) && $qp > sizeof( $data ) ) ) + { + return $this->raiseError( DB_ERROR_NEED_MORE_DATA ); + } + + $realquery = $qq[ 0 ]; + + for( $i = 0; $i < $qp; $i++ ) + { + if( $this->prepare_types[ $stmt ][ $i ] == DB_PARAM_OPAQUE ) + { + if( is_array( $data ) ) + { + $fp = fopen( $data[ $i ], "r" ); + } + + else + { + $fp = fopen( $data, "r" ); + } + + $pdata = ""; + + if( $fp ) + { + while( ( $buf = fread( $fp, 4096 ) ) != false ) + { + $pdata .= $buf; + } + } + } + + else + { + if( is_array( $data ) ) + { + $pdata = &$data[$i]; + } + + else + { + $pdata = &$data; + } + } + + $realquery .= "'" . $this->quoteString( $pdata ) . "'"; + $realquery .= $qq[ $i + 1 ]; + } - // }}} + return $realquery; + } + // }}} // {{{ executeMultiple() - /** - * This function does several execute() calls on the same - * statement handle. $data 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. - */ - function executeMultiple($stmt, &$data) { - for ($i = 0; $i < sizeof($data); $i++) { - $res = $this->execute($stmt, $data[$i]); - if (DB::isError($res)) { - return $res; - } - } - return DB_OK; - } + /** + * This function does several execute() calls on the same + * statement handle. $data 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. + */ + + function executeMultiple( $stmt, &$data ) + { + for( $i = 0; $i < sizeof( $data ); $i++ ) + { + $res = $this->execute( $stmt, $data[ $i ] ); + + if( DB::isError( $res ) ) + { + return $res; + } + } + return DB_OK; + } + // }}} // {{{ 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 $query the SQL query + * @param $params if supplied, prepare/execute will be used + * with this array as execute parameters + * @access public + */ + + function &getOne( $query, $params = array() ) + { + if( sizeof( $params ) > 0 ) + { + $sth = $this->prepare( $query ); + + if( DB::isError( $sth ) ) + { + return $sth; + } + + $res = $this->execute( $sth, $params ); + } + + else + { + $res = $this->simpleQuery( $query ); + } + + if( DB::isError( $res ) ) + { + return $res; + } + + $row = $this->fetchRow( $res, DB_FETCHMODE_ORDERED ); + + if( DB::isError( $row ) ) + { + return $row; + } + + $ret = &$row[ 0 ]; + $this->freeResult( $res ); + + if( isset( $sth ) ) + { + $this->freeResult( $sth ); + } - /** - * 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 $query the SQL query - * @param $params if supplied, prepare/execute will be used - * with this array as execute parameters - * @access public - */ - function &getOne($query, $params = array()) { - if (sizeof($params) > 0) { - $sth = $this->prepare($query); - if (DB::isError($sth)) { - return $sth; - } - $res = $this->execute($sth, $params); - } else { - $res = $this->simpleQuery($query); - } - if (DB::isError($res)) { - return $res; - } - $row = $this->fetchRow($res, DB_FETCHMODE_ORDERED); - if (DB::isError($row)) { - return $row; - } - $ret = &$row[0]; - $this->freeResult($res); - if (isset($sth)) { - $this->freeResult($sth); - } - return $ret; - } + return $ret; + } // }}} // {{{ getRow() - /** - * Fetch the first row of data returned from a query. Takes care - * of doing the query and freeing the results when finished. - * - * @param $query the SQL query - * @access public - * @return array the first row of results as an array indexed from - * 0, or a DB error code. - */ - function &getRow($query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array()) { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->fetchmode; - } - if (sizeof($params) > 0) { - $sth = $this->prepare($query); - if (DB::isError($sth)) { - return $sth; - } - $res = $this->execute($sth, $params); - } else { - $res = $this->simpleQuery($query); - } - if (DB::isError($res)) { - return $res; - } - $row = $this->fetchRow($res, $fetchmode); - if (DB::isError($row)) { - return $row; - } - $this->freeResult($res); - if (isset($sth)) { - $this->freeResult($sth); - } - return $row; - } + /** + * Fetch the first row of data returned from a query. Takes care + * of doing the query and freeing the results when finished. + * + * @param $query the SQL query + * @access public + * @return array the first row of results as an array indexed from + * 0, or a DB error code. + */ + + function &getRow( $query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array() ) + { + if( $fetchmode == DB_FETCHMODE_DEFAULT ) + { + $fetchmode = $this->fetchmode; + } + + if( sizeof( $params ) > 0 ) + { + $sth = $this->prepare( $query ); + + if( DB::isError( $sth ) ) + { + return $sth; + } + + $res = $this->execute( $sth, $params ); + } + + else + { + $res = $this->simpleQuery( $query ); + } + + if( DB::isError( $res ) ) + { + return $res; + } + + $row = $this->fetchRow( $res, $fetchmode ); + + if( DB::isError( $row ) ) + { + return $row; + } + + $this->freeResult( $res ); + + if( isset( $sth ) ) + { + $this->freeResult( $sth ); + } + return $row; + } + // }}} // {{{ getCol() - /** - * Fetch a single column from a result set and return it as an - * indexed array. - * - * @param $query the SQL query - * - * @param $col which column to return (integer [column number, - * starting at 0] or string [column name]) - * - * @access public - * - * @return array an indexed array with the data from the first - * row at index 0, or a DB error code. - */ - function &getCol($query, $col = 0, $params = array()) { - if (sizeof($params) > 0) { - $sth = $this->prepare($query); - if (DB::isError($sth)) { - return $sth; - } - $res = $this->execute($sth, $params); - } else { - $res = $this->simpleQuery($query); - } - if (DB::isError($res)) { - return $res; - } - $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; - $ret = array(); - while ($row = $this->fetchRow($res, $fetchmode)) { - if (DB::isError($row)) { - $ret = $row; - break; - } - $ret[] = $row[$col]; - } - $this->freeResult($res); - if (isset($sth)) { - $this->freeResult($sth); - } - return $ret; - } + /** + * Fetch a single column from a result set and return it as an + * indexed array. + * + * @param $query the SQL query + * + * @param $col which column to return (integer [column number, + * starting at 0] or string [column name]) + * + * @access public + * + * @return array an indexed array with the data from the first + * row at index 0, or a DB error code. + */ + + function &getCol( $query, $col = 0, $params = array() ) + { + if( sizeof( $params ) > 0 ) + { + $sth = $this->prepare( $query ); + + if( DB::isError( $sth ) ) + { + return $sth; + } + + $res = $this->execute( $sth, $params ); + } + + else + { + $res = $this->simpleQuery( $query ); + } + + if( DB::isError( $res ) ) + { + return $res; + } + + $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; + $ret = array(); + + while( $row = $this->fetchRow( $res, $fetchmode ) ) + { + if( DB::isError( $row ) ) + { + $ret = $row; + break; + } + + $ret[] = $row[ $col ]; + } + + $this->freeResult( $res ); + + if( isset( $sth ) ) + { + $this->freeResult( $sth ); + } + + return $ret; + } // }}} // {{{ getAssoc() + + /** + * Fetch the entire result set of a query and return it as an + * associative array using the first column as the key. + * + * @param $query the SQL query + * + * @param $force_array (optional) 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. + * + * @access public + * + * @return array associative array with results from the query. + * 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 DB error code is + * returned on errors. If the result set contains fewer than two + * columns, a DB_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 mydate') returns: + * array( + * '1' => array('one', '944679408'), + * '2' => array('two', '944679408'), + * '3' => array('three', '944679408') + * ) + * + * Keep in mind that database functions in PHP usually return string + * values for results regardless of the database's internal type. + */ + + function &getAssoc( $query, $force_array = false, $params = array() ) + { + if( sizeof( $params ) > 0 ) + { + $sth = $this->prepare( $query ); + + if( DB::isError( $sth ) ) + { + return $sth; + } + + $res = $this->execute( $sth, $params ); + } + + else + { + $res = $this->simpleQuery( $query ); + } + + if( DB::isError( $res ) ) + { + return $res; + } + + $cols = $this->numCols( $res ); + + if( $cols < 2 ) + { + return $this->raiseError( DB_ERROR_TRUNCATED ); + } + + $results = array(); + + if( $cols > 2 || $force_array ) + { + // return array values + // XXX this part can be optimized + while( ( $row = $this->fetchRow( $res, DB_FETCHMODE_ORDERED ) ) && !DB::isError( $row ) ) + { + reset($row); + + // we copy the row of data into a new array + // to get indices running from 0 again + $results[ $row[ 0 ] ] = array_slice( $row, 1 ); + } + } + + else + { + // return scalar values + while( ( $row = $this->fetchRow( $res ) ) && !DB::isError( $row ) ) + { + $results[ $row[ 0 ] ] = $row[ 1 ]; + } + } + + $this->freeResult( $res ); + + if( isset( $sth ) ) + { + $this->freeResult( $sth ); + } + + return $results; + } + + // }}} + // {{{ getAll() + + /** + * Fetch all the rows returned from a query. + * + * @param $query the SQL query + * @access public + * @return array an nested array, or a DB error + */ + + function &getAll( $query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array() ) + { + if( $fetchmode == DB_FETCHMODE_DEFAULT ) + { + $fetchmode = $this->fetchmode; + } + + if( sizeof( $params ) > 0 ) + { + $sth = $this->prepare( $query ); + + if( DB::isError( $sth ) ) + { + return $sth; + } + + $res = $this->execute( $sth, $params ); + } + + else + { + $res = $this->simpleQuery( $query ); + } + + if( DB::isError( $res ) ) + { + return $res; + } + + $results = array(); + + while( ( $row = $this->fetchRow( $res, $fetchmode ) ) && !DB::isError( $row ) ) + { + if( $fetchmode & DB_FETCHMODE_FLIPPED ) + { + foreach( $row as $key => $val ) + { + $results[ $key][] = $val; + } + } + + else + { + $results[] = $row; + } + } + + $this->freeResult( $res ); + + if( isset( $sth ) ) + { + $this->freeResult( $sth ); + } - /** - * Fetch the entire result set of a query and return it as an - * associative array using the first column as the key. - * - * @param $query the SQL query - * - * @param $force_array (optional) 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. - * - * @access public - * - * @return array associative array with results from the query. - * 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 DB error code is - * returned on errors. If the result set contains fewer than two - * columns, a DB_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 mydate') returns: - * array( - * '1' => array('one', '944679408'), - * '2' => array('two', '944679408'), - * '3' => array('three', '944679408') - * ) - * - * Keep in mind that database functions in PHP usually return string - * values for results regardless of the database's internal type. - */ - function &getAssoc($query, $force_array = false, $params = array()) { - if (sizeof($params) > 0) { - $sth = $this->prepare($query); - if (DB::isError($sth)) { - return $sth; - } - $res = $this->execute($sth, $params); - } else { - $res = $this->simpleQuery($query); - } - if (DB::isError($res)) { - return $res; - } - $cols = $this->numCols($res); - if ($cols < 2) { - return $this->raiseError(DB_ERROR_TRUNCATED); - } - $results = array(); - if ($cols > 2 || $force_array) { - // return array values - // XXX this part can be optimized - while (($row = $this->fetchRow($res, DB_FETCHMODE_ORDERED)) - && !DB::isError($row)) { - reset($row); - // we copy the row of data into a new array - // to get indices running from 0 again - $results[$row[0]] = array_slice($row, 1); - } - } else { - // return scalar values - while (($row = $this->fetchRow($res)) && !DB::isError($row)) { - $results[$row[0]] = $row[1]; - } - } - $this->freeResult($res); - if (isset($sth)) { - $this->freeResult($sth); - } - return $results; - } - - // }}} - // {{{ getAll() - - /** - * Fetch all the rows returned from a query. - * - * @param $query the SQL query - * @access public - * @return array an nested array, or a DB error - */ - function &getAll($query, $fetchmode = DB_FETCHMODE_DEFAULT, $params = array()) { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->fetchmode; - } - if (sizeof($params) > 0) { - $sth = $this->prepare($query); - if (DB::isError($sth)) { - return $sth; - } - $res = $this->execute($sth, $params); - } else { - $res = $this->simpleQuery($query); - } - if (DB::isError($res)) { - return $res; - } - $results = array(); - while (($row = $this->fetchRow($res, $fetchmode)) && !DB::isError($row)) { - if ($fetchmode & DB_FETCHMODE_FLIPPED) { - foreach ($row as $key => $val) { - $results[$key][] = $val; - } - } else { - $results[] = $row; - } - } - $this->freeResult($res); - if (isset($sth)) { - $this->freeResult($sth); - } - return $results; - } - - // }}} -} - -// Local variables: -// tab-width: 4 -// c-basic-offset: 4 -// End: + return $results; + } + + // }}} + } ?> Index: php4/pear/DB/mysql.php diff -u php4/pear/DB/mysql.php:1.28 php4/pear/DB/mysql.php:1.29 --- php4/pear/DB/mysql.php:1.28 Sun Oct 15 02:02:54 2000 +++ php4/pear/DB/mysql.php Sun Dec 3 22:56:29 2000 @@ -28,417 +28,527 @@ // be registered here. // -require_once 'DB/common.php'; + require_once "DB/common.php"; -class DB_mysql extends DB_common { + class DB_mysql extends DB_common + { // {{{ properties - var $connection; - var $phptype, $dbsyntax; - var $prepare_tokens = array(); - var $prepare_types = array(); + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); // }}} - // {{{ constructor - /** - * DB_mysql constructor. - * - * @access public - */ - function DB_mysql() { - $this->phptype = 'mysql'; - $this->dbsyntax = 'mysql'; - $this->features = array( - 'prepare' => false, - 'pconnect' => true, - 'transactions' => false - ); - $this->errorcode_map = array( - 1004 => DB_ERROR_CANNOT_CREATE, - 1005 => DB_ERROR_CANNOT_CREATE, - 1006 => DB_ERROR_CANNOT_CREATE, - 1007 => DB_ERROR_ALREADY_EXISTS, - 1008 => DB_ERROR_CANNOT_DROP, - 1046 => DB_ERROR_NODBSELECTED, - 1146 => DB_ERROR_NOSUCHTABLE, - 1064 => DB_ERROR_SYNTAX, - 1054 => DB_ERROR_NOSUCHFIELD, - 1062 => DB_ERROR_ALREADY_EXISTS, - 1051 => DB_ERROR_NOSUCHTABLE, - 1100 => DB_ERROR_NOT_LOCKED, - 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, - ); - } + /** + * DB_mysql constructor. + * + * @access public + */ + + function DB_mysql() + { + $this->phptype = "mysql"; + $this->dbsyntax = "mysql"; + $this->features = array( + "prepare" => false, + "pconnect" => true, + "transactions" => false + ); + + $this->errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1046 => DB_ERROR_NODBSELECTED, + 1146 => DB_ERROR_NOSUCHTABLE, + 1064 => DB_ERROR_SYNTAX, + 1054 => DB_ERROR_NOSUCHFIELD, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + ); + } // }}} - // {{{ connect() - /** - * 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 - * @access public - * @return int DB_OK on success, a DB error on failure - */ - function connect(&$dsn, $persistent = false) { - if (is_array($dsn)) { - $dsninfo = &$dsn; - } else { - $dsninfo = DB::parseDSN($dsn); - } - if (!$dsninfo || !$dsninfo['phptype']) { - return $this->raiseError(); // XXX ERRORMSG - } - $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost'; - $user = $dsninfo['username']; - $pw = $dsninfo['password']; - $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect'; - if ($dbhost && $user && $pw) { - $conn = $connect_function($dbhost, $user, $pw); - } elseif ($dbhost && $user) { - $conn = $connect_function($dbhost, $user); - } elseif ($dbhost) { - $conn = $connect_function($dbhost); - } else { - $conn = false; - } - if ($conn == false) { - return $this->raiseError(); // XXX ERRORMSG - } - if ($dsninfo['database']) { - if (!mysql_select_db($dsninfo['database'], $conn)) { - return $this->raiseError(); // XXX ERRORMSG - } - } - $this->connection = $conn; - return DB_OK; - } + /** + * 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 + * @access public + * @return int DB_OK on success, a DB error on failure + */ + + function connect( &$dsn, $persistent = false ) + { + if( is_array( $dsn ) ) + { + $dsninfo = &$dsn; + } + + else + { + $dsninfo = DB::parseDSN( $dsn ); + } + + if( !$dsninfo || !$dsninfo[ "phptype" ] ) + { + return $this->raiseError(); // XXX ERRORMSG + } + + $dbhost = $dsninfo[ "hostspec" ] ? $dsninfo[ "hostspec" ] : "localhost"; + $user = $dsninfo[ "username" ]; + $pw = $dsninfo[ "password" ]; + + $connect_function = $persistent ? "mysql_pconnect" : "mysql_connect"; + + if( $dbhost && $user && $pw ) + { + $conn = $connect_function( $dbhost, $user, $pw ); + } + + elseif( $dbhost && $user ) + { + $conn = $connect_function( $dbhost, $user ); + } + + elseif( $dbhost ) + { + $conn = $connect_function( $dbhost ); + } + + else + { + $conn = false; + } + + if( $conn == false ) + { + return $this->raiseError(); // XXX ERRORMSG + } + + if( $dsninfo[ "database" ] ) + { + if( !mysql_select_db( $dsninfo[ "database" ], $conn ) ) + { + return $this->raiseError(); // XXX ERRORMSG + } + } + + $this->connection = $conn; + return DB_OK; + } // }}} // {{{ disconnect() - /** - * Log out and disconnect from the database. - * - * @access public - * - * @return bool TRUE on success, FALSE if not connected. - */ - function disconnect() { - return mysql_close($this->connection); // XXX ERRORMSG - } + /** + * Log out and disconnect from the database. + * + * @access public + * + * @return bool TRUE on success, FALSE if not connected. + */ + + function disconnect() + { + return mysql_close( $this->connection ); // XXX ERRORMSG + } // }}} // {{{ query() - /** - * Send a query to MySQL and return the results as a DB_result object. - * - * @param $query the SQL query - * - * @access public - * - * @return object a DB_result object on success, a DB error - * on failure - */ - function &query($query) { - $this->last_query = $query; - $result = @mysql_query($query, $this->connection); - if (!$result) { - return $this->raiseError($this->errorCode(mysql_errno($this->connection))); - } - // Determine which queries that should return data, and which - // should return an error code only. - if (preg_match('/(SELECT|SHOW)/i', $query)) { - $resultObj = new DB_result($this, $result); - return $resultObj; - } else { - return DB_OK; - } - } + /** + * Send a query to MySQL and return the results as a DB_result object. + * + * @param $query the SQL query + * + * @access public + * + * @return object a DB_result object on success, a DB error + * on failure + */ + + function &query( $query ) + { + $this->last_query = $query; + + $result = @mysql_query( $query, $this->connection ); + + if( !$result ) + { + return $this->raiseError( $this->errorCode( mysql_errno( $this->connection ) ) ); + } + + // Determine which queries that should return data, and which + // should return an error code only. + if( preg_match( "/(SELECT|SHOW)/i", $query ) ) + { + return new DB_result( $this, $result ); + } + + else + { + return DB_OK; + } + } - // }}} + // }}} // {{{ simpleQuery() - /** - * Send a query to MySQL and return the results as a MySQL resource - * identifier. - * - * @param $query the SQL query - * - * @access public - * - * @return int returns a valid MySQL result for successful SELECT - * queries, DB_OK for other successful queries. A DB error is - * returned on failure. - */ - function simpleQuery($query) { - $this->last_query = $query; - $result = mysql_query($query, $this->connection); - if (!$result) { - return $this->raiseError($this->errorCode(mysql_errno($this->connection))); - } - // Determine which queries that should return data, and which - // should return an error code only. - if (preg_match('/(SELECT|SHOW)/i', $query)) { - return $result; - } else { - return DB_OK; - } - } + /** + * Send a query to MySQL and return the results as a MySQL resource + * identifier. + * + * @param $query the SQL query + * + * @access public + * + * @return int returns a valid MySQL result for successful SELECT + * queries, DB_OK for other successful queries. A DB error is + * returned on failure. + */ + + function simpleQuery( $query ) + { + $this->last_query = $query; + $result = mysql_query( $query, $this->connection ); + + if( !$result ) + { + return $this->raiseError( $this->errorCode( mysql_errno( $this->connection ) ) ); + } + + // Determine which queries that should return data, and which + // should return an error code only. + if( preg_match( "/(SELECT|SHOW)/i", $query ) ) + { + return $result; + } + + else + { + return DB_OK; + } + } - // }}} + // }}} // {{{ fetchRow() + + /** + * Fetch a row and return as array. + * + * @param $result MySQL result identifier + * @param $fetchmode how the resulting array should be indexed + * + * @access public + * + * @return mixed an array on success, a DB error on failure, NULL + * if there is no more data + */ + + function &fetchRow( $result, $fetchmode = DB_FETCHMODE_DEFAULT ) + { + if( $fetchmode == DB_FETCHMODE_DEFAULT ) + { + $fetchmode = $this->fetchmode; + } + + if( $fetchmode & DB_FETCHMODE_ASSOC ) + { + $row = mysql_fetch_array( $result, MYSQL_ASSOC ); + } + + else + { + $row = mysql_fetch_row( $result ); + } + + if( !$row ) + { + $errno = mysql_errno( $this->connection ); + + if( !$errno ) + { + return NULL; + } + + return $this->raiseError( $this->errorCode( $errno ) ); + } - /** - * Fetch a row and return as array. - * - * @param $result MySQL result identifier - * @param $fetchmode how the resulting array should be indexed - * - * @access public - * - * @return mixed an array on success, a DB error on failure, NULL - * if there is no more data - */ - function &fetchRow($result, $fetchmode = DB_FETCHMODE_DEFAULT) { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->fetchmode; - } - if ($fetchmode & DB_FETCHMODE_ASSOC) { - $row = mysql_fetch_array($result, MYSQL_ASSOC); - } else { - $row = mysql_fetch_row($result); - } - if (!$row) { - $errno = mysql_errno($this->connection); - if (!$errno) { - return NULL; - } - return $this->raiseError($this->errorCode($errno)); - } - return $row; - } + return $row; + } - // }}} + // }}} // {{{ fetchInto() - /** - * Fetch a row and insert the data into an existing array. - * - * @param $result MySQL result identifier - * @param $arr (reference) array where data from the row is stored - * @param $fetchmode how the array data should be indexed - * - * @access public - * - * @return int DB_OK on success, a DB error on failure - */ - function fetchInto($result, &$arr, $fetchmode = DB_FETCHMODE_DEFAULT) { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->fetchmode; - } - if ($fetchmode & DB_FETCHMODE_ASSOC) { - $arr = mysql_fetch_array($result, MYSQL_ASSOC); - } else { - $arr = mysql_fetch_row($result); - } - if (!$arr) { - $errno = mysql_errno($this->connection); - if (!$errno) { - return NULL; - } - return $this->raiseError($this->errorCode($errno)); - } - return DB_OK; - } + /** + * Fetch a row and insert the data into an existing array. + * + * @param $result MySQL result identifier + * @param $arr (reference) array where data from the row is stored + * @param $fetchmode how the array data should be indexed + * + * @access public + * + * @return int DB_OK on success, a DB error on failure + */ + + function fetchInto($result, &$arr, $fetchmode = DB_FETCHMODE_DEFAULT ) + { + if( $fetchmode == DB_FETCHMODE_DEFAULT ) + { + $fetchmode = $this->fetchmode; + } + + if( $fetchmode & DB_FETCHMODE_ASSOC ) + { + $arr = mysql_fetch_array( $result, MYSQL_ASSOC ); + } + + else + { + $arr = mysql_fetch_row( $result ); + } + + if( !$arr ) + { + $errno = mysql_errno( $this->connection ); + + if( !$errno ) + { + return NULL; + } - // }}} + return $this->raiseError( $this->errorCode( $errno ) ); + } + + return DB_OK; + } + + // }}} // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result MySQL result identifier or DB statement identifier + * + * @access public + * + * @return bool TRUE on success, FALSE if $result is invalid + */ + + function freeResult( $result ) + { + if( is_resource( $result ) ) + { + return mysql_free_result( $result ); + } + + if( !isset( $this->prepare_tokens[ $result ] ) ) + { + return false; + } - /** - * Free the internal resources associated with $result. - * - * @param $result MySQL result identifier or DB statement identifier - * - * @access public - * - * @return bool TRUE on success, FALSE if $result is invalid - */ - function freeResult($result) { - if (is_resource($result)) { - return mysql_free_result($result); - } - if (!isset($this->prepare_tokens[$result])) { - return false; - } - unset($this->prepare_tokens[$result]); - unset($this->prepare_types[$result]); - return true; - } + unset( $this->prepare_tokens[ $result ] ); + unset( $this->prepare_types[ $result ] ); - // }}} + return true; + } + + // }}} // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result MySQL result identifier + * + * @access public + * + * @return int the number of columns per row in $result + */ + + function numCols( $result ) + { + $cols = mysql_num_fields( $result ); + + if( !$cols ) + { + return $this->raiseError( $this->errorCode( mysql_errno( $this->connection ) ) ); + } - /** - * Get the number of columns in a result set. - * - * @param $result MySQL result identifier - * - * @access public - * - * @return int the number of columns per row in $result - */ - function numCols($result) { - $cols = mysql_num_fields($result); - if (!$cols) { - return $this->raiseError($this->errorCode(mysql_errno($this->connection))); - } - return $cols; - } + return $cols; + } // }}} // {{{ errorNative() - /** - * Get the native error code of the last error (if any) that - * occured on the current connection. - * - * @access public - * - * @return int native MySQL error code - */ - function errorNative() { - return mysql_errno($this->connection); - } + /** + * Get the native error code of the last error (if any) that + * occured on the current connection. + * + * @access public + * + * @return int native MySQL error code + */ + + function errorNative() + { + return mysql_errno( $this->connection ); + } // }}} // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). With + * MySQL, this is emulated. + * + * @param $query the SQL query to prepare for execution. The + * characters "?" and "&" have special meanings. "?" is a scalar + * placeholder, the value provided for it when execute()ing is + * inserted as-is. "&" is an opaque placeholder, the value + * provided on execute() is a file name, and the contents of that + * file will be used in the query. + * + * @access public + * + * @return int identifier for this prepared query + */ + + function prepare( $query ) + { + $tokens = split( "[\&\?]", $query ); + $token = 0; + $types = array(); + + for( $i = 0; $i < strlen( $query ); $i++ ) + { + switch( $query[ $i ] ) + { + case "?": $types[ $token++ ] = DB_PARAM_SCALAR; + + break; + case '&': $types[ $token++ ] = DB_PARAM_OPAQUE; + + break; + } + } - /** - * Prepares a query for multiple execution with execute(). With - * MySQL, this is emulated. - * - * @param $query the SQL query to prepare for execution. The - * characters "?" and "&" have special meanings. "?" is a scalar - * placeholder, the value provided for it when execute()ing is - * inserted as-is. "&" is an opaque placeholder, the value - * provided on execute() is a file name, and the contents of that - * file will be used in the query. - * - * @access public - * - * @return int identifier for this prepared query - */ - function prepare($query) { - $tokens = split('[\&\?]', $query); - $token = 0; - $types = array(); - for ($i = 0; $i < strlen($query); $i++) { - switch ($query[$i]) { - case '?': - $types[$token++] = DB_PARAM_SCALAR; - break; - case '&': - $types[$token++] = DB_PARAM_OPAQUE; - break; - } - } - $this->prepare_tokens[] = &$tokens; - end($this->prepare_tokens); - $k = key($this->prepare_tokens); - $this->prepare_types[$k] = $types; - return $k; - } + $this->prepare_tokens[] = &$tokens; + end( $this->prepare_tokens ); + $k = key( $this->prepare_tokens ); + $this->prepare_types[ $k ] = $types; + + return $k; + } + // }}} // {{{ execute() - /** - * Executes a prepared query and substitutes placeholders with - * provided values. - * - * @return int returns a MySQL result resource for successful - * SELECT queries, DB_OK for other successful queries. A DB error - * is returned on failure. - * - * @see DB_mysql::prepare - */ - function execute($stmt, $data = false) { - $realquery = $this->execute_emulate_query($stmt, $data); - $this->last_query = $realquery; - $result = mysql_query($realquery, $this->connection); - if (!$result) { - return $this->raiseError($this->errorCode(mysql_errno($this->connection))); - } - if (preg_match('/(SELECT|SHOW)/i', $realquery)) { - return $result; - } else { - return DB_OK; - } - } + /** + * Executes a prepared query and substitutes placeholders with + * provided values. + * + * @return int returns a MySQL result resource for successful + * SELECT queries, DB_OK for other successful queries. A DB error + * is returned on failure. + * + * @see DB_mysql::prepare + */ + + function execute( $stmt, $data = false ) + { + $realquery = $this->execute_emulate_query( $stmt, $data ); + $this->last_query = $realquery; + + $result = mysql_query( $realquery, $this->connection ); + + if( !$result ) + { + return $this->raiseError( $this->errorCode( mysql_errno( $this->connection ) ) ); + } + + if( preg_match( "/(SELECT|SHOW)/i", $realquery ) ) + { + return $result; + } + + else + { + return DB_OK; + } + } // }}} // {{{ autoCommit() - /** - * Enable/disable automatic commits [not supported by MySQL] - * - * @access public - * - * @return object DB error code (not capable) - */ - function autoCommit($onoff = false) { - return $this->raiseError(DB_ERROR_NOT_CAPABLE); - } + /** + * Enable/disable automatic commits [not supported by MySQL] + * + * @access public + * + * @return object DB error code (not capable) + */ + + function autoCommit( $onoff = false ) + { + return $this->raiseError( DB_ERROR_NOT_CAPABLE ); + } // }}} // {{{ commit() - /** - * Commit transactions on the current connection [not supported by MySQL] - * - * @access public - * - * @return object DB error code (not capable) - */ - function commit() { - return $this->raiseError(DB_ERROR_NOT_CAPABLE); - } + /** + * Commit transactions on the current connection [not supported by MySQL] + * + * @access public + * + * @return object DB error code (not capable) + */ + + function commit() + { + return $this->raiseError( DB_ERROR_NOT_CAPABLE ); + } // }}} // {{{ rollback() - /** - * Roll back all uncommitted transactions on the current connection. - * [not supported by MySQL] - * - * @access public - * - * @return object DB error code (not capable) - */ - function rollback() { - return $this->raiseError(DB_ERROR_NOT_CAPABLE); - } + /** + * Roll back all uncommitted transactions on the current connection. + * [not supported by MySQL] + * + * @access public + * + * @return object DB error code (not capable) + */ + + function rollback() + { + return $this->raiseError( DB_ERROR_NOT_CAPABLE ); + } // }}} - // TODO/wishlist: - // simpleFetch - // simpleGet - // affectedRows + // TODO/wishlist: + // simpleFetch + // simpleGet + // affectedRows // longReadlen // binmode -} - -// Local variables: -// tab-width: 4 -// c-basic-offset: 4 -// End: + } ?> Index: php4/pear/DB/error.php +++ php4/pear/DB/error.php <?php // // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000 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 | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Stig Bakken <ssb@fast.no> | // | | // +----------------------------------------------------------------------+ // // $Id: error.php,v 1.1 2000/12/04 06:56:29 sbergmann Exp $ // /** * DB_Error implements a class for reporting portable database error * messages. * * @author Stig Bakken <ssb@fast.no> */ class DB_Error extends PEAR_Error { /** * DB_Error constructor. * * @param $code mixed DB error code, or string with error message. * @param $mode int what "error mode" to operate in * @param $level what error level to use for $mode & PEAR_ERROR_TRIGGER * @param $debuginfo additional debug info, such as the last query * * @access public * * @see PEAR_Error */ function DB_Error( $code = DB_ERROR, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE, $debuginfo = null ) { if( is_int( $code ) ) { $this->PEAR_Error( "DB Error: " . DB::errorMessage( $code ), $code, $mode, $level, $debuginfo ); } else { $this->PEAR_Error( "DB Error: $code", 0, $mode, $level, $debuginfo ); } } } ?> Index: php4/pear/DB/result.php +++ php4/pear/DB/result.php <?php // // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000 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 | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Stig Bakken <ssb@fast.no> | // | | // +----------------------------------------------------------------------+ // // $Id: result.php,v 1.1 2000/12/04 06:56:29 sbergmann Exp $ // /** * This class implements a wrapper for a DB result set. * A new instance of this class will be returned by the DB implementation * after processing a query that returns data. * * @author Stig Bakken <ssb@fast.no> */ class DB_result { var $dbh; var $result; /** * DB_result constructor. * @param $dbh DB object reference * @param $result result resource id */ function DB_result( &$dbh, $result ) { $this->dbh = &$dbh; $this->result = $result; } /** * Fetch and return a row of data. * @return array a row of data, or false on error */ function fetchRow( $fetchmode = DB_FETCHMODE_DEFAULT ) { if( $fetchmode == DB_FETCHMODE_DEFAULT ) { $fetchmode = $this->dbh->fetchmode; } return $this->dbh->fetchRow( $this->result, $fetchmode ); } /** * Fetch a row of data into an existing array. * * @param $arr reference to data array * @return int error code */ function fetchInto( &$arr, $fetchmode = DB_FETCHMODE_DEFAULT ) { if( $fetchmode == DB_FETCHMODE_DEFAULT ) { $fetchmode = $this->dbh->fetchmode; } return $this->dbh->fetchInto( $this->result, $arr, $fetchmode ); } /** * Get the the number of columns in a result set. * * @return int the number of columns, or a DB error code */ function numCols() { return $this->dbh->numCols( $this->result ); } /** * Frees the resources allocated for this result set. * @return int error code */ function free() { $err = $this->dbh->freeResult( $this->result ); if( DB::isError( $err ) ) { return $err; } $this->result = false; return true; } } ?> Index: php4/pear/DB/warning.php +++ php4/pear/DB/warning.php <?php // // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000 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 | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Stig Bakken <ssb@fast.no> | // | | // +----------------------------------------------------------------------+ // // $Id: warning.php,v 1.1 2000/12/04 06:56:29 sbergmann Exp $ // /** * DB_Warning implements a class for reporting portable database * warning messages. * * @author Stig Bakken <ssb@fast.no> */ class DB_Warning extends PEAR_Error { /** * DB_Warning constructor. * * @param $code mixed DB error code, or string with error message. * @param $mode int what "error mode" to operate in * @param $level what error level to use for $mode == PEAR_ERROR_TRIGGER * @param $debuginfo additional debug info, such as the last query * * @access public * * @see PEAR_Error */ function DB_Warning( $code = DB_WARNING, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE, $debuginfo = null ) { if( is_int( $code ) ) { $this->PEAR_Error( "DB Warning: " . DB::errorMessage( $code ), $code, $mode, $level, $debuginfo ); } else { $this->PEAR_Error( "DB Warning: $code", 0, $mode, $level, $debuginfo ); } } } ?>
« previous php.cvs (#2911) next »