databasepostgres.php
来自「php 开发的内容管理系统」· PHP 代码 · 共 610 行 · 第 1/2 页
PHP
610 行
return '"' . $name . '"'; default: return $name; } } /** * Return the next in a sequence, save the value for retrieval via insertId() */ function nextSequenceValue( $seqName ) { $safeseq = preg_replace( "/'/", "''", $seqName ); $res = $this->query( "SELECT nextval('$safeseq')" ); $row = $this->fetchRow( $res ); $this->mInsertId = $row[0]; $this->freeResult( $res ); return $this->mInsertId; } /** * 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 ); } 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) { return "$sql LIMIT $limit ".(is_numeric($offset)?" OFFSET {$offset} ":""); } /** * 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 wfTimestamp(TS_DB,$ts); } /** * 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.postgresql.org/ PostgreSQL]"; } /** * @return string Version information from the database */ function getServerVersion() { $res = $this->query( "SELECT version()" ); $row = $this->fetchRow( $res ); $version = $row[0]; $this->freeResult( $res ); return $version; } /** * Query whether a given table exists (in the given schema, or the default mw one if not given) */ function tableExists( $table, $schema = false ) { global $wgDBmwschema; if (! $schema ) $schema = $wgDBmwschema; $etable = preg_replace("/'/", "''", $table); $eschema = preg_replace("/'/", "''", $schema); $SQL = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n " . "WHERE c.relnamespace = n.oid AND c.relname = '$etable' AND n.nspname = '$eschema'"; $res = $this->query( $SQL ); $count = $res ? pg_num_rows($res) : 0; if ($res) $this->freeResult( $res ); return $count; } /** * Query whether a given schema exists. Returns the name of the owner */ function schemaExists( $schema ) { $eschema = preg_replace("/'/", "''", $schema); $SQL = "SELECT rolname FROM pg_catalog.pg_namespace n, pg_catalog.pg_roles r " ."WHERE n.nspowner=r.oid AND n.nspname = '$eschema'"; $res = $this->query( $SQL ); $owner = $res ? pg_num_rows($res) ? pg_fetch_result($res, 0, 0) : false : false; if ($res) $this->freeResult($res); return $owner; } /** * Query whether a given column exists in the mediawiki schema */ function fieldExists( $table, $field ) { global $wgDBmwschema; $etable = preg_replace("/'/", "''", $table); $eschema = preg_replace("/'/", "''", $wgDBmwschema); $ecol = preg_replace("/'/", "''", $field); $SQL = "SELECT 1 FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a " . "WHERE c.relnamespace = n.oid AND c.relname = '$etable' AND n.nspname = '$eschema' " . "AND a.attrelid = c.oid AND a.attname = '$ecol'"; $res = $this->query( $SQL ); $count = $res ? pg_num_rows($res) : 0; if ($res) $this->freeResult( $res ); return $count; } function fieldInfo( $table, $field ) { $res = $this->query( "SELECT $field FROM $table LIMIT 1" ); $type = pg_field_type( $res, 0 ); return $type; } function begin( $fname = 'DatabasePostgrs::begin' ) { $this->query( 'BEGIN', $fname ); $this->mTrxLevel = 1; } function immediateCommit( $fname = 'DatabasePostgres::immediateCommit' ) { return true; } function commit( $fname = 'DatabasePostgres::commit' ) { $this->query( 'COMMIT', $fname ); $this->mTrxLevel = 0; } /* Not even sure why this is used in the main codebase... */ function limitResultForUpdate($sql, $num) { return $sql; } function update_interwiki() { ## Avoid the non-standard "REPLACE INTO" syntax ## Called by config/index.php $f = fopen( "../maintenance/interwiki.sql", 'r' ); if ($f == false ) { dieout( "<li>Could not find the interwiki.sql file"); } ## We simply assume it is already empty as we have just created it $SQL = "INSERT INTO interwiki(iw_prefix,iw_url,iw_local) VALUES "; while ( ! feof( $f ) ) { $line = fgets($f,1024); if (!preg_match("/^\s*(\(.+?),(\d)\)/", $line, $matches)) { continue; } $yesno = $matches[2]; ## ? "'true'" : "'false'"; $this->query("$SQL $matches[1],$matches[2])"); } print " (table interwiki successfully populated)...\n"; } function encodeBlob($b) { return array('bytea',pg_escape_bytea($b)); } function decodeBlob($b) { return pg_unescape_bytea( $b ); } function strencode( $s ) { ## Should not be called by us return pg_escape_string( $s ); } function addQuotes( $s ) { if ( is_null( $s ) ) { return 'NULL'; } else if (is_array( $s )) { ## Assume it is bytea data return "E'$s[1]'"; } return "'" . pg_escape_string($s) . "'"; return "E'" . pg_escape_string($s) . "'"; }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?