X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fdb%2FDatabase.php;h=3dc6e9213b78efeae22b9daccaf1bbbaff2046d4;hp=bda4ccf507a3fa99f69eddc136ba794dae9f819c;hb=708c02281e6e8880ae2cebbda7f353ce97841f94;hpb=71e4493c864e4f14f1c850c710be017a7198fd2b diff --git a/includes/db/Database.php b/includes/db/Database.php index bda4ccf507..3dc6e9213b 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -58,6 +58,8 @@ abstract class DatabaseBase implements IDatabase { protected $mTrxPreCommitCallbacks = []; /** @var array[] List of (callable, method name) */ protected $mTrxEndCallbacks = []; + /** @var bool Whether to suppress triggering of post-commit callbacks */ + protected $suppressPostCommitCallbacks = false; protected $mTablePrefix; protected $mSchema; @@ -2386,14 +2388,19 @@ abstract class DatabaseBase implements IDatabase { * queries. If a deadlock occurs during the processing, the transaction * will be rolled back and the callback function will be called again. * + * Avoid using this method outside of Job or Maintenance classes. + * * Usage: * $dbw->deadlockLoop( callback, ... ); * * Extra arguments are passed through to the specified callback function. + * This method requires that no transactions are already active to avoid + * causing premature commits or exceptions. * * Returns whatever the callback function returned on its successful, * iteration, or false on error, for example if the retry limit was * reached. + * * @return mixed * @throws DBUnexpectedError * @throws Exception @@ -2449,6 +2456,10 @@ abstract class DatabaseBase implements IDatabase { return false; } + public function serverIsReadOnly() { + return false; + } + final public function onTransactionResolution( callable $callback ) { if ( !$this->mTrxLevel ) { throw new DBUnexpectedError( $this, "No transaction is active." ); @@ -2467,17 +2478,43 @@ abstract class DatabaseBase implements IDatabase { if ( $this->mTrxLevel ) { $this->mTrxPreCommitCallbacks[] = [ $callback, wfGetCaller() ]; } else { - $this->onTransactionIdle( $callback ); // this will trigger immediately + // If no transaction is active, then make one for this callback + $this->begin( __METHOD__ ); + try { + call_user_func( $callback ); + $this->commit( __METHOD__ ); + } catch ( Exception $e ) { + $this->rollback( __METHOD__ ); + throw $e; + } } } /** - * Actually run and consume any "on transaction idle" callbacks. + * Whether to disable running of post-commit callbacks + * + * This method should not be used outside of Database/LoadBalancer + * + * @param bool $suppress + * @since 1.28 + */ + final public function setPostCommitCallbackSupression( $suppress ) { + $this->suppressPostCommitCallbacks = $suppress; + } + + /** + * Actually run and consume any "on transaction idle/resolution" callbacks. + * + * This method should not be used outside of Database/LoadBalancer * * @param integer $trigger IDatabase::TRIGGER_* constant * @since 1.20 */ - protected function runOnTransactionIdleCallbacks( $trigger ) { + public function runOnTransactionIdleCallbacks( $trigger ) { + if ( $this->suppressPostCommitCallbacks ) { + return; + } + $autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled? $e = $ePrior = null; // last exception @@ -2486,8 +2523,8 @@ abstract class DatabaseBase implements IDatabase { $this->mTrxIdleCallbacks, $this->mTrxEndCallbacks // include "transaction resolution" callbacks ); - $this->mTrxIdleCallbacks = []; // recursion guard - $this->mTrxEndCallbacks = []; // recursion guard + $this->mTrxIdleCallbacks = []; // consumed (and recursion guard) + $this->mTrxEndCallbacks = []; // consumed (recursion guard) foreach ( $callbacks as $callback ) { try { list( $phpCallback ) = $callback; @@ -2528,7 +2565,7 @@ abstract class DatabaseBase implements IDatabase { $e = $ePrior = null; // last exception do { // callbacks may add callbacks :) $callbacks = $this->mTrxPreCommitCallbacks; - $this->mTrxPreCommitCallbacks = []; // recursion guard + $this->mTrxPreCommitCallbacks = []; // consumed (and recursion guard) foreach ( $callbacks as $callback ) { try { list( $phpCallback ) = $callback;