databaseoracle.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 693 行 · 第 1/2 页
PHP
693 行
foreach( $rows as $row ) { # Delete rows which collide if ( $uniqueIndexes ) { $sql = "DELETE FROM $table WHERE "; $first = true; foreach ( $uniqueIndexes as $index ) { if ( $first ) { $first = false; $sql .= "("; } else { $sql .= ') OR ('; } if ( is_array( $index ) ) { $first2 = true; foreach ( $index as $col ) { if ( $first2 ) { $first2 = false; } else { $sql .= ' AND '; } $sql .= $col.'=' . $this->addQuotes( $row[$col] ); } } else { $sql .= $index.'=' . $this->addQuotes( $row[$index] ); } } $sql .= ')'; $this->query( $sql, $fname ); } # Now insert the row $sql = "INSERT INTO $table (" . $this->makeList( array_keys( $row ), LIST_NAMES ) .') VALUES (' . $this->makeList( $row, LIST_COMMA ) . ')'; $this->query( $sql, $fname ); } } # DELETE where the condition is a join function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = "Database::deleteJoin" ) { if ( !$conds ) { throw new DBUnexpectedError( $this, 'Database::deleteJoin() called with empty $conds' ); } $delTable = $this->tableName( $delTable ); $joinTable = $this->tableName( $joinTable ); $sql = "DELETE FROM $delTable WHERE $delVar IN (SELECT $joinVar FROM $joinTable "; if ( $conds != '*' ) { $sql .= 'WHERE ' . $this->makeList( $conds, LIST_AND ); } $sql .= ')'; $this->query( $sql, $fname ); } # Returns the size of a text field, or -1 for "unlimited" function textFieldSize( $table, $field ) { $table = $this->tableName( $table ); $sql = "SELECT t.typname as ftype,a.atttypmod as size FROM pg_class c, pg_attribute a, pg_type t WHERE relname='$table' AND a.attrelid=c.oid AND a.atttypid=t.oid and a.attname='$field'"; $res =$this->query($sql); $row=$this->fetchObject($res); if ($row->ftype=="varchar") { $size=$row->size-4; } else { $size=$row->size; } $this->freeResult( $res ); return $size; } function lowPriorityOption() { return ''; } function limitResult($sql, $limit, $offset) { $ret = "SELECT * FROM ($sql) WHERE ROWNUM < " . ((int)$limit + (int)($offset+1)); if (is_numeric($offset)) $ret .= " AND ROWNUM >= " . (int)$offset; return $ret; } function limitResultForUpdate($sql, $limit) { return $sql; } /** * Returns an SQL expression for a simple conditional. * Uses CASE on PostgreSQL. * * @param string $cond SQL expression which will result in a boolean value * @param string $trueVal SQL expression to return if true * @param string $falseVal SQL expression to return if false * @return string SQL fragment */ function conditional( $cond, $trueVal, $falseVal ) { return " (CASE WHEN $cond THEN $trueVal ELSE $falseVal END) "; } # FIXME: actually detecting deadlocks might be nice function wasDeadlock() { return false; } # Return DB-style timestamp used for MySQL schema function timestamp($ts = 0) { return $this->strencode(wfTimestamp(TS_ORACLE, $ts));# return "TO_TIMESTAMP('" . $this->strencode(wfTimestamp(TS_DB, $ts)) . "', 'RRRR-MM-DD HH24:MI:SS')"; } /** * Return aggregated value function call */ function aggregateValue ($valuedata,$valuename='value') { return $valuedata; } function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) { $message = "A database error has occurred\n" . "Query: $sql\n" . "Function: $fname\n" . "Error: $errno $error\n"; throw new DBUnexpectedError($this, $message); } /** * @return string wikitext of a link to the server software's web site */ function getSoftwareLink() { return "[http://www.oracle.com/ Oracle]"; } /** * @return string Version information from the database */ function getServerVersion() { return oci_server_version($this->mConn); } function setSchema($schema=false) { $schemas=$this->mSchemas; if ($schema) { array_unshift($schemas,$schema); } $searchpath=$this->makeList($schemas,LIST_NAMES); $this->query("SET search_path = $searchpath"); } function begin() { } function immediateCommit( $fname = 'Database::immediateCommit' ) { oci_commit($this->mConn); $this->mTrxLevel = 0; } function rollback( $fname = 'Database::rollback' ) { oci_rollback($this->mConn); $this->mTrxLevel = 0; } function getLag() { return false; } function getStatus($which=null) { $result = array('Threads_running' => 0, 'Threads_connected' => 0); return $result; } /** * Returns an optional USE INDEX clause to go after the table, and a * string to go at the end of the query * * @access private * * @param array $options an associative array of options to be turned into * an SQL query, valid keys are listed in the function. * @return array */ function makeSelectOptions($options) { $tailOpts = ''; if (isset( $options['ORDER BY'])) { $tailOpts .= " ORDER BY {$options['ORDER BY']}"; } return array('', $tailOpts); } function maxListLen() { return 1000; } /** * Query whether a given table exists */ function tableExists( $table ) { $table = $this->tableName($table, true); $res = $this->query( "SELECT COUNT(*) as NUM FROM user_tables WHERE table_name='" . $table . "'" ); if (!$res) return false; $row = $this->fetchObject($res); $this->freeResult($res); return $row->num >= 1; } /** * UPDATE wrapper, takes a condition array and a SET array */ function update( $table, $values, $conds, $fname = 'Database::update' ) { $table = $this->tableName( $table ); $sql = "UPDATE $table SET "; $first = true; foreach ($values as $field => $v) { if ($first) $first = false; else $sql .= ", "; $sql .= "$field = :n$field "; } if ( $conds != '*' ) { $sql .= " WHERE " . $this->makeList( $conds, LIST_AND ); } $stmt = $this->parseStatement($sql); if ($stmt === false) { $this->reportQueryError( $this->lastError(), $this->lastErrno(), $stmt ); return false; } if ($this->debug()) wfDebug("SQL: $sql\n"); $s = ''; foreach ($values as $field => $v) { oci_bind_by_name($stmt, ":n$field", $values[$field]); if ($this->debug()) $s .= " [$field] = [$v]\n"; } if ($this->debug()) wfdebug(" PH: $s\n"); $ret = $this->executeStatement($stmt); return $ret; } /** * INSERT wrapper, inserts an array into a table * * $a may be a single associative array, or an array of these with numeric keys, for * multi-row insert. * * Usually aborts on failure * If errors are explicitly ignored, returns success */ function insert( $table, $a, $fname = 'Database::insert', $options = array() ) { # No rows to insert, easy just return now if ( !count( $a ) ) { return true; } $table = $this->tableName( $table ); if (!is_array($options)) $options = array($options); $oldIgnore = false; if (in_array('IGNORE', $options)) $oldIgnore = $this->ignoreErrors( true ); if ( isset( $a[0] ) && is_array( $a[0] ) ) { $multi = true; $keys = array_keys( $a[0] ); } else { $multi = false; $keys = array_keys( $a ); } $sql = "INSERT INTO $table (" . implode( ',', $keys ) . ') VALUES ('; $return = ''; $first = true; foreach ($a as $key => $value) { if ($first) $first = false; else $sql .= ", "; if (is_object($value) && $value->isLOB()) { $sql .= "EMPTY_BLOB()"; $return = "RETURNING $key INTO :bobj"; } else $sql .= ":$key"; } $sql .= ") $return"; if ($this->debug()) { wfDebug("SQL: $sql\n"); } if (($stmt = $this->parseStatement($sql)) === false) { $this->reportQueryError($this->lastError(), $this->lastErrno(), $sql, $fname); $this->ignoreErrors($oldIgnore); return false; } /* * If we're inserting multiple rows, parse the statement once and * execute it for each set of values. Otherwise, convert it into an * array and pretend. */ if (!$multi) $a = array($a); foreach ($a as $key => $row) { $blob = false; $bdata = false; $s = ''; foreach ($row as $k => $value) { if (is_object($value) && $value->isLOB()) { $blob = oci_new_descriptor($this->mConn, OCI_D_LOB); $bdata = $value->data(); oci_bind_by_name($stmt, ":bobj", $blob, -1, OCI_B_BLOB); } else oci_bind_by_name($stmt, ":$k", $a[$key][$k], -1); if ($this->debug()) $s .= " [$k] = {$row[$k]}"; } if ($this->debug()) wfDebug(" PH: $s\n"); if (($s = $this->executeStatement($stmt)) === false) { $this->reportQueryError($this->lastError(), $this->lastErrno(), $sql, $fname); $this->ignoreErrors($oldIgnore); return false; } if ($blob) { $blob->save($bdata); } } $this->ignoreErrors($oldIgnore); return $this->mLastResult = $s; } function ping() { return true; } function encodeBlob($b) { return new OracleBlob($b); }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?