diff options
Diffstat (limited to 'www/wiki/includes/deferred/AtomicSectionUpdate.php')
-rw-r--r-- | www/wiki/includes/deferred/AtomicSectionUpdate.php | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/www/wiki/includes/deferred/AtomicSectionUpdate.php b/www/wiki/includes/deferred/AtomicSectionUpdate.php new file mode 100644 index 00000000..8b62989b --- /dev/null +++ b/www/wiki/includes/deferred/AtomicSectionUpdate.php @@ -0,0 +1,48 @@ +<?php + +use Wikimedia\Rdbms\IDatabase; + +/** + * Deferrable Update for closure/callback updates via IDatabase::doAtomicSection() + * @since 1.27 + */ +class AtomicSectionUpdate implements DeferrableUpdate, DeferrableCallback { + /** @var IDatabase */ + private $dbw; + /** @var string */ + private $fname; + /** @var callable|null */ + private $callback; + + /** + * @param IDatabase $dbw + * @param string $fname Caller name (usually __METHOD__) + * @param callable $callback + * @see IDatabase::doAtomicSection() + */ + public function __construct( IDatabase $dbw, $fname, callable $callback ) { + $this->dbw = $dbw; + $this->fname = $fname; + $this->callback = $callback; + + if ( $this->dbw->trxLevel() ) { + $this->dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname ); + } + } + + public function doUpdate() { + if ( $this->callback ) { + $this->dbw->doAtomicSection( $this->fname, $this->callback ); + } + } + + public function cancelOnRollback( $trigger ) { + if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) { + $this->callback = null; + } + } + + public function getOrigin() { + return $this->fname; + } +} |