wiki.techinc.nl/includes/deferred/MWCallableUpdate.php
Umherirrender cefcbbbc18 deferred: Add @phan-mandatory-param for function name arguments
Providing the function name is often optional from the php code,
but it is needed for better logging, so make it mandatory and let phan
report issues about this.

Bug: T374546
Follow-Up: I5227f2fa65850ac8c6f620900f22d1f4e7bfd470
Change-Id: I3becd23d3ba9f452a8afd833d509cd907e56ca47
2024-10-11 20:46:13 +02:00

87 lines
2.5 KiB
PHP

<?php
namespace MediaWiki\Deferred;
use Closure;
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\Platform\ISQLPlatform;
/**
* DeferrableUpdate for closure/callable
*
* @internal Use DeferredUpdates::addCallableUpdate instead
*/
class MWCallableUpdate
implements DeferrableUpdate, DeferrableCallback, TransactionRoundAwareUpdate
{
/** @var callable|null Callback, or null if it was cancelled */
private $callback;
/** @var string Calling method name */
private $fname;
/** @var int One of the class TRX_ROUND_* constants */
private $trxRoundRequirement = self::TRX_ROUND_PRESENT;
/**
* @param callable $callback One of the following:
* - A Closure callback that takes the caller name as its argument
* - A non-Closure callback that takes no arguments
* @param string $fname Calling method @phan-mandatory-param
* @param IDatabase|IDatabase[] $dependeeDbws DB handles which might have pending writes
* upon which this update depends. If any of the handles already has an open transaction,
* a rollback thereof will cause this update to be cancelled (if it has not already run).
* [optional]
*/
public function __construct(
callable $callback,
$fname = ISQLPlatform::CALLER_UNKNOWN,
$dependeeDbws = []
) {
$this->callback = $callback;
$this->fname = $fname;
$dependeeDbws = is_array( $dependeeDbws ) ? $dependeeDbws : [ $dependeeDbws ];
foreach ( $dependeeDbws as $dbw ) {
if ( $dbw->trxLevel() ) {
$dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
}
}
}
public function doUpdate() {
if ( $this->callback instanceof Closure ) {
( $this->callback )( $this->fname );
} elseif ( $this->callback ) {
// For backwards-compatibility with [$classOrObject, 'func'] style callbacks
// where the function happened to already take an optional parameter.
( $this->callback )();
}
}
/**
* @internal This method is public so that it works with onTransactionResolution()
* @param int $trigger
*/
public function cancelOnRollback( $trigger ) {
if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
$this->callback = null;
}
}
public function getOrigin() {
return $this->fname;
}
/**
* @param int $mode One of the class TRX_ROUND_* constants
*/
public function setTransactionRoundRequirement( $mode ) {
$this->trxRoundRequirement = $mode;
}
public function getTransactionRoundRequirement() {
return $this->trxRoundRequirement;
}
}
/** @deprecated class alias since 1.42 */
class_alias( MWCallableUpdate::class, 'MWCallableUpdate' );