diff options
Diffstat (limited to 'includes/ChangesFeed.php')
-rw-r--r-- | includes/ChangesFeed.php | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/includes/ChangesFeed.php b/includes/ChangesFeed.php index a0c2767a..bc50fe02 100644 --- a/includes/ChangesFeed.php +++ b/includes/ChangesFeed.php @@ -1,14 +1,31 @@ <?php +/** + * Feed to Special:RecentChanges and Special:RecentChangesLiked + * + * @ingroup Feed + */ class ChangesFeed { - public $format, $type, $titleMsg, $descMsg; + /** + * Constructor + * + * @param $format String: feed's format (either 'rss' or 'atom') + * @param $type String: type of feed (for cache keys) + */ public function __construct( $format, $type ) { $this->format = $format; $this->type = $type; } + /** + * Get a ChannelFeed subclass object to use + * + * @param $title String: feed's title + * @param $description String: feed's description + * @return ChannelFeed subclass or false on failure + */ public function getFeedObject( $title, $description ) { global $wgSitename, $wgContLanguageCode, $wgFeedClasses, $wgTitle; $feedTitle = "$wgSitename - {$title} [$wgContLanguageCode]"; @@ -18,16 +35,26 @@ class ChangesFeed { $feedTitle, htmlspecialchars( $description ), $wgTitle->getFullUrl() ); } - public function execute( $feed, $rows, $limit=0, $hideminor=false, $lastmod=false, $target='' ) { + /** + * Generates feed's content + * + * @param $feed ChannelFeed subclass object (generally the one returned by getFeedObject()) + * @param $rows ResultWrapper object with rows in recentchanges table + * @param $lastmod Integer: timestamp of the last item in the recentchanges table (only used for the cache key) + * @param $opts FormOptions as in SpecialRecentChanges::getDefaultOptions() + * @return null or true + */ + public function execute( $feed, $rows, $lastmod, $opts ) { global $messageMemc, $wgFeedCacheTimeout; - global $wgSitename, $wgContLanguageCode; + global $wgSitename, $wgLang; if ( !FeedUtils::checkFeedOutput( $this->format ) ) { return; } $timekey = wfMemcKey( $this->type, $this->format, 'timestamp' ); - $key = wfMemcKey( $this->type, $this->format, $limit, $hideminor, $target ); + $optionsHash = md5( serialize( $opts->getAllValues() ) ); + $key = wfMemcKey( $this->type, $this->format, $wgLang->getCode(), $optionsHash ); FeedUtils::checkPurge($timekey, $key); @@ -52,13 +79,28 @@ class ChangesFeed { return true; } + /** + * Save to feed result to $messageMemc + * + * @param $feed String: feed's content + * @param $timekey String: memcached key of the last modification + * @param $key String: memcached key of the content + */ public function saveToCache( $feed, $timekey, $key ) { global $messageMemc; $expire = 3600 * 24; # One day - $messageMemc->set( $key, $feed ); + $messageMemc->set( $key, $feed, $expire ); $messageMemc->set( $timekey, wfTimestamp( TS_MW ), $expire ); } + /** + * Try to load the feed result from $messageMemc + * + * @param $lastmod Integer: timestamp of the last item in the recentchanges table + * @param $timekey String: memcached key of the last modification + * @param $key String: memcached key of the content + * @return feed's content on cache hit or false on cache miss + */ public function loadFromCache( $lastmod, $timekey, $key ) { global $wgFeedCacheTimeout, $messageMemc; $feedLastmod = $messageMemc->get( $timekey ); @@ -86,10 +128,10 @@ class ChangesFeed { } /** - * Generate the feed items given a row from the database. - * @param $rows Database resource with recentchanges rows - * @param $feed Feed object - */ + * Generate the feed items given a row from the database. + * @param $rows DatabaseBase resource with recentchanges rows + * @param $feed Feed object + */ public static function generateFeed( $rows, &$feed ) { wfProfileIn( __METHOD__ ); @@ -113,18 +155,20 @@ class ChangesFeed { foreach( $sorted as $obj ) { $title = Title::makeTitle( $obj->rc_namespace, $obj->rc_title ); $talkpage = $title->getTalkPage(); + // Skip items with deleted content (avoids partially complete/inconsistent output) + if( $obj->rc_deleted ) continue; $item = new FeedItem( $title->getPrefixedText(), FeedUtils::formatDiff( $obj ), - $title->getFullURL( 'diff=' . $obj->rc_this_oldid . '&oldid=prev' ), + $obj->rc_this_oldid ? $title->getFullURL( 'diff=' . $obj->rc_this_oldid . '&oldid=prev' ) : $title->getFullURL(), $obj->rc_timestamp, ($obj->rc_deleted & Revision::DELETED_USER) ? wfMsgHtml('rev-deleted-user') : $obj->rc_user_text, $talkpage->getFullURL() - ); + ); $feed->outItem( $item ); } $feed->outFooter(); wfProfileOut( __METHOD__ ); } -}
\ No newline at end of file +} |