X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FCategory.php;h=3352c2c2b039dc0eeec6e6e8c55e37d9ab5b4424;hb=9d00d8783e9d74343fc0ea34ab228ce70684e4e4;hp=fe3dd0d80ea32e941c1ee4cdf36f8e9fd9efd6cc;hpb=722f51c7e809e13d85ea7735715f9d8548082120;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Category.php b/includes/Category.php index fe3dd0d80e..3352c2c2b0 100644 --- a/includes/Category.php +++ b/includes/Category.php @@ -337,13 +337,7 @@ class Category { // Lock the `category` row before locking `categorylinks` rows to try // to avoid deadlocks with LinksDeletionUpdate (T195397) - $dbw->selectField( - 'category', - 1, - [ 'cat_title' => $this->mName ], - __METHOD__, - [ 'FOR UPDATE' ] - ); + $dbw->lockForUpdate( 'category', [ 'cat_title' => $this->mName ], __METHOD__ ); // Lock all the `categorylinks` records and gaps for this category; // this is a separate query due to postgres/oracle limitations @@ -426,4 +420,45 @@ class Category { return true; } + + /** + * Call refreshCounts() if there are no entries in the categorylinks table + * or if the category table has a row that states that there are no entries + * + * Due to lock errors or other failures, the precomputed counts can get out of sync, + * making it hard to know when to delete the category row without checking the + * categorylinks table. + * + * @return bool Whether links were refreshed + * @since 1.32 + */ + public function refreshCountsIfEmpty() { + $dbw = wfGetDB( DB_MASTER ); + + $hasLink = $dbw->selectField( + 'categorylinks', + '1', + [ 'cl_to' => $this->getName() ], + __METHOD__ + ); + if ( !$hasLink ) { + $this->refreshCounts(); // delete any category table entry + + return true; + } + + $hasBadRow = $dbw->selectField( + 'category', + '1', + [ 'cat_title' => $this->getName(), 'cat_pages <= 0' ], + __METHOD__ + ); + if ( $hasBadRow ) { + $this->refreshCounts(); // clean up this row + + return true; + } + + return false; + } }