die( "PostgreSQL functions missing, have you compiled PHP with the --with-pgsql option?\n" );
}
+ global $wgDBschema;
+
$this->close();
$this->mServer = $server;
$this->mUser = $user;
$this->mPassword = $password;
$this->mDBname = $dbName;
+ $this->mSchemas = array($wgDBschema,'public');
$success = false;
wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
wfDebug( $this->lastError()."\n" );
} else {
+ $this->setSchema();
$this->mOpened = true;
}
}
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' );
/*
return false;*/
}
- function insertArray( $table, $a, $fname = 'Database::insertArray', $options = array() ) {
+ function insert( $table, $a, $fname = 'Database::insert', $options = array() ) {
# PostgreSQL doesn't support options
# We have a go at faking one of them
# TODO: DELAYED, LOW_PRIORITY
$a = array( $a );
}
foreach ( $a as $row ) {
- parent::insertArray( $table, $row, $fname, array() );
+ parent::insert( $table, $row, $fname, array() );
}
$this->ignoreErrors( $oldIgnore );
$retVal = true;
# First run any transformations from the parent object
$name = parent::tableName( $name );
+ # Replace backticks into double quotes
+ $name = strtr($name,'`','"');
+
# Now quote PG reserved keywords
switch( $name ) {
case 'user':
- return '"user"';
case 'old':
- return '"old"';
+ case 'group':
+ return '"' . $name . '"';
+
default:
return $name;
}
}
function strencode( $s ) {
- return pg_escape_string( $s );
+ return addslashes( $s );
}
/**
* Return the next in a sequence, save the value for retrieval via insertId()
*/
function nextSequenceValue( $seqName ) {
- $value = $this->getField(''," nextval('" . $seqName . "')");
+ $value = $this->selectField(''," nextval('" . $seqName . "')");
$this->mInsertId = $value;
return $value;
}
# 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;
}
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" .
$this->freeResult( $res );
return $version;
}
+
+ 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");
+ }
}
/**