databaseoracle.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 693 行 · 第 1/2 页

PHP
693
字号
<?php/** * Oracle. * * @package MediaWiki *//** * Depends on database */require_once( 'Database.php' );class OracleBlob extends DBObject {	function isLOB() {		return true;	}	function data() {		return $this->mData;	}};/** * * @package MediaWiki */class DatabaseOracle extends Database {	var $mInsertId = NULL;	var $mLastResult = NULL;	var $mFetchCache = array();	var $mFetchID = array();	var $mNcols = array();	var $mFieldNames = array(), $mFieldTypes = array();	var $mAffectedRows = array();	var $mErr;	function DatabaseOracle($server = false, $user = false, $password = false, $dbName = false,		$failFunction = false, $flags = 0, $tablePrefix = 'get from global' )	{		Database::Database( $server, $user, $password, $dbName, $failFunction, $flags, $tablePrefix );	}	/* static */ function newFromParams( $server = false, $user = false, $password = false, $dbName = false,		$failFunction = false, $flags = 0, $tablePrefix = 'get from global' )	{		return new DatabaseOracle( $server, $user, $password, $dbName, $failFunction, $flags, $tablePrefix );	}	/**	 * Usually aborts on failure	 * If the failFunction is set to a non-zero integer, returns success	 */	function open( $server, $user, $password, $dbName ) {		if ( !function_exists( 'oci_connect' ) ) {			throw new DBConnectionError( $this, "Oracle functions missing, have you compiled PHP with the --with-oci8 option?\n" );		}		$this->close();		$this->mServer = $server;		$this->mUser = $user;		$this->mPassword = $password;		$this->mDBname = $dbName;		$success = false;		$hstring="";		$this->mConn = oci_new_connect($user, $password, $dbName, "AL32UTF8");		if ( $this->mConn === false ) {			wfDebug( "DB connection error\n" );			wfDebug( "Server: $server, Database: $dbName, User: $user, Password: "				. substr( $password, 0, 3 ) . "...\n" );			wfDebug( $this->lastError()."\n" );		} else {			$this->mOpened = true;		}		return $this->mConn;	}	/**	 * Closes a database connection, if it is open	 * Returns success, true if already closed	 */	function close() {		$this->mOpened = false;		if ($this->mConn) {			return oci_close($this->mConn);		} else {			return true;		}	}	function parseStatement($sql) {		$this->mErr = $this->mLastResult = false;		if (($stmt = oci_parse($this->mConn, $sql)) === false) {			$this->lastError();			return $this->mLastResult = false;		}		$this->mAffectedRows[$stmt] = 0;		return $this->mLastResult = $stmt;	}	function doQuery($sql) {		if (($stmt = $this->parseStatement($sql)) === false)			return false;		return $this->executeStatement($stmt);	}	function executeStatement($stmt) {		if (!oci_execute($stmt, OCI_DEFAULT)) {			$this->lastError();			oci_free_statement($stmt);			return false;		}		$this->mAffectedRows[$stmt] = oci_num_rows($stmt);		$this->mFetchCache[$stmt] = array();		$this->mFetchID[$stmt] = 0;		$this->mNcols[$stmt] = oci_num_fields($stmt);		if ($this->mNcols[$stmt] == 0)			return $this->mLastResult;		for ($i = 1; $i <= $this->mNcols[$stmt]; $i++) {			$this->mFieldNames[$stmt][$i] = oci_field_name($stmt, $i);			$this->mFieldTypes[$stmt][$i] = oci_field_type($stmt, $i);		}		while (($o = oci_fetch_array($stmt)) !== false) {			foreach ($o as $key => $value) {				if (is_object($value)) {					$o[$key] = $value->load();				}			}			$this->mFetchCache[$stmt][] = $o;		}		return $this->mLastResult;	}	function queryIgnore( $sql, $fname = '' ) {		return $this->query( $sql, $fname, true );	}	function freeResult( $res ) {		if (!oci_free_statement($res)) {			throw new DBUnexpectedError( $this, "Unable to free Oracle result\n" );		}		unset($this->mFetchID[$res]);		unset($this->mFetchCache[$res]);		unset($this->mNcols[$res]);		unset($this->mFieldNames[$res]);		unset($this->mFieldTypes[$res]);	}	function fetchAssoc($res) {		if ($this->mFetchID[$res] >= count($this->mFetchCache[$res]))			return false;		for ($i = 1; $i <= $this->mNcols[$res]; $i++) {			$name = $this->mFieldNames[$res][$i];			$type = $this->mFieldTypes[$res][$i];			if (isset($this->mFetchCache[$res][$this->mFetchID[$res]][$name]))				$value = $this->mFetchCache[$res][$this->mFetchID[$res]][$name];			else	$value = NULL;			$key = strtolower($name);			wfdebug("'$key' => '$value'\n");			$ret[$key] = $value;		}		$this->mFetchID[$res]++;		return $ret;	}	function fetchRow($res) {		$r = $this->fetchAssoc($res);		if (!$r)			return false;		$i = 0;		$ret = array();		foreach ($r as $key => $value) {			wfdebug("ret[$i]=[$value]\n");			$ret[$i++] = $value;		}		return $ret;	}	function fetchObject($res) {		$row = $this->fetchAssoc($res);		if (!$row)			return false;		$ret = new stdClass;		foreach ($row as $key => $value)			$ret->$key = $value;		return $ret;	}	function numRows($res) {		return count($this->mFetchCache[$res]);	}	function numFields( $res ) { return pg_num_fields( $res ); }	function fieldName( $res, $n ) { return pg_field_name( $res, $n ); }	/**	 * This must be called after nextSequenceVal	 */	function insertId() {		return $this->mInsertId;	}	function dataSeek($res, $row) {		$this->mFetchID[$res] = $row;	}	function lastError() {		if ($this->mErr === false) {			if ($this->mLastResult !== false) $what = $this->mLastResult;			else if ($this->mConn !== false) $what = $this->mConn;			else $what = false;			$err = ($what !== false) ? oci_error($what) : oci_error();			if ($err === false)				$this->mErr = 'no error';			else				$this->mErr = $err['message'];		}		return str_replace("\n", '<br />', $this->mErr);	}	function lastErrno() {		return 0;	}	function affectedRows() {		return $this->mAffectedRows[$this->mLastResult];	}	/**	 * Returns information about an index	 * If errors are explicitly ignored, returns NULL on failure	 */	function indexInfo ($table, $index, $fname = 'Database::indexInfo' ) {		$table = $this->tableName($table, true);		if ($index == 'PRIMARY')			$index = "${table}_pk";		$sql = "SELECT uniqueness FROM all_indexes WHERE table_name='" .			$table . "' AND index_name='" .			$this->strencode(strtoupper($index)) . "'";		$res = $this->query($sql, $fname);		if (!$res)			return NULL;		if (($row = $this->fetchObject($res)) == NULL)			return false;		$this->freeResult($res);		$row->Non_unique = !$row->uniqueness;		return $row;	}	function indexUnique ($table, $index, $fname = 'indexUnique') {		if (!($i = $this->indexInfo($table, $index, $fname)))			return $i;		return $i->uniqueness == 'UNIQUE';	}	function fieldInfo( $table, $field ) {		$o = new stdClass;		$o->multiple_key = true; /* XXX */		return $o;	}	function getColumnInformation($table, $field) {		$table = $this->tableName($table, true);		$field = strtoupper($field);		$res = $this->doQuery("SELECT * FROM all_tab_columns " .			"WHERE table_name='".$table."' " .			"AND   column_name='".$field."'");		if (!$res)			return false;		$o = $this->fetchObject($res);		$this->freeResult($res);		return $o;	}	function fieldExists( $table, $field, $fname = 'Database::fieldExists' ) {		$column = $this->getColumnInformation($table, $field);		if (!$column)			return false;		return true;	}	function tableName($name, $forddl = false) {		# First run any transformations from the parent object		$name = parent::tableName( $name );		# Replace backticks into empty		# Note: "foo" and foo are not the same in Oracle!		$name = str_replace('`', '', $name);		# Now quote Oracle reserved keywords		switch( $name ) {			case 'user':			case 'group':			case 'validate':				if ($forddl)					return $name;				else					return '"' . $name . '"';			default:				return strtoupper($name);		}	}	function strencode( $s ) {		return str_replace("'", "''", $s);	}	/**	 * Return the next in a sequence, save the value for retrieval via insertId()	 */	function nextSequenceValue( $seqName ) {		$r = $this->doQuery("SELECT $seqName.nextval AS val FROM dual");		$o = $this->fetchObject($r);		$this->freeResult($r);		return $this->mInsertId = (int)$o->val;	}	/**	 * USE INDEX clause	 * PostgreSQL doesn't have them and returns ""	 */	function useIndexClause( $index ) {		return '';	}	# REPLACE query wrapper	# PostgreSQL simulates this with a DELETE followed by INSERT	# $row is the row to insert, an associative array	# $uniqueIndexes is an array of indexes. Each element may be either a	# field name or an array of field names	#	# It may be more efficient to leave off unique indexes which are unlikely to collide.	# However if you do this, you run the risk of encountering errors which wouldn't have	# occurred in MySQL	function replace( $table, $uniqueIndexes, $rows, $fname = 'Database::replace' ) {		$table = $this->tableName( $table );		if (count($rows)==0) {			return;		}		# Single row case		if ( !is_array( reset( $rows ) ) ) {			$rows = array( $rows );		}

⌨️ 快捷键说明

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