/** * Updates the flaggedpage_pending table * @param int $pageId Page ID * @abstract int $latest Latest revision * @return void */ protected static function updatePendingList($pageId, $latest) { $data = array(); # Get the highest tier used on this wiki $level = FlaggedRevs::highestReviewTier(); $dbw = wfGetDB(DB_MASTER); # Update pending times for each level, going from highest to lowest $higherLevelId = 0; $higherLevelTS = ''; while ($level >= 0) { # Get the latest revision of this level... # Any revision of one tier is also a revision of lower tiers. # Instead of doing fr_quality > X queries we do exact comparisons # for better INDEX usage. However, in order to treat a rev as the # latest tier X rev, we make sure it is newer than all tier (X+1) revs. $row = $dbw->selectRow(array('flaggedrevs', 'revision'), array('fr_rev_id', 'rev_timestamp'), array('fr_page_id' => $pageId, 'fr_quality' => $level, 'fr_rev_timestamp > ' . $dbw->addQuotes($higherLevelTS), 'rev_id = fr_rev_id', 'rev_page = fr_page_id', 'rev_deleted & ' . Revision::DELETED_TEXT => 0), __METHOD__, array('ORDER BY' => 'fr_rev_timestamp DESC', 'LIMIT' => 1)); # If there is a revision of this level, track it... # Revisions accepted to one tier count as accepted # at the lower tiers (i.e. quality -> checked). if ($row) { $id = $row->fr_rev_id; $ts = $row->rev_timestamp; } else { // use previous rev of higher tier (if any) $id = $higherLevelId; $ts = $higherLevelTS; } # Get edits that actually are pending... if ($id && $latest > $id) { # Get the timestamp of the edit after this version (if any) $nextTimestamp = $dbw->selectField('revision', 'rev_timestamp', array('rev_page' => $pageId, "rev_timestamp > " . $dbw->addQuotes($ts)), __METHOD__, array('ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1)); $data[] = array('fpp_page_id' => $pageId, 'fpp_quality' => $level, 'fpp_rev_id' => $id, 'fpp_pending_since' => $nextTimestamp); $higherLevelId = $id; $higherLevelTS = $ts; } $level--; } # Clear any old junk, and insert new rows $dbw->delete('flaggedpage_pending', array('fpp_page_id' => $pageId), __METHOD__); $dbw->insert('flaggedpage_pending', $data, __METHOD__); }