X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FWatchedItem.php;h=73b0b937b087dcbc613e673ea1886ef3e293f775;hb=7845227f8f9155a73a66e037b1b9843c59a28f93;hp=4d226924a32da027e165d5444701931cb90bfd89;hpb=ddffe4453958f13805a99e5bff58229d203c5ea5;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/WatchedItem.php b/includes/WatchedItem.php index 4d226924a3..73b0b937b0 100644 --- a/includes/WatchedItem.php +++ b/includes/WatchedItem.php @@ -27,20 +27,6 @@ * @ingroup Watchlist */ class WatchedItem { - /** - * Constant to specify that user rights 'editmywatchlist' and - * 'viewmywatchlist' should not be checked. - * @since 1.22 - */ - const IGNORE_USER_RIGHTS = 0; - - /** - * Constant to specify that user rights 'editmywatchlist' and - * 'viewmywatchlist' should be checked. - * @since 1.22 - */ - const CHECK_USER_RIGHTS = 1; - /** @var Title */ public $mTitle; @@ -59,6 +45,31 @@ class WatchedItem { /** @var string */ private $timestamp; + /** + * Constant to specify that user rights 'editmywatchlist' and + * 'viewmywatchlist' should not be checked. + * @since 1.22 + */ + const IGNORE_USER_RIGHTS = 0; + + /** + * Constant to specify that user rights 'editmywatchlist' and + * 'viewmywatchlist' should be checked. + * @since 1.22 + */ + const CHECK_USER_RIGHTS = 1; + + /** + * Do DB master updates right now + * @since 1.26 + */ + const IMMEDIATE = 0; + /** + * Do DB master updates via the job queue + * @since 1.26 + */ + const DEFERRED = 1; + /** * Create a WatchedItem object with the given user and title * @since 1.22 $checkRights parameter added @@ -208,8 +219,13 @@ class WatchedItem { * @param bool $force Whether to force the write query to be executed even if the * page is not watched or the notification timestamp is already NULL. * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed. + * @mode int $mode WatchedItem::DEFERRED/IMMEDIATE */ - public function resetNotificationTimestamp( $force = '', $oldid = 0 ) { + public function resetNotificationTimestamp( + $force = '', $oldid = 0, $mode = self::IMMEDIATE + ) { + global $wgActivityUpdatesUseJobQueue; + // Only loggedin user can have a watchlist if ( wfReadOnly() || $this->mUser->isAnon() || !$this->isAllowed( 'editmywatchlist' ) ) { return; @@ -240,11 +256,7 @@ class WatchedItem { } else { // Oldid given and isn't the latest; update the timestamp. // This will result in no further notification emails being sent! - $dbr = wfGetDB( DB_SLAVE ); - $notificationTimestamp = $dbr->selectField( - 'revision', 'rev_timestamp', - array( 'rev_page' => $title->getArticleID(), 'rev_id' => $oldid ) - ); + $notificationTimestamp = Revision::getTimestampFromId( $title, $oldid ); // We need to go one second to the future because of various strict comparisons // throughout the codebase $ts = new MWTimestamp( $notificationTimestamp ); @@ -262,11 +274,30 @@ class WatchedItem { } } - // If the page is watched by the user (or may be watched), update the timestamp on any - // any matching rows - $dbw = wfGetDB( DB_MASTER ); - $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $notificationTimestamp ), - $this->dbCond(), __METHOD__ ); + // If the page is watched by the user (or may be watched), update the timestamp + if ( $mode === self::DEFERRED && $wgActivityUpdatesUseJobQueue ) { + JobQueueGroup::singleton()->push( + EnqueueJob::newFromLocalJobs( new JobSpecification( + 'activityUpdateJob', + array( + 'type' => 'updateWatchlistNotification', + 'userid' => $this->getUserId(), + 'notifTime' => $notificationTimestamp, + 'curTime' => time() + ), + array( 'removeDuplicates' => true ), + $title + ) ) + ); + } else { + $dbw = wfGetDB( DB_MASTER ); + $dbw->update( 'watchlist', + array( 'wl_notificationtimestamp' => $notificationTimestamp ), + $this->dbCond(), + __METHOD__ + ); + } + $this->timestamp = null; }