protected function autoreview_current(User $user)
 {
     $this->output("Auto-reviewing all current page versions...\n");
     if (!$user->getID()) {
         $this->output("Invalid user specified.\n");
         return;
     } elseif (!$user->isAllowed('review')) {
         $this->output("User specified (id: {$user->getID()}) does not have \"review\" rights.\n");
         return;
     }
     $db = wfGetDB(DB_MASTER);
     $this->output("Reviewer username: "******"\n");
     $start = $db->selectField('page', 'MIN(page_id)', false, __METHOD__);
     $end = $db->selectField('page', 'MAX(page_id)', false, __METHOD__);
     if (is_null($start) || is_null($end)) {
         $this->output("...page table seems to be empty.\n");
         return;
     }
     # Do remaining chunk
     $end += $this->mBatchSize - 1;
     $blockStart = $start;
     $blockEnd = $start + $this->mBatchSize - 1;
     $count = 0;
     $changed = 0;
     $flags = FlaggedRevs::quickTags(FR_CHECKED);
     // Assume basic level
     while ($blockEnd <= $end) {
         $this->output("...doing page_id from {$blockStart} to {$blockEnd}\n");
         $res = $db->select(array('page', 'revision'), '*', array("page_id BETWEEN {$blockStart} AND {$blockEnd}", 'page_namespace' => FlaggedRevs::getReviewNamespaces(), 'rev_id = page_latest'), __METHOD__);
         # Go through and autoreview the current version of every page...
         foreach ($res as $row) {
             $title = Title::newFromRow($row);
             $rev = Revision::newFromRow($row);
             # Is it already reviewed?
             $frev = FlaggedRevision::newFromTitle($title, $row->page_latest, FR_MASTER);
             # Rev should exist, but to be safe...
             if (!$frev && $rev) {
                 $article = new Article($title);
                 $db->begin();
                 FlaggedRevs::autoReviewEdit($article, $user, $rev, $flags, true);
                 FlaggedRevs::HTMLCacheUpdates($article->getTitle());
                 $db->commit();
                 $changed++;
             }
             $count++;
         }
         $db->freeResult($res);
         $blockStart += $this->mBatchSize - 1;
         $blockEnd += $this->mBatchSize - 1;
         // XXX: Don't let deferred jobs array get absurdly large (bug 24375)
         DeferredUpdates::doUpdates('commit');
         wfWaitForSlaves(5);
     }
     $this->output("Auto-reviewing of all pages complete ..." . "{$count} rows [{$changed} changed]\n");
 }
 /**
  * When an user makes a null-edit we sometimes want to review it...
  * (a) Null undo or rollback
  * (b) Null edit with review box checked
  * Note: called after edit ops are finished
  */
 public static function maybeNullEditReview(Page $article, $user, $text, $s, $m, $a, $b, $flags, $rev, &$status, $baseId)
 {
     global $wgRequest;
     # Revision must *be* null (null edit). We also need the user who made the edit.
     if (!$user || $rev !== null) {
         return true;
     }
     # Rollback/undo or box checked
     $reviewEdit = $wgRequest->getCheck('wpReviewEdit');
     if (!$baseId && !$reviewEdit) {
         return true;
         // short-circuit
     }
     $fa = FlaggableWikiPage::getTitleInstance($article->getTitle());
     $fa->loadPageData('fromdbmaster');
     if (!$fa->isReviewable()) {
         return true;
         // page is not reviewable
     }
     $title = $article->getTitle();
     // convenience
     # Get the current revision ID
     $rev = Revision::newFromTitle($title, false, Revision::READ_LATEST);
     if (!$rev) {
         return true;
         // wtf?
     }
     $flags = null;
     # Is this a rollback/undo that didn't change anything?
     if ($baseId > 0) {
         $frev = FlaggedRevision::newFromTitle($title, $baseId);
         // base rev of null edit
         $pRev = Revision::newFromId($rev->getParentId());
         // current rev parent
         $revIsNull = $pRev && $pRev->getTextId() == $rev->getTextId();
         # Was the edit that we tried to revert to reviewed?
         # We avoid auto-reviewing null edits to avoid confusion (bug 28476).
         if ($frev && !$revIsNull) {
             # Review this revision of the page...
             $ok = FlaggedRevs::autoReviewEdit($article, $user, $rev, $flags);
             if ($ok) {
                 FlaggedRevs::markRevisionPatrolled($rev);
                 // reviewed -> patrolled
                 FlaggedRevs::extraHTMLCacheUpdate($title);
                 return true;
             }
         }
     }
     # Get edit timestamp, it must exist.
     $editTimestamp = $wgRequest->getVal('wpEdittime');
     # Is the page checked off to be reviewed?
     if ($editTimestamp && $reviewEdit && $title->userCan('review')) {
         # Check wpEdittime against current revision's time.
         # If an edit was auto-merged in between, review only up to what
         # was the current rev when this user started editing the page.
         if ($rev->getTimestamp() != $editTimestamp) {
             $dbw = wfGetDB(DB_MASTER);
             $rev = Revision::loadFromTimestamp($dbw, $title, $editTimestamp);
             if (!$rev) {
                 return true;
                 // deleted?
             }
         }
         # Review this revision of the page...
         $ok = FlaggedRevs::autoReviewEdit($article, $user, $rev, $flags, false);
         if ($ok) {
             FlaggedRevs::markRevisionPatrolled($rev);
             // reviewed -> patrolled
             FlaggedRevs::extraHTMLCacheUpdate($title);
         }
     }
     return true;
 }
 /**
  * Submit the form parameters for the page config to the DB.
  * 
  * @return mixed (true on success, error string on failure)
  */
 public function doSubmit()
 {
     # Double-check permissions
     if (!$this->isAllowed()) {
         return 'stablize_denied';
     }
     # Parse and cleanup the expiry time given...
     $expiry = $this->getExpiry();
     if ($expiry === false) {
         return 'stabilize_expiry_invalid';
     } elseif ($expiry !== Block::infinity() && $expiry < wfTimestampNow()) {
         return 'stabilize_expiry_old';
     }
     # Update the DB row with the new config...
     $changed = FRPageConfig::setStabilitySettings($this->page, $this->getNewConfig());
     # Log if this actually changed anything...
     if ($changed) {
         $article = new FlaggableWikiPage($this->page);
         if (FlaggedRevs::useOnlyIfProtected()) {
             # Config may have changed to allow stable versions, so refresh
             # the tracking table to account for any hidden reviewed versions...
             $frev = FlaggedRevision::determineStable($this->page, FR_MASTER);
             if ($frev) {
                 $article->updateStableVersion($frev);
             } else {
                 $article->clearStableVersion();
             }
         }
         # Update logs and make a null edit
         $nullRev = $this->updateLogsAndHistory($article);
         # Null edit may have been auto-reviewed already
         $frev = FlaggedRevision::newFromTitle($this->page, $nullRev->getId(), FR_MASTER);
         $updatesDone = (bool) $frev;
         // stableVersionUpdates() already called?
         # Check if this null edit is to be reviewed...
         if ($this->reviewThis && !$frev) {
             $flags = null;
             # Review this revision of the page...
             $ok = FlaggedRevs::autoReviewEdit($article, $this->user, $nullRev, $flags, true);
             if ($ok) {
                 FlaggedRevs::markRevisionPatrolled($nullRev);
                 // reviewed -> patrolled
                 $updatesDone = true;
                 // stableVersionUpdates() already called
             }
         }
         # Update page and tracking tables and clear cache.
         if (!$updatesDone) {
             FlaggedRevs::stableVersionUpdates($this->page);
         }
     }
     # Apply watchlist checkbox value (may be NULL)
     $this->updateWatchlist();
     # Take this opportunity to purge out expired configurations
     FRPageConfig::purgeExpiredConfigurations();
     return true;
 }