Merge "Added DatabaseBase::startAtomic and endAtomic"
[lhc/web/wiklou.git] / includes / db / Database.php
index ee17904..cd907e9 100644 (file)
@@ -3126,7 +3126,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @since 1.20
         */
        final public function onTransactionIdle( $callback ) {
-               $this->mTrxIdleCallbacks[] = $callback;
+               $this->mTrxIdleCallbacks[] = array( $callback, wfGetCaller() );
                if ( !$this->mTrxLevel ) {
                        $this->runOnTransactionIdleCallbacks();
                }
@@ -3145,7 +3145,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         */
        final public function onTransactionPreCommitOrIdle( $callback ) {
                if ( $this->mTrxLevel ) {
-                       $this->mTrxPreCommitCallbacks[] = $callback;
+                       $this->mTrxPreCommitCallbacks[] = array( $callback, wfGetCaller() );
                } else {
                        $this->onTransactionIdle( $callback ); // this will trigger immediately
                }
@@ -3165,8 +3165,9 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->mTrxIdleCallbacks = array(); // recursion guard
                        foreach ( $callbacks as $callback ) {
                                try {
+                                       list( $phpCallback ) = $callback;
                                        $this->clearFlag( DBO_TRX ); // make each query its own transaction
-                                       call_user_func( $callback );
+                                       call_user_func( $phpCallback );
                                        $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
                                } catch ( Exception $e ) {}
                        }
@@ -3189,7 +3190,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->mTrxPreCommitCallbacks = array(); // recursion guard
                        foreach ( $callbacks as $callback ) {
                                try {
-                                       call_user_func( $callback );
+                                       list( $phpCallback ) = $callback;
+                                       call_user_func( $phpCallback );
                                } catch ( Exception $e ) {}
                        }
                } while ( count( $this->mTrxPreCommitCallbacks ) );
@@ -3357,6 +3359,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( $this->mTrxDoneWrites ) {
                        Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
                }
+               $this->mTrxDoneWrites = false;
                $this->runOnTransactionIdleCallbacks();
        }
 
@@ -3392,6 +3395,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                if ( $this->mTrxDoneWrites ) {
                        Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname );
                }
+               $this->mTrxDoneWrites = false;
        }
 
        /**
@@ -3976,9 +3980,21 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                return (string)$this->mConn;
        }
 
+       /**
+        * Run a few simple sanity checks
+        */
        public function __destruct() {
+               if ( $this->mTrxLevel && $this->mTrxDoneWrites ) {
+                       trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." );
+               }
                if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) {
-                       trigger_error( "Transaction idle or pre-commit callbacks still pending." ); // sanity
+                       $callers = array();
+                       foreach ( $this->mTrxIdleCallbacks as $callbackInfo ) {
+                               $callers[] = $callbackInfo[1];
+
+                       }
+                       $callers = implode( ', ', $callers );
+                       trigger_error( "DB transaction callbacks still pending (from $callers)." );
                }
        }
 }