Category::refreshCounts(): Save new counts using upsert()
authorKevin Israel <pleasestand@live.com>
Fri, 28 Aug 2015 07:57:01 +0000 (03:57 -0400)
committerKevin Israel <pleasestand@live.com>
Sat, 17 Oct 2015 03:19:45 +0000 (23:19 -0400)
This doesn't completely address the TODO comment. However, I intend
to finish doing so in a separate change.

Change-Id: I71c6dafd4223d79a0153fa8ce7cb0ee1354c0ec6

includes/Category.php

index 3a21e25..c3e8a4e 100644 (file)
@@ -314,22 +314,6 @@ class Category {
                $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(
@@ -342,16 +326,27 @@ class Category {
                        __METHOD__,
                        array( 'LOCK IN SHARE MODE' )
                );
-               $ret = $dbw->update(
+
+               # TODO: This will cause lots and lots of gaps on MySQL unless
+               # innodb_autoinc_lock_mode is 0 (and also on some non-MySQL
+               # DBMSes) if you run populateCategory.php repeatedly.
+               $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
                        ),
-                       array( 'cat_title' => $this->mName ),
                        __METHOD__
                );
+
                $dbw->endAtomic( __METHOD__ );
 
                # Now we should update our local counts.
@@ -359,6 +354,6 @@ class Category {
                $this->mSubcats = $result->subcats;
                $this->mFiles = $result->files;
 
-               return $ret;
+               return true;
        }
 }