X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FCategory.php;h=38601725700e8111d3c52849e0b5618422e36f8d;hb=058aec4c76129b7ee8541692a8a48f8046e15bb6;hp=322b0530b573a051eea82041920cab1286293e77;hpb=5bd9d408c59b3bd0a39cc528bf2cabd7c3c40eb9;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Category.php b/includes/Category.php index 322b0530b5..3860172570 100644 --- a/includes/Category.php +++ b/includes/Category.php @@ -60,8 +60,6 @@ class Category { return true; } - wfProfileIn( __METHOD__ ); - $dbr = wfGetDB( DB_SLAVE ); $row = $dbr->selectRow( 'category', @@ -70,8 +68,6 @@ class Category { __METHOD__ ); - wfProfileOut( __METHOD__ ); - if ( !$row ) { # Okay, there were no contents. Nothing to initialize. if ( $this->mTitle ) { @@ -258,7 +254,6 @@ class Category { * @return TitleArray TitleArray object for category members. */ public function getMembers( $limit = false, $offset = '' ) { - wfProfileIn( __METHOD__ ); $dbr = wfGetDB( DB_SLAVE ); @@ -284,8 +279,6 @@ class Category { ) ); - wfProfileOut( __METHOD__ ); - return $result; } @@ -311,34 +304,16 @@ class Category { return false; } - # Note, we must use names for this, since categorylinks does. - if ( $this->mName === null ) { - if ( !$this->initialize() ) { - return false; - } + # If we have just a category name, find out whether there is an + # existing row. Or if we have just an ID, get the name, because + # that's what categorylinks uses. + if ( !$this->initialize() ) { + return false; } - wfProfileIn( __METHOD__ ); - $dbw = wfGetDB( DB_MASTER ); $dbw->startAtomic( __METHOD__ ); - # Insert the row if it doesn't exist yet (e.g., this is being run via - # update.php from a pre-1.16 schema). TODO: This will cause lots and - # lots of gaps on some non-MySQL DBMSes if you run populateCategory.php - # repeatedly. Plus it's an extra query that's unneeded almost all the - # time. This should be rewritten somehow, probably. - $seqVal = $dbw->nextSequenceValue( 'category_cat_id_seq' ); - $dbw->insert( - 'category', - array( - 'cat_id' => $seqVal, - 'cat_title' => $this->mName - ), - __METHOD__, - 'IGNORE' - ); - $cond1 = $dbw->conditional( array( 'page_namespace' => NS_CATEGORY ), 1, 'NULL' ); $cond2 = $dbw->conditional( array( 'page_namespace' => NS_FILE ), 1, 'NULL' ); $result = $dbw->selectRow( @@ -351,25 +326,47 @@ class Category { __METHOD__, array( 'LOCK IN SHARE MODE' ) ); - $ret = $dbw->update( - 'category', - array( - 'cat_pages' => $result->pages, - 'cat_subcats' => $result->subcats, - 'cat_files' => $result->files - ), - array( 'cat_title' => $this->mName ), - __METHOD__ - ); - $dbw->endAtomic( __METHOD__ ); - wfProfileOut( __METHOD__ ); + 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', + array( + 'cat_pages' => $result->pages, + 'cat_subcats' => $result->subcats, + 'cat_files' => $result->files + ), + array( 'cat_title' => $this->mName ), + __METHOD__ + ); + } else { + $dbw->upsert( + 'category', + array( + 'cat_title' => $this->mName, + 'cat_pages' => $result->pages, + 'cat_subcats' => $result->subcats, + 'cat_files' => $result->files + ), + array( 'cat_title' ), + array( + 'cat_pages' => $result->pages, + 'cat_subcats' => $result->subcats, + 'cat_files' => $result->files + ), + __METHOD__ + ); + } + + $dbw->endAtomic( __METHOD__ ); # Now we should update our local counts. $this->mPages = $result->pages; $this->mSubcats = $result->subcats; $this->mFiles = $result->files; - return $ret; + return true; } }