PostgreSQL: Improve SQL error handling
[lhc/web/wiklou.git] / includes / db / DatabasePostgres.php
index 978bfc7..1f1d7ed 100644 (file)
@@ -159,7 +159,6 @@ class DatabasePostgres extends DatabaseBase {
                        return;
                }
 
-               $this->close();
                $this->mServer = $server;
                $port = $wgDBport;
                $this->mUser = $user;
@@ -177,10 +176,14 @@ class DatabasePostgres extends DatabaseBase {
                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 ) {
@@ -240,13 +243,8 @@ class DatabasePostgres extends DatabaseBase {
         * Returns success, true if already closed
         * @return bool
         */
-       function close() {
-               $this->mOpened = false;
-               if ( $this->mConn ) {
-                       return pg_close( $this->mConn );
-               } else {
-                       return true;
-               }
+       protected function closeConnection() {
+               return pg_close( $this->mConn );
        }
 
        protected function doQuery( $sql ) {
@@ -258,6 +256,13 @@ class DatabasePostgres extends DatabaseBase {
                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 );
        }