Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php// +----------------------------------------------------------------------+// | PHP Version 4 |// +----------------------------------------------------------------------+// | Copyright (c) 1998-2004 Manuel Lemos, Tomas V.V.Cox, |// | Stig. S. Bakken, Lukas Smith |// | All rights reserved. |// +----------------------------------------------------------------------+// | MDB is a merge of PEAR DB and Metabases that provides a unified DB |// | API as well as database abstraction for PHP applications. |// | This LICENSE is in the BSD license style. |// | |// | Redistribution and use in source and binary forms, with or without |// | modification, are permitted provided that the following conditions |// | are met: |// | |// | Redistributions of source code must retain the above copyright |// | notice, this list of conditions and the following disclaimer. |// | |// | Redistributions in binary form must reproduce the above copyright |// | notice, this list of conditions and the following disclaimer in the |// | documentation and/or other materials provided with the distribution. |// | |// | Neither the name of Manuel Lemos, Tomas V.V.Cox, Stig. S. Bakken, |// | Lukas Smith nor the names of his contributors may be used to endorse |// | or promote products derived from this software without specific prior|// | written permission. |// | |// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |// | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |// | REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |// | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |// | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS|// | OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |// | AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |// | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY|// | WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |// | POSSIBILITY OF SUCH DAMAGE. |// +----------------------------------------------------------------------+// | Author: Lukas Smith <smith@backendmedia.com> |// +----------------------------------------------------------------------+//// $Id: peardb_wrapper.php,v 1.32.4.2 2004/04/08 17:19:01 lsmith Exp $///** The method mapErrorCode in each MDB_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', MDB_OK);define('DB_ERROR', MDB_ERROR);define('DB_ERROR_SYNTAX', MDB_ERROR_SYNTAX);define('DB_ERROR_CONSTRAINT', MDB_ERROR_CONSTRAINT);define('DB_ERROR_NOT_FOUND', MDB_ERROR_NOT_FOUND);define('DB_ERROR_ALREADY_EXISTS', MDB_ERROR_ALREADY_EXISTS);define('DB_ERROR_UNSUPPORTED', MDB_ERROR_UNSUPPORTED);define('DB_ERROR_MISMATCH', MDB_ERROR_MISMATCH);define('DB_ERROR_INVALID', MDB_ERROR_INVALID);define('DB_ERROR_NOT_CAPABLE', MDB_ERROR_NOT_CAPABLE);define('DB_ERROR_TRUNCATED', MDB_ERROR_TRUNCATED);define('DB_ERROR_INVALID_NUMBER', MDB_ERROR_INVALID_NUMBER);define('DB_ERROR_INVALID_DATE', MDB_ERROR_INVALID_DATE);define('DB_ERROR_DIVZERO', MDB_ERROR_DIVZERO);define('DB_ERROR_NODBSELECTED', MDB_ERROR_NODBSELECTED);define('DB_ERROR_CANNOT_CREATE', MDB_ERROR_CANNOT_CREATE);define('DB_ERROR_CANNOT_DELETE', MDB_ERROR_CANNOT_DELETE);define('DB_ERROR_CANNOT_DROP', MDB_ERROR_CANNOT_DROP);define('DB_ERROR_NOSUCHTABLE', MDB_ERROR_NOSUCHTABLE);define('DB_ERROR_NOSUCHFIELD', MDB_ERROR_NOSUCHFIELD);define('DB_ERROR_NEED_MORE_DATA', MDB_ERROR_NEED_MORE_DATA);define('DB_ERROR_NOT_LOCKED', MDB_ERROR_NOT_LOCKED);define('DB_ERROR_VALUE_COUNT_ON_ROW', MDB_ERROR_VALUE_COUNT_ON_ROW);define('DB_ERROR_INVALID_DSN', MDB_ERROR_INVALID_DSN);define('DB_ERROR_CONNECT_FAILED', MDB_ERROR_CONNECT_FAILED);define('DB_ERROR_EXTENSION_NOT_FOUND', MDB_ERROR_EXTENSION_NOT_FOUND);define('DB_ERROR_ACCESS_VIOLATION', MDB_ERROR_ACCESS_VIOLATION);define('DB_ERROR_NOSUCHDB', MDB_ERROR_NOSUCHDB);define('DB_WARNING', -1000);define('DB_WARNING_READ_ONLY', -1001);define('DB_PARAM_SCALAR', MDB_PARAM_SCALAR);define('DB_PARAM_OPAQUE', MDB_PARAM_OPAQUE);define('DB_PARAM_MISC', MDB_PARAM_MISC);define('DB_BINMODE_PASSTHRU', MDB_BINMODE_PASSTHRU);define('DB_BINMODE_RETURN', MDB_BINMODE_RETURN);define('DB_BINMODE_CONVERT', MDB_BINMODE_CONVERT);define('DB_FETCHMODE_DEFAULT', MDB_FETCHMODE_DEFAULT);define('DB_FETCHMODE_ORDERED', MDB_FETCHMODE_ORDERED);define('DB_FETCHMODE_ASSOC', MDB_FETCHMODE_ASSOC);define('DB_FETCHMODE_OBJECT', 3);define('DB_FETCHMODE_FLIPPED', MDB_FETCHMODE_FLIPPED);define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED);define('DB_TABLEINFO_ORDER', MDB_TABLEINFO_ORDER);define('DB_TABLEINFO_ORDERTABLE', MDB_TABLEINFO_ORDERTABLE);define('DB_TABLEINFO_FULL', MDB_TABLEINFO_FULL);define('DB_AUTOQUERY_INSERT', 1);define('DB_AUTOQUERY_UPDATE', 2);/*** Wrapper that makes MDB behave like PEAR DB** @package MDB* @category Database* @author Lukas Smith <smith@backendmedia.com>*/class DB{function &factory($type){$db =& MDB::factory($type);if(PEAR::isError($db)) {return($db);}$obj =& new MDB_PEAR_PROXY($db);return($obj);}function &connect($dsn, $options = FALSE){if (!is_array($options) && $options) {$options['persistent'] = TRUE;}$db =& MDB::connect($dsn, $options);if(PEAR::isError($db)) {return($db);}$obj =& new MDB_PEAR_PROXY($db);return($obj);}function apiVersion(){return(2);}function isError($value){return(MDB::isError($value));}function isManip($query){return(MDB::isManip($query));}function errorMessage($value){return(MDB::errorMessage($value));}function parseDSN($dsn){return(MDB::parseDSN($dsn));}function assertExtension($name){if (!extension_loaded($name)) {$dlext = OS_WINDOWS ? '.dll' : '.so';@dl($name . $dlext);}return extension_loaded($name);}}/*** MDB_Error implements a class for reporting portable database error* messages.** @package MDB* @category Database* @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, $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", DB_ERROR, $mode, $level, $debuginfo);}}}/*** Wrapper that makes MDB behave like PEAR DB** @package MDB* @category Database* @author Lukas Smith <smith@backendmedia.com>*/class DB_result{var $dbh;var $result;var $row_counter = NULL;var $limit_from = NULL;var $limit_count = NULL;function DB_result(&$dbh, $result){$this->dbh = &$dbh;$this->result = $result;}function fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum = 0){$arr = $this->dbh->fetchInto($this->result, $fetchmode, $rownum);if(is_array($arr)) {return($arr);}else {return(NULL);}}function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum = 0){$arr = $this->dbh->fetchInto($this->result, $fetchmode, $rownum);if(MDB::isError($arr)) {return($arr);}if($arr === NULL) {return($arr);}return(DB_OK);}function numCols(){return($this->dbh->numCols($this->result));}function numRows(){return($this->dbh->numRows($this->result));}function nextResult(){return($this->dbh->nextResult($this->result));}function free(){$err = $this->dbh->freeResult($this->result);if(MDB::isError($err)) {return($err);}$this->result = FALSE;return(TRUE);}function tableInfo($mode = NULL){return($this->dbh->tableInfo($this->result, $mode));}function getRowCounter(){return($this->dbh->highest_fetched_row[$this->result]);}}class DB_row{function DB_row(&$arr){for (reset($arr); $key = key($arr); next($arr)) {$this->$key = &$arr[$key];}}}class MDB_PEAR_PROXY{var $MDB_object;function MDB_PEAR_PROXY($MDB_object){$this->MDB_object = $MDB_object;$this->MDB_object->option['sequence_col_name'] = 'id';}function connect($dsninfo, $persistent = FALSE){return($this->MDB_object->connect($dsninfo, $persistent));}function disconnect(){return($this->MDB_object->disconnect());}function quoteString($string){$string = $this->_quote($string);if ($string{0} == "'") {return substr($string, 1, -1);}return($string);}function quote($string){if ($string === NULL) {return 'NULL';}return($this->MDB_object->_quote($string));}function provides($feature){return($this->MDB_object->support($feature));}function errorCode($nativecode){return($this->MDB_object->errorCode($nativecode));}function errorMessage($dbcode){return($this->MDB_object->errorMessage($dbcode));}function &raiseError($code = DB_ERROR, $mode = NULL, $options = NULL,$userinfo = NULL, $nativecode = NULL){return($this->MDB_object->raiseError($code = DB_ERROR, $mode, $options, $userinfo, $nativecode));}function setFetchMode($fetchmode, $object_class = NULL){return($this->MDB_object->setFetchMode($fetchmode, $object_class));}function setOption($option, $value){return($this->MDB_object->setOption($option, $value));}function getOption($option){return($this->MDB_object->getOption($option));}function prepare($query){return($this->MDB_object->prepareQuery($query));}function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT, $where = false){$query = $this->buildManipSQL($table, $table_fields, $mode, $where);return($this->prepare($query));}function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT, $where = false){$sth = $this->autoPrepare($table, array_keys($fields_values), $mode, $where);return($this->execute($sth, array_values($fields_values)));}function buildManipSQL($table, $table_fields, $mode, $where = false){if (count($table_fields) == 0) {$this->raiseError(DB_ERROR_NEED_MORE_DATA);}$first = true;switch ($mode) {case DB_AUTOQUERY_INSERT:$values = '';$names = '';while (list(, $value) = each($table_fields)) {if ($first) {$first = false;} else {$names .= ',';$values .= ',';}$names .= $value;$values .= '?';}return "INSERT INTO $table ($names) VALUES ($values)";break;case DB_AUTOQUERY_UPDATE:$set = '';while (list(, $value) = each($table_fields)) {if ($first) {$first = false;} else {$set .= ',';}$set .= "$value = ?";}$sql = "UPDATE $table SET $set";if ($where) {$sql .= " WHERE $where";}return($sql);break;default:$this->raiseError(DB_ERROR_SYNTAX);}}function execute($stmt, $data = FALSE){$result = $this->MDB_object->execute($stmt, NULL, $data);if (MDB::isError($result) || $result === DB_OK) {return($result);} else {return new DB_result($this->MDB_object, $result);}}function executeMultiple( $stmt, &$data ){return($this->MDB_object->executeMultiple($stmt, NULL, $data));}function &query($query, $params = array()) {if (sizeof($params) > 0) {$sth = $this->MDB_object->prepare($query);if (MDB::isError($sth)) {return($sth);}return($this->MDB_object->execute($sth, $params));} else {$result = $this->MDB_object->query($query);if (MDB::isError($result) || $result === DB_OK) {return($result);} else {return new DB_result($this->MDB_object, $result);}}}function simpleQuery($query) {return($this->MDB_object->query($query));}function limitQuery($query, $from, $count){$result = $this->MDB_object->limitQuery($query, NULL, $from, $count);if (MDB::isError($result) || $result === DB_OK) {return($result);} else {return new DB_result($this->MDB_object, $result);}}function &getOne($query, $params = array()){return($this->MDB_object->getOne($query, NULL, $params));}function &getRow($query,$params = NULL,$fetchmode = DB_FETCHMODE_DEFAULT){return($this->MDB_object->getRow($query, NULL, $params, NULL, $fetchmode));}function &getCol($query, $col = 0, $params = array()){return($this->MDB_object->getCol($query, NULL, $params, NULL, $col));}function &getAssoc($query, $force_array = FALSE, $params = array(),$fetchmode = DB_FETCHMODE_ORDERED, $group = FALSE){return($this->MDB_object->getAssoc($query, NULL, $params, NULL, $fetchmode, $force_array, $group));}function &getAll($query,$params = NULL,$fetchmode = DB_FETCHMODE_DEFAULT){return($this->MDB_object->getAll($query, NULL, $params, NULL, $fetchmode));}function autoCommit($onoff = FALSE){return($this->MDB_object->autoCommit($onoff));}function commit(){return($this->MDB_object->commit());}function rollback(){return($this->MDB_object->rollback());}function numRows($result){return($this->MDB_object->numRows($result));}function affectedRows(){return($this->MDB_object->affectedRows());}function errorNative(){return($this->MDB_object->errorNative());}function nextId($seq_name, $ondemand = TRUE){return($this->MDB_object->nextId($seq_name, $ondemand));}function createSequence($seq_name){return($this->MDB_object->createSequence($seq_name, 1));}function dropSequence($seq_name){return($this->MDB_object->dropSequence($seq_name));}function tableInfo($result, $mode = NULL){return($this->MDB_object->tableInfo($result, $mode));}function getTables(){return($this->getListOf('tables'));}function getListOf($type){switch ($type) {case 'tables':return($this->MDB_object->listTables());case 'views':return($this->MDB_object->listViews());case 'users':return($this->MDB_object->listUsers());case 'functions':return($this->MDB_object->listFunctions());case 'databases':return($this->MDB_object->listDatabases());default:return($this->raiseError(DB_ERROR_UNSUPPORTED));}}}?>