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