Tell regexp parser to use extra analysis on external link regexp;
[lhc/web/wiklou.git] / includes / DatabasePostgreSQL.php
index 736822f..63c500a 100644 (file)
@@ -53,11 +53,14 @@ class DatabasePgsql extends Database {
                        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;
                
@@ -73,6 +76,7 @@ class DatabasePgsql extends Database {
                                wfDebug( "Server: $server, Database: $dbName, User: $user, Password: " . substr( $password, 0, 3 ) . "...\n" );
                                wfDebug( $this->lastError()."\n" );
                        } else { 
+                               $this->setSchema();
                                $this->mOpened = true;
                        }
                }
@@ -199,7 +203,7 @@ class DatabasePgsql extends Database {
                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 
@@ -217,7 +221,7 @@ class DatabasePgsql extends Database {
                        $a = array( $a );
                }
                foreach ( $a as $row ) {
-                       parent::insertArray( $table, $row, $fname, array() );
+                       parent::insert( $table, $row, $fname, array() );
                }
                $this->ignoreErrors( $oldIgnore );
                $retVal = true;
@@ -240,26 +244,30 @@ class DatabasePgsql extends Database {
                # 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;
        }
@@ -350,8 +358,17 @@ class DatabasePgsql extends Database {
        # 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;
        }
@@ -387,6 +404,14 @@ class DatabasePgsql extends Database {
                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" .
@@ -412,6 +437,13 @@ class DatabasePgsql extends Database {
                $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");
+       }
 }
 
 /**