https://www.mediawiki.org/wiki/Special:Code/MediaWiki/113408

Revision: 113408
Author:   saper
Date:     2012-03-08 21:44:03 +0000 (Thu, 08 Mar 2012)
Log Message:
-----------
PostgreSQL: Improve SQL error handling

After a query error, PostgreSQL transaction is aborted
until it's terminated or the query is closed. 

All further queries result in:

  ERROR: current transaction is aborted, commands ignored 
  until end of transaction block

Those subsequent errors are ignored by double fault handling in
DatabaseBase::reportQueryError but they cause all localization
of error messages to fail (unable to issue queries to message
tables) and errors lke


This resulted in a broken MediaWiki screen with

  <databaseerror>
  <dberrortext>

instead of localized error message.

We need to fully reset database connection because after
pg_connection_reset() various session parameters need to
be set again (like "search_path"), otherwise tables will not be
found.

   ERROR: relation "msg_resource" does not exist
   ERROR:  relation "l10n_cache" does not exist

Modified Paths:
--------------
    trunk/phase3/includes/db/DatabasePostgres.php

Modified: trunk/phase3/includes/db/DatabasePostgres.php
===================================================================
--- trunk/phase3/includes/db/DatabasePostgres.php       2012-03-08 21:39:13 UTC 
(rev 113407)
+++ trunk/phase3/includes/db/DatabasePostgres.php       2012-03-08 21:44:03 UTC 
(rev 113408)
@@ -159,7 +159,6 @@
                        return;
                }
 
-               $this->close();
                $this->mServer = $server;
                $port = $wgDBport;
                $this->mUser = $user;
@@ -177,10 +176,14 @@
                if ( $port != false && $port != '' ) {
                        $connectVars['port'] = $port;
                }
-               $connectString = $this->makeConnectionString( $connectVars, 
PGSQL_CONNECT_FORCE_NEW );
+               $this->connectString = $this->makeConnectionString( 
$connectVars, PGSQL_CONNECT_FORCE_NEW );
+               $this->reOpen();
+       }
 
+       function reOpen() {
+               $this->close();
                $this->installErrorHandler();
-               $this->mConn = pg_connect( $connectString );
+               $this->mConn = pg_connect( $this->connectString );
                $phpError = $this->restoreErrorHandler();
 
                if ( !$this->mConn ) {
@@ -253,6 +256,13 @@
                return $this->mLastResult;
        }
 
+       function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = 
false ) {
+               $this->rollback( __METHOD__ );
+               $this->reOpen();
+               parent::reportQueryError( $error, $errno, $sql, $fname, 
$tempIgnore );
+       }
+
+
        function queryIgnore( $sql, $fname = 'DatabasePostgres::queryIgnore' ) {
                return $this->query( $sql, $fname, true );
        }


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to