Completed
Branch master (939199)
by
unknown
39:35
created

includes/deferred/AutoCommitUpdate.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/**
4
 * Deferrable Update for closure/callback updates that should use auto-commit mode
5
 * @since 1.28
6
 */
7
class AutoCommitUpdate implements DeferrableUpdate, DeferrableCallback {
8
	/** @var IDatabase */
9
	private $dbw;
10
	/** @var string */
11
	private $fname;
12
	/** @var callable|null */
13
	private $callback;
14
15
	/**
16
	 * @param IDatabase $dbw
17
	 * @param string $fname Caller name (usually __METHOD__)
18
	 * @param callable $callback Callback that takes (IDatabase, method name string)
19
	 */
20 View Code Duplication
	public function __construct( IDatabase $dbw, $fname, callable $callback ) {
21
		$this->dbw = $dbw;
22
		$this->fname = $fname;
23
		$this->callback = $callback;
24
25
		if ( $this->dbw->trxLevel() ) {
26
			$this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
27
		}
28
	}
29
30
	public function doUpdate() {
31
		if ( !$this->callback ) {
32
			return;
33
		}
34
35
		$autoTrx = $this->dbw->getFlag( DBO_TRX );
36
		$this->dbw->clearFlag( DBO_TRX );
37
		try {
38
			/** @var Exception $e */
39
			$e = null;
40
			call_user_func_array( $this->callback, [ $this->dbw, $this->fname ] );
41
		} catch ( Exception $e ) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
42
		}
43
		if ( $autoTrx ) {
44
			$this->dbw->setFlag( DBO_TRX );
45
		}
46
		if ( $e ) {
47
			throw $e;
48
		}
49
	}
50
51
	public function cancelOnRollback( $trigger ) {
52
		if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
53
			$this->callback = null;
54
		}
55
	}
56
57
	public function getOrigin() {
58
		return $this->fname;
59
	}
60
}
61