/**
  * Update the page tables with a new stable version.
  * @param WikiPage|Title $page
  * @param FlaggedRevision|null $sv, the new stable version (optional)
  * @param FlaggedRevision|null $oldSv, the old stable version (optional)
  * @param Object editInfo Article edit info about the current revision (optional)
  * @return bool stable version text/file changed and FR_INCLUDES_STABLE
  */
 public static function stableVersionUpdates($page, $sv = null, $oldSv = null, $editInfo = null)
 {
     if ($page instanceof FlaggableWikiPage) {
         $article = $page;
     } elseif ($page instanceof WikiPage) {
         $article = FlaggableWikiPage::getTitleInstance($page->getTitle());
     } elseif ($page instanceof Title) {
         $article = FlaggableWikiPage::getTitleInstance($page);
     } else {
         throw new MWException("First argument must be a Title or WikiPage.");
     }
     $title = $article->getTitle();
     $changed = false;
     if ($oldSv === null) {
         // optional
         $oldSv = FlaggedRevision::newFromStable($title, FR_MASTER);
     }
     if ($sv === null) {
         // optional
         $sv = FlaggedRevision::determineStable($title, FR_MASTER);
     }
     if (!$sv) {
         # Empty flaggedrevs data for this page if there is no stable version
         $article->clearStableVersion();
         # Check if pages using this need to be refreshed...
         if (FlaggedRevs::inclusionSetting() == FR_INCLUDES_STABLE) {
             $changed = (bool) $oldSv;
         }
     } else {
         # Update flagged page related fields
         $article->updateStableVersion($sv, $editInfo ? $editInfo->revid : null);
         # Check if pages using this need to be invalidated/purged...
         if (FlaggedRevs::inclusionSetting() == FR_INCLUDES_STABLE) {
             $changed = !$oldSv || $sv->getRevId() != $oldSv->getRevId() || $sv->getFileTimestamp() != $oldSv->getFileTimestamp() || $sv->getFileSha1() != $oldSv->getFileSha1();
         }
         # Update template/file version cache...
         if ($editInfo && $sv->getRevId() != $editInfo->revid) {
             FRInclusionCache::setRevIncludes($title, $editInfo->revid, $editInfo->output);
         }
     }
     # Lazily rebuild dependancies on next parse (we invalidate below)
     FlaggedRevs::clearStableOnlyDeps($title->getArticleID());
     # Clear page cache
     $title->invalidateCache();
     self::purgeSquid($title);
     return $changed;
 }