* (bug 10859) Introduce 'UserGetImplicitGroups' hook; see docs/hooks.txt for more...
[lhc/web/wiklou.git] / includes / DatabasePostgres.php
index b5721db..7f738a4 100644 (file)
@@ -105,6 +105,9 @@ class DatabasePostgres extends Database {
        function searchableIPs() {
                return true;
        }
+       function functionalIndexes() {
+               return true;
+       }
 
        static function newFromParams( $server, $user, $password, $dbName, $failFunction = false, $flags = 0)
        {
@@ -155,6 +158,7 @@ class DatabasePostgres extends Database {
 
                $this->mOpened = true;
                ## If this is the initial connection, setup the schema stuff and possibly create the user
+               ## TODO: Move this out of open()
                if (defined('MEDIAWIKI_INSTALL')) {
                        global $wgDBname, $wgDBuser, $wgDBpassword, $wgDBsuperuser, $wgDBmwschema,
                                $wgDBts2schema;
@@ -504,12 +508,18 @@ class DatabasePostgres extends Database {
        }
 
        function freeResult( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
                if ( !@pg_free_result( $res ) ) {
                        throw new DBUnexpectedError($this,  "Unable to free Postgres result\n" );
                }
        }
 
        function fetchObject( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
                @$row = pg_fetch_object( $res );
                # FIXME: HACK HACK HACK HACK debug
 
@@ -523,6 +533,9 @@ class DatabasePostgres extends Database {
        }
 
        function fetchRow( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
                @$row = pg_fetch_array( $res );
                if( pg_last_error($this->mConn) ) {
                        throw new DBUnexpectedError($this,  'SQL error: ' . htmlspecialchars( pg_last_error($this->mConn) ) );
@@ -531,14 +544,27 @@ class DatabasePostgres extends Database {
        }
 
        function numRows( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
                @$n = pg_num_rows( $res );
                if( pg_last_error($this->mConn) ) {
                        throw new DBUnexpectedError($this,  'SQL error: ' . htmlspecialchars( pg_last_error($this->mConn) ) );
                }
                return $n;
        }
-       function numFields( $res ) { return pg_num_fields( $res ); }
-       function fieldName( $res, $n ) { return pg_field_name( $res, $n ); }
+       function numFields( $res ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               return pg_num_fields( $res );
+       }
+       function fieldName( $res, $n ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               return pg_field_name( $res, $n );
+       }
 
        /**
         * This must be called after nextSequenceVal
@@ -547,7 +573,13 @@ class DatabasePostgres extends Database {
                return $this->mInsertId;
        }
 
-       function dataSeek( $res, $row ) { return pg_result_seek( $res, $row ); }
+       function dataSeek( $res, $row ) {
+               if ( $res instanceof ResultWrapper ) {
+                       $res = $res->result;
+               }
+               return pg_result_seek( $res, $row );
+       }
+
        function lastError() {
                if ( $this->mConn ) {
                        return pg_last_error();
@@ -601,13 +633,9 @@ class DatabasePostgres extends Database {
                if ( !$res ) {
                        return NULL;
                }
-
                while ( $row = $this->fetchObject( $res ) ) {
                        if ( $row->indexname == $index ) {
                                return $row;
-                               
-                               // BUG: !!!! This code needs to be synced up with database.php
-                               
                        }
                }
                return false;
@@ -920,10 +948,10 @@ class DatabasePostgres extends Database {
                        . "WHERE c.relnamespace = n.oid AND c.relname = $etable AND n.nspname = $eschema "
                        . "AND c.relkind IN ('" . implode("','", $types) . "')";
                $res = $this->query( $SQL );
-               $count = $res ? pg_num_rows($res) : 0;
+               $count = $res ? $res->numRows() : 0;
                if ($res)
                        $this->freeResult( $res );
-               return $count;
+               return $count ? true : false;
        }
 
        /*
@@ -953,7 +981,7 @@ END;
                                $this->addQuotes($trigger)));
                if (!$res)
                        return NULL;
-               $rows = pg_num_rows($res);
+               $rows = $res->numRows();
                $this->freeResult($res);
                return $rows;
        }
@@ -977,7 +1005,7 @@ END;
                $res = $this->query($SQL);
                if (!$res)
                        return NULL;
-               $rows = pg_num_rows($res);
+               $rows = $res->numRows();
                $this->freeResult($res);
                return $rows;
        }
@@ -990,7 +1018,12 @@ END;
                $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 && $res->numRows() ) {
+                       $row = $res->fetchObject();
+                       $owner = $row->rolname;
+               } else {
+                       $owner = false;
+               }
                if ($res)
                        $this->freeResult($res);
                return $owner;
@@ -1008,7 +1041,7 @@ END;
                        . "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, $fname );
-               $count = $res ? pg_num_rows($res) : 0;
+               $count = $res ? $res->numRows() : 0;
                if ($res)
                        $this->freeResult( $res );
                return $count;
@@ -1102,10 +1135,10 @@ END;
                $this->doQuery("COMMIT");
        }
 
-       function encodeBlob($b) {
-               return array('bytea',pg_escape_bytea($b));
+       function encodeBlob( $b ) {
+               return pg_escape_bytea( $b );
        }
-       function decodeBlob($b) {
+       function decodeBlob( $b ) {
                return pg_unescape_bytea( $b );
        }
 
@@ -1164,7 +1197,7 @@ END;
 
                if ( isset( $noKeyOptions['FOR UPDATE'] ) ) $postLimitTail .= ' FOR UPDATE';
                if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) $postLimitTail .= ' LOCK IN SHARE MODE';
-               if ( isset( $noKeyOptions['DISTINCT'] ) && isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
+               if ( isset( $noKeyOptions['DISTINCT'] ) || isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
                
                return array( $startOpts, $useIndex, $preLimitTail, $postLimitTail );
        }
@@ -1177,8 +1210,16 @@ END;
                wfDebug( "Function ping() not written for DatabasePostgres.php yet");
                return true;
        }
-
+       
+       /**
+        * How lagged is this slave?
+        *
+        */
+       public function getLag() {
+               # Not implemented for PostgreSQL
+               return false;
+       }
 
 } // end DatabasePostgres class
 
-?>
+