Merge "Add SPARQL client to core"
[lhc/web/wiklou.git] / includes / deferred / MWCallableUpdate.php
1 <?php
2
3 use Wikimedia\Rdbms\IDatabase;
4
5 /**
6 * Deferrable Update for closure/callback
7 */
8 class MWCallableUpdate implements DeferrableUpdate, DeferrableCallback {
9 /** @var callable|null */
10 private $callback;
11 /** @var string */
12 private $fname;
13
14 /**
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)
19 */
20 public function __construct( callable $callback, $fname = 'unknown', $dbws = [] ) {
21 $this->callback = $callback;
22 $this->fname = $fname;
23
24 $dbws = is_array( $dbws ) ? $dbws : [ $dbws ];
25 foreach ( $dbws as $dbw ) {
26 if ( $dbw && $dbw->trxLevel() ) {
27 $dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname );
28 }
29 }
30 }
31
32 public function doUpdate() {
33 if ( $this->callback ) {
34 call_user_func( $this->callback );
35 }
36 }
37
38 public function cancelOnRollback( $trigger ) {
39 if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) {
40 $this->callback = null;
41 }
42 }
43
44 public function getOrigin() {
45 return $this->fname;
46 }
47 }