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 + -
显示快捷键?