summaryrefslogtreecommitdiff
path: root/pear/DB.php
diff options
context:
space:
mode:
Diffstat (limited to 'pear/DB.php')
-rw-r--r--pear/DB.php520
1 files changed, 0 insertions, 520 deletions
diff --git a/pear/DB.php b/pear/DB.php
deleted file mode 100644
index 2e53f79e6d..0000000000
--- a/pear/DB.php
+++ /dev/null
@@ -1,520 +0,0 @@
-<?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$
-//
-// Database independent query interface.
-//
-
-require_once "PEAR.php";
-
-// {{{ Database independent error codes.
-
-/*
- * 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);
-
-/*
- * 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_READ_ONLY", -1000);
-
-// }}}
-// {{{ Prepare/execute parameter types
-
-/*
- * 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);
-
-// }}}
-// {{{ Binary data modes
-
-/*
- * 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);
-
-// }}}
-// {{{ Get modes: flags that control the layout of query result structures
-
-/**
- * Column data indexed by numbers, ordered from 0 and up
- */
-define('DB_GETMODE_ORDERED', 1);
-/**
- * Column data indexed by column names
- */
-define('DB_GETMODE_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_GETMODE_FLIPPED switches this order, so the first level of arrays
- * is the column name, and the second level the row number.
- */
-define('DB_GETMODE_FLIPPED', 4);
-
-/**
- * This constant DB's default get mode. It is possible to override by
- * defining in your scripts before including DB.
- */
-if (!defined('DB_GETMODE_DEFAULT')) {
- define('DB_GETMODE_DEFAULT', DB_GETMODE_ORDERED);
-}
-
-// }}}
-
-/**
- * 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 1.00
- * @author Stig Bakken <ssb@fast.no>
- * @since PHP 4.0
- */
-class DB {
- // {{{ factory()
-
- /**
- * 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;
- }
-
- // }}}
- // {{{ connect()
-
- /**
- * 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) {
- global $USED_PACKAGES;
-
- $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;
- }
-
- // }}}
- // {{{ apiVersion()
-
- /**
- * Return the DB API version
- *
- * @return int the DB API version number
- */
- function apiVersion() {
- return 1;
- }
-
- // }}}
- // {{{ isError()
-
- /**
- * 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) && is_subclass_of($value, "DB_Error");
- }
-
- // }}}
- // {{{ isWarning()
-
- /**
- * 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) && is_subclass_of($value, "DB_Warning");
- }
-
- // }}}
- // {{{ errorMessage()
-
- /**
- * 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_OK => "no error",
- DB_ERROR => "unknown error",
- DB_ERROR_SYNTAX => "syntax error",
- DB_ERROR_CONSTRAINT => "constraint violation",
- DB_ERROR_NOT_FOUND => "not found",
- DB_ERROR_ALREADY_EXISTS => "already exists",
- DB_ERROR_UNSUPPORTED => "not supported",
- DB_ERROR_MISMATCH => "mismatch",
- DB_ERROR_INVALID => "invalid",
- DB_ERROR_NOT_CAPABLE => "DB backend not capable",
- DB_ERROR_INVALID_NUMBER => "invalid number",
- DB_ERROR_INVALID_DATE => "invalid date or time",
- DB_ERROR_DIVZERO => "division by zero",
- DB_ERROR_NODBSELECTED => "no database selected",
- DB_ERROR_CANNOT_CREATE => "can not create",
- DB_ERROR_CANNOT_DELETE => "can not delete",
- DB_ERROR_CANNOT_DROP => "can not drop",
- DB_ERROR_NOSUCHTABLE => "no such table",
- DB_ERROR_NOSUCHFIELD => "no such field",
- DB_WARNING_READ_ONLY => "warning: read only"
- );
- }
- if (DB::isError($value)) {
- $value = $value->code;
- }
- return $errorMessages[$value];
- }
-
- // }}}
- // {{{ parseDSN()
-
- /**
- * 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[3];
- }
-
- if (preg_match('|^([^\+]+)\+(.*)$|', $dsn, $arr)) {
- $parsed['protocol'] = $arr[1];
- $dsn = $arr[2];
- }
-
- if (!$parsed['database'])
- $dsn = preg_replace('|/+$|', '', $dsn);
-
- $parsed['hostspec'] = $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 {
- // {{{ properties
-
- var $dbh;
- var $result;
-
- // }}}
- // {{{ DB_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;
- }
-
- // }}}
- // {{{ fetchRow()
-
- /**
- * Fetch and return a row of data.
- * @return array a row of data, or false on error
- */
- function fetchRow($getmode = DB_GETMODE_DEFAULT) {
- return $this->dbh->fetchRow($this->result, $getmode);
- }
-
- // }}}
- // {{{ fetchInto()
-
- /**
- * Fetch a row of data into an existing array.
- *
- * @param $arr reference to data array
- * @return int error code
- */
- function fetchInto(&$arr, $getmode = DB_GETMODE_DEFAULT) {
- return $this->dbh->fetchInto($this->result, $arr, $getmode);
- }
-
- // }}}
- // {{{ numCols()
-
- /**
- * 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);
- }
-
- // }}}
- // {{{ free()
-
- /**
- * 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;
- }
-
- // }}}
-}
-
-/**
- * DB_Error implements a class for reporting portable database error
- * messages.
- *
- * @author Stig Bakken <ssb@fast.no>
- */
-class DB_Error extends PEAR_Error {
- function DB_Error($code = DB_ERROR,
- $mode = PEAR_ERROR_RETURN,
- $level = E_USER_NOTICE) {
- $this->PEAR_Error("DB Error: " . DB::errorMessage($code), $code, $mode, $level);
- }
-}
-
-/**
- * DB_Warning implements a class for reporting portable database
- * warning messages.
- *
- * @author Stig Bakken <ssb@fast.no>
- */
-class DB_Warning extends PEAR_Error {
- function DB_Error($code = DB_WARNING,
- $mode = PEAR_ERROR_RETURN,
- $level = E_USER_NOTICE) {
- $this->PEAR_Error("DB Warning: " . DB::errorMessage($code), $code, $mode, $level);
- }
-}
-
-// Local variables:
-// tab-width: 4
-// c-basic-offset: 4
-// End:
-?>