die( "PostgreSQL functions missing, have you compiled PHP with the --with-pgsql option?\n" );
}
+ global $wgDBschema;
+
$this->close();
$this->mServer = $server;
$this->mUser = $user;
if ( '' != $dbName ) {
# start a database connection
- @$this->mConn = pg_connect("host=$server dbname=$dbName user=$user password=$password");
+ $hstring="";
+ if ($server!=false && $server!="") {
+ $hstring="host=$server ";
+ }
+ @$this->mConn = pg_connect("$hstring dbname=$dbName user=$user password=$password");
if ( $this->mConn == false ) {
wfDebug( "DB connection error\n" );
wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
} else {
$this->mOpened = true;
}
+ $this->query("SET search_path = $wgDBschema,public");
}
return $this->mConn;
}
return false;
}
+ function indexUnique ($table, $index, $fname = 'Database::indexUnique' ) {
+ $sql = "SELECT indexname FROM pg_indexes WHERE tablename='{$table}'".
+ " AND indexdef LIKE 'CREATE UNIQUE%({$index})'";
+ $res = $this->query( $sql, $fname );
+ if ( !$res )
+ return NULL;
+ while ($row = $this->fetchObject( $res ))
+ return true;
+ return false;
+
+ }
+
function fieldInfo( $table, $field ) {
wfDebugDieBacktrace( 'Database::fieldInfo() error : mysql_fetch_field() not implemented for postgre' );
/*
# 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 ) ) ) {
foreach( $rows as $row ) {
# Delete rows which collide
if ( $uniqueIndexes ) {
- $sql = "DELETE FROM $table WHERE (";
+ $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;
- $sql .= "(";
foreach ( $index as $col ) {
if ( $first2 ) {
$first2 = false;
}
$sql .= $col.'=' . $this->addQuotes( $row[$col] );
}
- } else {
+ } else {
$sql .= $index.'=' . $this->addQuotes( $row[$index] );
- }
+ }
}
$sql .= ')';
$this->query( $sql, $fname );
}
# Now insert the row
- $sql = "INSERT INTO $table (" . $this->makeList( array_flip( $row ) ) .') VALUES (' .
+ $sql = "INSERT INTO $table (" . $this->makeList( array_keys( $row ), LIST_NAMES ) .') VALUES (' .
$this->makeList( $row, LIST_COMMA ) . ')';
$this->query( $sql, $fname );
}
# Returns the size of a text field, or -1 for "unlimited"
function textFieldSize( $table, $field ) {
$table = $this->tableName( $table );
- $res = $this->query( "SELECT $field FROM $table LIMIT 1", "Database::textFieldLength" );
- $size = pg_field_size( $res, 0 );
+ $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 limitResult($limit,$offset) {
return " 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 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";
+
+ 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";
wfDebugDieBacktrace($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;
+ }
}
/**