Merge "Revert "Use display name in category page subheadings if provided""
[lhc/web/wiklou.git] / includes / deferred / AutoCommitUpdate.php
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 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 ) {
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 }