3 use Wikimedia\Rdbms\IDatabase
;
6 * Deferrable Update for closure/callback
8 class MWCallableUpdate
implements DeferrableUpdate
, DeferrableCallback
{
9 /** @var callable|null */
15 * @param callable $callback
16 * @param string $fname Calling method
17 * @param IDatabase|IDatabase[]|null $dbws Abort if any of the specified DB handles have
18 * a currently pending transaction which later gets rolled back [optional] (since 1.28)
20 public function __construct( callable
$callback, $fname = 'unknown', $dbws = [] ) {
21 $this->callback
= $callback;
22 $this->fname
= $fname;
24 $dbws = is_array( $dbws ) ?
$dbws : [ $dbws ];
25 foreach ( $dbws as $dbw ) {
26 if ( $dbw && $dbw->trxLevel() ) {
27 $dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
32 public function doUpdate() {
33 if ( $this->callback
) {
34 call_user_func( $this->callback
);
39 * @private This method is public so that it works with onTransactionResolution()
42 public function cancelOnRollback( $trigger ) {
43 if ( $trigger === IDatabase
::TRIGGER_ROLLBACK
) {
44 $this->callback
= null;
48 public function getOrigin() {