X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FLinksUpdate.php;h=716e7d80722747599edbb83a0ed54b6af1e7e40d;hb=72b0e4cdfa6212d412e741b15c7633f8be7d40cc;hp=a391185a1e4bf68717f0efe9961f728ab033b230;hpb=99839bf5f0ea8bc7182a8ed1b41773bb9cf09c71;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/LinksUpdate.php b/includes/LinksUpdate.php index a391185a1e..716e7d8072 100644 --- a/includes/LinksUpdate.php +++ b/includes/LinksUpdate.php @@ -2,6 +2,21 @@ /** * See docs/deferred.txt * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * * @todo document (e.g. one-sentence top-level class description). */ class LinksUpdate { @@ -11,6 +26,7 @@ class LinksUpdate { */ var $mId, //!< Page ID of the article linked from $mTitle, //!< Title object of the article linked from + $mParserOutput, //!< Parser output $mLinks, //!< Map of title strings to IDs for the links in the document $mImages, //!< DB keys of the images used, in the array key only $mTemplates, //!< Map of title strings to IDs for the template references, including broken ones @@ -41,8 +57,8 @@ class LinksUpdate { $this->mDb = wfGetDB( DB_MASTER ); if ( !is_object( $title ) ) { - throw new MWException( "The calling convention to LinksUpdate::LinksUpdate() has changed. " . - "Please see Article::editUpdates() for an invocation example.\n" ); + throw new MWException( "The calling convention to LinksUpdate::__construct() has changed. " . + "Please see WikiPage::doEditUpdates() for an invocation example.\n" ); } $this->mTitle = $title; $this->mId = $title->getArticleID(); @@ -67,12 +83,15 @@ class LinksUpdate { $this->mInterlangs[$key] = $title; } - foreach ( $this->mCategories as $cat => &$sortkey ) { + foreach ( $this->mCategories as &$sortkey ) { # If the sortkey is longer then 255 bytes, # it truncated by DB, and then doesn't get # matched when comparing existing vs current # categories, causing bug 25254. - $sortkey = substr( $sortkey, 0, 255 ); + # Also. substr behaves weird when given "". + if ( $sortkey !== '' ) { + $sortkey = substr( $sortkey, 0, 255 ); + } } $this->mRecursive = $recursive; @@ -107,7 +126,8 @@ class LinksUpdate { $existing = $this->getExistingImages(); $imageDeletes = $this->getImageDeletions( $existing ); - $this->incrTableUpdate( 'imagelinks', 'il', $imageDeletes, $this->getImageInsertions( $existing ) ); + $this->incrTableUpdate( 'imagelinks', 'il', $imageDeletes, + $this->getImageInsertions( $existing ) ); # Invalidate all image description pages which had links added or removed $imageUpdates = $imageDeletes + array_diff_key( $this->mImages, $existing ); @@ -116,7 +136,7 @@ class LinksUpdate { # External links $existing = $this->getExistingExternals(); $this->incrTableUpdate( 'externallinks', 'el', $this->getExternalDeletions( $existing ), - $this->getExternalInsertions( $existing ) ); + $this->getExternalInsertions( $existing ) ); # Language links $existing = $this->getExistingInterlangs(); @@ -138,7 +158,8 @@ class LinksUpdate { $categoryDeletes = $this->getCategoryDeletions( $existing ); - $this->incrTableUpdate( 'categorylinks', 'cl', $categoryDeletes, $this->getCategoryInsertions( $existing ) ); + $this->incrTableUpdate( 'categorylinks', 'cl', $categoryDeletes, + $this->getCategoryInsertions( $existing ) ); # Invalidate all categories which were added, deleted or changed (set symmetric difference) $categoryInserts = array_diff_assoc( $this->mCategories, $existing ); @@ -151,7 +172,8 @@ class LinksUpdate { $propertiesDeletes = $this->getPropertyDeletions( $existing ); - $this->incrTableUpdate( 'page_props', 'pp', $propertiesDeletes, $this->getPropertyInsertions( $existing ) ); + $this->incrTableUpdate( 'page_props', 'pp', $propertiesDeletes, + $this->getPropertyInsertions( $existing ) ); # Invalidate the necessary pages $changed = $propertiesDeletes + array_diff_assoc( $this->mProperties, $existing ); @@ -220,6 +242,7 @@ class LinksUpdate { foreach ( $batches as $batch ) { list( $start, $end ) = $batch; $params = array( + 'table' => 'templatelinks', 'start' => $start, 'end' => $end, ); @@ -275,27 +298,38 @@ class LinksUpdate { ); } + /** + * @param $cats + */ function invalidateCategories( $cats ) { $this->invalidatePages( NS_CATEGORY, array_keys( $cats ) ); } /** * Update all the appropriate counts in the category table. - * @param $added associative array of category name => sort key - * @param $deleted associative array of category name => sort key + * @param $added array associative array of category name => sort key + * @param $deleted array associative array of category name => sort key */ function updateCategoryCounts( $added, $deleted ) { - $a = new Article($this->mTitle); + $a = WikiPage::factory( $this->mTitle ); $a->updateCategoryCounts( array_keys( $added ), array_keys( $deleted ) ); } + /** + * @param $images + */ function invalidateImageDescriptions( $images ) { $this->invalidatePages( NS_FILE, array_keys( $images ) ); } - function dumbTableUpdate( $table, $insertions, $fromField ) { + /** + * @param $table + * @param $insertions + * @param $fromField + */ + private function dumbTableUpdate( $table, $insertions, $fromField ) { $this->mDb->delete( $table, array( $fromField => $this->mId ), __METHOD__ ); if ( count( $insertions ) ) { # The link array was constructed without FOR UPDATE, so there may @@ -307,7 +341,10 @@ class LinksUpdate { /** * Update a table by doing a delete query then an insert query - * @private + * @param $table + * @param $prefix + * @param $deletions + * @param $insertions */ function incrTableUpdate( $table, $prefix, $deletions, $insertions ) { if ( $table == 'page_props' ) { @@ -350,16 +387,18 @@ class LinksUpdate { } } - /** * Get an array of pagelinks insertions for passing to the DB * Skips the titles specified by the 2-D array $existing - * @private + * @param $existing array + * @return array */ - function getLinkInsertions( $existing = array() ) { + private function getLinkInsertions( $existing = array() ) { $arr = array(); foreach( $this->mLinks as $ns => $dbkeys ) { - $diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys; + $diffs = isset( $existing[$ns] ) + ? array_diff_key( $dbkeys, $existing[$ns] ) + : $dbkeys; foreach ( $diffs as $dbk => $id ) { $arr[] = array( 'pl_from' => $this->mId, @@ -373,9 +412,10 @@ class LinksUpdate { /** * Get an array of template insertions. Like getLinkInsertions() - * @private + * @param $existing array + * @return array */ - function getTemplateInsertions( $existing = array() ) { + private function getTemplateInsertions( $existing = array() ) { $arr = array(); foreach( $this->mTemplates as $ns => $dbkeys ) { $diffs = isset( $existing[$ns] ) ? array_diff_key( $dbkeys, $existing[$ns] ) : $dbkeys; @@ -393,9 +433,10 @@ class LinksUpdate { /** * Get an array of image insertions * Skips the names specified in $existing - * @private + * @param $existing array + * @return array */ - function getImageInsertions( $existing = array() ) { + private function getImageInsertions( $existing = array() ) { $arr = array(); $diffs = array_diff_key( $this->mImages, $existing ); foreach( $diffs as $iname => $dummy ) { @@ -409,17 +450,20 @@ class LinksUpdate { /** * Get an array of externallinks insertions. Skips the names specified in $existing - * @private + * @param $existing array + * @return array */ - function getExternalInsertions( $existing = array() ) { + private function getExternalInsertions( $existing = array() ) { $arr = array(); $diffs = array_diff_key( $this->mExternals, $existing ); foreach( $diffs as $url => $dummy ) { - $arr[] = array( - 'el_from' => $this->mId, - 'el_to' => $url, - 'el_index' => wfMakeUrlIndex( $url ), - ); + foreach( wfMakeUrlIndexes( $url ) as $index ) { + $arr[] = array( + 'el_from' => $this->mId, + 'el_to' => $url, + 'el_index' => $index, + ); + } } return $arr; } @@ -427,15 +471,16 @@ class LinksUpdate { /** * Get an array of category insertions * - * @param $existing Array mapping existing category names to sort keys. If both + * @param $existing array mapping existing category names to sort keys. If both * match a link in $this, the link will be omitted from the output - * @private + * + * @return array */ - function getCategoryInsertions( $existing = array() ) { + private function getCategoryInsertions( $existing = array() ) { global $wgContLang, $wgCategoryCollation; $diffs = array_diff_assoc( $this->mCategories, $existing ); $arr = array(); - foreach ( $diffs as $name => $sortkey ) { + foreach ( $diffs as $name => $prefix ) { $nt = Title::makeTitleSafe( NS_CATEGORY, $name ); $wgContLang->findVariantLink( $name, $nt, true ); @@ -447,23 +492,12 @@ class LinksUpdate { $type = 'page'; } - # TODO: This is kind of wrong, because someone might set a sort - # key prefix that's the same as the default sortkey for the - # title. This should be fixed by refactoring code to replace - # $sortkey in this array by a prefix, but it's basically harmless - # (Title::moveTo() has had the same issue for a long time). - if ( $this->mTitle->getCategorySortkey() == $sortkey ) { - $prefix = ''; - $sortkey = $wgContLang->convertToSortkey( $sortkey ); - } else { - # Treat custom sortkeys as a prefix, so that if multiple - # things are forced to sort as '*' or something, they'll - # sort properly in the category rather than in page_id - # order or such. - $prefix = $sortkey; - $sortkey = $wgContLang->convertToSortkey( - $this->mTitle->getCategorySortkey( $prefix ) ); - } + # Treat custom sortkeys as a prefix, so that if multiple + # things are forced to sort as '*' or something, they'll + # sort properly in the category rather than in page_id + # order or such. + $sortkey = Collation::singleton()->getSortKey( + $this->mTitle->getCategorySortkey( $prefix ) ); $arr[] = array( 'cl_from' => $this->mId, @@ -482,23 +516,26 @@ class LinksUpdate { * Get an array of interlanguage link insertions * * @param $existing Array mapping existing language codes to titles - * @private + * + * @return array */ - function getInterlangInsertions( $existing = array() ) { - $diffs = array_diff_assoc( $this->mInterlangs, $existing ); - $arr = array(); - foreach( $diffs as $lang => $title ) { - $arr[] = array( - 'll_from' => $this->mId, - 'll_lang' => $lang, - 'll_title' => $title - ); - } - return $arr; + private function getInterlangInsertions( $existing = array() ) { + $diffs = array_diff_assoc( $this->mInterlangs, $existing ); + $arr = array(); + foreach( $diffs as $lang => $title ) { + $arr[] = array( + 'll_from' => $this->mId, + 'll_lang' => $lang, + 'll_title' => $title + ); + } + return $arr; } /** * Get an array of page property insertions + * @param $existing array + * @return array */ function getPropertyInsertions( $existing = array() ) { $diffs = array_diff_assoc( $this->mProperties, $existing ); @@ -516,9 +553,10 @@ class LinksUpdate { /** * Get an array of interwiki insertions for passing to the DB * Skips the titles specified by the 2-D array $existing - * @private + * @param $existing array + * @return array */ - function getInterwikiInsertions( $existing = array() ) { + private function getInterwikiInsertions( $existing = array() ) { $arr = array(); foreach( $this->mInterwikis as $prefix => $dbkeys ) { $diffs = isset( $existing[$prefix] ) ? array_diff_key( $dbkeys, $existing[$prefix] ) : $dbkeys; @@ -536,9 +574,10 @@ class LinksUpdate { /** * Given an array of existing links, returns those links which are not in $this * and thus should be deleted. - * @private + * @param $existing array + * @return array */ - function getLinkDeletions( $existing ) { + private function getLinkDeletions( $existing ) { $del = array(); foreach ( $existing as $ns => $dbkeys ) { if ( isset( $this->mLinks[$ns] ) ) { @@ -553,9 +592,10 @@ class LinksUpdate { /** * Given an array of existing templates, returns those templates which are not in $this * and thus should be deleted. - * @private + * @param $existing array + * @return array */ - function getTemplateDeletions( $existing ) { + private function getTemplateDeletions( $existing ) { $del = array(); foreach ( $existing as $ns => $dbkeys ) { if ( isset( $this->mTemplates[$ns] ) ) { @@ -570,42 +610,47 @@ class LinksUpdate { /** * Given an array of existing images, returns those images which are not in $this * and thus should be deleted. - * @private + * @param $existing array + * @return array */ - function getImageDeletions( $existing ) { + private function getImageDeletions( $existing ) { return array_diff_key( $existing, $this->mImages ); } /** * Given an array of existing external links, returns those links which are not * in $this and thus should be deleted. - * @private + * @param $existing array + * @return array */ - function getExternalDeletions( $existing ) { + private function getExternalDeletions( $existing ) { return array_diff_key( $existing, $this->mExternals ); } /** * Given an array of existing categories, returns those categories which are not in $this * and thus should be deleted. - * @private + * @param $existing array + * @return array */ - function getCategoryDeletions( $existing ) { + private function getCategoryDeletions( $existing ) { return array_diff_assoc( $existing, $this->mCategories ); } /** * Given an array of existing interlanguage links, returns those links which are not * in $this and thus should be deleted. - * @private + * @param $existing array + * @return array */ - function getInterlangDeletions( $existing ) { - return array_diff_assoc( $existing, $this->mInterlangs ); + private function getInterlangDeletions( $existing ) { + return array_diff_assoc( $existing, $this->mInterlangs ); } /** * Get array of properties which should be deleted. - * @private + * @param $existing array + * @return array */ function getPropertyDeletions( $existing ) { return array_diff_assoc( $existing, $this->mProperties ); @@ -614,9 +659,10 @@ class LinksUpdate { /** * Given an array of existing interwiki links, returns those links which are not in $this * and thus should be deleted. - * @private + * @param $existing array + * @return array */ - function getInterwikiDeletions( $existing ) { + private function getInterwikiDeletions( $existing ) { $del = array(); foreach ( $existing as $prefix => $dbkeys ) { if ( isset( $this->mInterwikis[$prefix] ) ) { @@ -630,9 +676,10 @@ class LinksUpdate { /** * Get an array of existing links, as a 2-D array - * @private + * + * @return array */ - function getExistingLinks() { + private function getExistingLinks() { $res = $this->mDb->select( 'pagelinks', array( 'pl_namespace', 'pl_title' ), array( 'pl_from' => $this->mId ), __METHOD__, $this->mOptions ); $arr = array(); @@ -647,9 +694,10 @@ class LinksUpdate { /** * Get an array of existing templates, as a 2-D array - * @private + * + * @return array */ - function getExistingTemplates() { + private function getExistingTemplates() { $res = $this->mDb->select( 'templatelinks', array( 'tl_namespace', 'tl_title' ), array( 'tl_from' => $this->mId ), __METHOD__, $this->mOptions ); $arr = array(); @@ -664,9 +712,10 @@ class LinksUpdate { /** * Get an array of existing images, image names in the keys - * @private + * + * @return array */ - function getExistingImages() { + private function getExistingImages() { $res = $this->mDb->select( 'imagelinks', array( 'il_to' ), array( 'il_from' => $this->mId ), __METHOD__, $this->mOptions ); $arr = array(); @@ -678,9 +727,10 @@ class LinksUpdate { /** * Get an array of existing external links, URLs in the keys - * @private + * + * @return array */ - function getExistingExternals() { + private function getExistingExternals() { $res = $this->mDb->select( 'externallinks', array( 'el_to' ), array( 'el_from' => $this->mId ), __METHOD__, $this->mOptions ); $arr = array(); @@ -692,18 +742,15 @@ class LinksUpdate { /** * Get an array of existing categories, with the name in the key and sort key in the value. - * @private + * + * @return array */ - function getExistingCategories() { + private function getExistingCategories() { $res = $this->mDb->select( 'categorylinks', array( 'cl_to', 'cl_sortkey_prefix' ), array( 'cl_from' => $this->mId ), __METHOD__, $this->mOptions ); $arr = array(); foreach ( $res as $row ) { - if ( $row->cl_sortkey_prefix !== '' ) { - $arr[$row->cl_to] = $row->cl_sortkey_prefix; - } else { - $arr[$row->cl_to] = $this->mTitle->getCategorySortkey(); - } + $arr[$row->cl_to] = $row->cl_sortkey_prefix; } return $arr; } @@ -711,9 +758,10 @@ class LinksUpdate { /** * Get an array of existing interlanguage links, with the language code in the key and the * title in the value. - * @private + * + * @return array */ - function getExistingInterlangs() { + private function getExistingInterlangs() { $res = $this->mDb->select( 'langlinks', array( 'll_lang', 'll_title' ), array( 'll_from' => $this->mId ), __METHOD__, $this->mOptions ); $arr = array(); @@ -742,9 +790,10 @@ class LinksUpdate { /** * Get an array of existing categories, with the name in the key and sort key in the value. - * @private + * + * @return array */ - function getExistingProperties() { + private function getExistingProperties() { $res = $this->mDb->select( 'page_props', array( 'pp_propname', 'pp_value' ), array( 'pp_page' => $this->mId ), __METHOD__, $this->mOptions ); $arr = array(); @@ -754,16 +803,26 @@ class LinksUpdate { return $arr; } - /** * Return the title object of the page being updated + * @return Title */ - function getTitle() { + public function getTitle() { return $this->mTitle; } - + + /** + * Returns parser output + * @since 1.19 + * @return ParserOutput + */ + public function getParserOutput() { + return $this->mParserOutput; + } + /** * Return the list of images used as generated by the parser + * @return array */ public function getImages() { return $this->mImages; @@ -771,8 +830,9 @@ class LinksUpdate { /** * Invalidate any necessary link lists related to page property changes + * @param $changed */ - function invalidateProperties( $changed ) { + private function invalidateProperties( $changed ) { global $wgPagePropLinkInvalidations; foreach ( $changed as $name => $value ) {