X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FCategory.php;h=1ebd605c355420fb0078d1c10606e2651abd25e6;hb=37751ee23e7b7019307eafe36f18c8450bf2e420;hp=28b566a7f99ff2dd6f3b0cef13edea93ec7db130;hpb=b32abbbd3aa20815fa2113f35f7ecea24e12a1ae;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Category.php b/includes/Category.php index 28b566a7f9..1ebd605c35 100644 --- a/includes/Category.php +++ b/includes/Category.php @@ -60,7 +60,7 @@ class Category { return true; } - $dbr = wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_REPLICA ); $row = $dbr->selectRow( 'category', [ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ], @@ -79,6 +79,11 @@ class Category { $this->mSubcats = 0; $this->mFiles = 0; + # If the title exists, call refreshCounts to add a row for it. + if ( $this->mTitle->exists() ) { + DeferredUpdates::addCallableUpdate( [ $this, 'refreshCounts' ] ); + } + return true; } else { return false; # Fail @@ -259,7 +264,7 @@ class Category { */ public function getMembers( $limit = false, $offset = '' ) { - $dbr = wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_REPLICA ); $conds = [ 'cl_to' => $this->getName(), 'cl_from = page_id' ]; $options = [ 'ORDER BY' => 'cl_sortkey' ]; @@ -331,21 +336,35 @@ class Category { [ 'LOCK IN SHARE MODE' ] ); + $shouldExist = $result->pages > 0 || $this->getTitle()->exists(); + if ( $this->mID ) { - # The category row already exists, so do a plain UPDATE instead - # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap - # in the cat_id sequence. The row may or may not be "affected". - $dbw->update( - 'category', - [ - 'cat_pages' => $result->pages, - 'cat_subcats' => $result->subcats, - 'cat_files' => $result->files - ], - [ 'cat_title' => $this->mName ], - __METHOD__ - ); - } else { + if ( $shouldExist ) { + # The category row already exists, so do a plain UPDATE instead + # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap + # in the cat_id sequence. The row may or may not be "affected". + $dbw->update( + 'category', + [ + 'cat_pages' => $result->pages, + 'cat_subcats' => $result->subcats, + 'cat_files' => $result->files + ], + [ 'cat_title' => $this->mName ], + __METHOD__ + ); + } else { + # The category is empty and has no description page, delete it + $dbw->delete( + 'category', + [ 'cat_title' => $this->mName ], + __METHOD__ + ); + $this->mID = false; + } + } elseif ( $shouldExist ) { + # The category row doesn't exist but should, so create it. Use + # upsert in case of races. $dbw->upsert( 'category', [ @@ -362,6 +381,8 @@ class Category { ], __METHOD__ ); + // @todo: Should we update $this->mID here? Or not since Category + // objects tend to be short lived enough to not matter? } $dbw->endAtomic( __METHOD__ );