db.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 1,115 行 · 第 1/3 页

SVN-BASE
1,115
字号
            @include_once "DB/${type}.php";        }        $classname = "DB_${type}";        if (!class_exists($classname)) {            $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,                                    "Unable to include the DB/{$type}.php file for `$dsn'",                                    'DB_Error', true);            return $tmp;        }        @$obj =& new $classname;        foreach ($options as $option => $value) {            $test = $obj->setOption($option, $value);            if (DB::isError($test)) {                return $test;            }        }        $err = $obj->connect($dsninfo, $obj->getOption('persistent'));        if (DB::isError($err)) {            $err->addUserInfo($dsn);            return $err;        }        return $obj;    }    // }}}    // {{{ apiVersion()    /**     * Return the DB API version     *     * @return int the DB API version number     *     * @access public     */    function apiVersion()    {        return 2;    }    // }}}    // {{{ isError()    /**     * Tell whether a result code from a DB method is an error     *     * @param int $value result code     *     * @return bool whether $value is an error     *     * @access public     */    function isError($value)    {        return is_a($value, 'DB_Error');    }    // }}}    // {{{ isConnection()    /**     * Tell whether a value is a DB connection     *     * @param mixed $value value to test     *     * @return bool whether $value is a DB connection     *     * @access public     */    function isConnection($value)    {        return (is_object($value) &&                is_subclass_of($value, 'db_common') &&                method_exists($value, 'simpleQuery'));    }    // }}}    // {{{ isManip()    /**     * Tell whether a query is a data manipulation query (insert,     * update or delete) or a data definition query (create, drop,     * alter, grant, revoke).     *     * @access public     *     * @param string $query the query     *     * @return boolean whether $query is a data manipulation query     */    function isManip($query)    {        $manips = 'INSERT|UPDATE|DELETE|LOAD DATA|'.'REPLACE|CREATE|DROP|'.                  'ALTER|GRANT|REVOKE|'.'LOCK|UNLOCK';        if (preg_match('/^\s*"?('.$manips.')\s+/i', $query)) {            return true;        }        return false;    }    // }}}    // {{{ errorMessage()    /**     * Return a textual error message for a DB error code     *     * @param integer $value error code     *     * @return string error message, or false if the error code was     * not recognized     */    function errorMessage($value)    {        static $errorMessages;        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_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint',                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_ERROR_INVALID_DSN        => 'invalid DSN',                DB_ERROR_CONNECT_FAILED     => 'connect failed',                DB_OK                       => 'no error',                DB_ERROR_NEED_MORE_DATA     => 'insufficient data supplied',                DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',                DB_ERROR_NOSUCHDB           => 'no such database',                DB_ERROR_ACCESS_VIOLATION   => 'insufficient permissions',                DB_ERROR_TRUNCATED          => 'truncated'            );        }        if (DB::isError($value)) {            $value = $value->getCode();        }        return isset($errorMessages[$value]) ? $errorMessages[$value] : $errorMessages[DB_ERROR];    }    // }}}    // {{{ parseDSN()    /**     * Parse a data source name.     *     * Additional keys can be added by appending a URI query string to the     * end of the DSN.     *     * The format of the supplied DSN is in its fullest form:     * <code>     *  phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true     * </code>     *     * Most variations are allowed:     * <code>     *  phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644     *  phptype://username:password@hostspec/database_name     *  phptype://username:password@hostspec     *  phptype://username@hostspec     *  phptype://hostspec/database     *  phptype://hostspec     *  phptype(dbsyntax)     *  phptype     * </code>     *     * @param string $dsn Data Source Name to be parsed     *     * @return array an associative array with the following keys:     *  + phptype:  Database backend used in PHP (mysql, odbc etc.)     *  + dbsyntax: Database used with regards to SQL syntax etc.     *  + protocol: Communication protocol to use (tcp, unix etc.)     *  + hostspec: Host specification (hostname[:port])     *  + database: Database to use on the DBMS server     *  + username: User name for login     *  + password: Password for login     *     * @author Tomas V.V.Cox <cox@idecnet.com>     */    function parseDSN($dsn)    {        $parsed = array(            'phptype'  => false,            'dbsyntax' => false,            'username' => false,            'password' => false,            'protocol' => false,            'hostspec' => false,            'port'     => false,            'socket'   => false,            'database' => false,        );        if (is_array($dsn)) {            $dsn = array_merge($parsed, $dsn);            if (!$dsn['dbsyntax']) {                $dsn['dbsyntax'] = $dsn['phptype'];            }            return $dsn;        }        // Find phptype and dbsyntax        if (($pos = strpos($dsn, '://')) !== false) {            $str = substr($dsn, 0, $pos);            $dsn = substr($dsn, $pos + 3);        } else {            $str = $dsn;            $dsn = null;        }        // Get phptype and dbsyntax        // $str => phptype(dbsyntax)        if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {            $parsed['phptype']  = $arr[1];            $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];        } else {            $parsed['phptype']  = $str;            $parsed['dbsyntax'] = $str;        }        if (!count($dsn)) {            return $parsed;        }        // Get (if found): username and password        // $dsn => username:password@protocol+hostspec/database        if (($at = strrpos($dsn,'@')) !== false) {            $str = substr($dsn, 0, $at);            $dsn = substr($dsn, $at + 1);            if (($pos = strpos($str, ':')) !== false) {                $parsed['username'] = rawurldecode(substr($str, 0, $pos));                $parsed['password'] = rawurldecode(substr($str, $pos + 1));            } else {                $parsed['username'] = rawurldecode($str);            }        }        // Find protocol and hostspec        // $dsn => proto(proto_opts)/database        if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {            $proto       = $match[1];            $proto_opts  = $match[2] ? $match[2] : false;            $dsn         = $match[3];        // $dsn => protocol+hostspec/database (old format)        } else {            if (strpos($dsn, '+') !== false) {                list($proto, $dsn) = explode('+', $dsn, 2);            }            if (strpos($dsn, '/') !== false) {                list($proto_opts, $dsn) = explode('/', $dsn, 2);            } else {                $proto_opts = $dsn;                $dsn = null;            }        }        // process the different protocol options        $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';        $proto_opts = rawurldecode($proto_opts);        if ($parsed['protocol'] == 'tcp') {            if (strpos($proto_opts, ':') !== false) {                list($parsed['hostspec'], $parsed['port']) = explode(':', $proto_opts);            } else {                $parsed['hostspec'] = $proto_opts;            }        } elseif ($parsed['protocol'] == 'unix') {            $parsed['socket'] = $proto_opts;        }        // Get dabase if any        // $dsn => database        if ($dsn) {            // /database            if (($pos = strpos($dsn, '?')) === false) {                $parsed['database'] = rawurldecode($dsn);            // /database?param1=value1&param2=value2            } else {                $parsed['database'] = rawurldecode(substr($dsn, 0, $pos));                $dsn = substr($dsn, $pos + 1);                if (strpos($dsn, '&') !== false) {                    $opts = explode('&', $dsn);                } else { // database?param1=value1                    $opts = array($dsn);                }                foreach ($opts as $opt) {                    list($key, $value) = explode('=', $opt);                    if (!isset($parsed[$key])) {                        // don't allow params overwrite                        $parsed[$key] = rawurldecode($value);                    }                }            }        }        return $parsed;    }    // }}}    // {{{ assertExtension()    /**     * Load a PHP database extension if it is not loaded already.     *     * @access public     *     * @param string $name the base name of the extension (without the .so or     *                     .dll suffix)     *     * @return boolean true if the extension was already or successfully     *                 loaded, false if it could not be loaded     */    function assertExtension($name)    {        if (!extension_loaded($name)) {            $dlext = OS_WINDOWS ? '.dll' : '.so';            $dlprefix = OS_WINDOWS ? 'php_' : '';            @dl($dlprefix . $name . $dlext);            return extension_loaded($name);        }        return true;    }    // }}}}// }}}// {{{ class DB_Error/** * DB_Error implements a class for reporting portable database error * messages. * * @package  DB * @author Stig Bakken <ssb@php.net> */class DB_Error extends PEAR_Error{    // {{{ constructor    /**     * DB_Error constructor.     *     * @param mixed   $code   DB error code, or string with error message.     * @param integer $mode   what "error mode" to operate in     * @param integer $level  what error level to use for $mode & PEAR_ERROR_TRIGGER     * @param mixed   $debuginfo  additional debug info, such as the last query     *     * @access public     *     * @see PEAR_Error     */    function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?