Follow-up r32085. Delay the transaction begin until after the object is initialized.
authorPlatonides <platonides@users.mediawiki.org>
Tue, 7 Sep 2010 20:11:53 +0000 (20:11 +0000)
committerPlatonides <platonides@users.mediawiki.org>
Tue, 7 Sep 2010 20:11:53 +0000 (20:11 +0000)
We would get some queries into the transaction ''sometimes'', depending if it was already initialised or not, and one code path left the transaction open.

includes/Category.php

index 44f266e..1e49c5f 100644 (file)
@@ -245,28 +245,30 @@ class Category {
                if ( wfReadOnly() ) {
                        return false;
                }
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin();
+
                # Note, we must use names for this, since categorylinks does.
                if ( $this->mName === null ) {
                        if ( !$this->initialize() ) {
                                return false;
                        }
-               } else {
-                       # Let's be sure that the row exists in the table.  We don't need to
-                       # do this if we got the row from the table in initialization!
-                       $seqVal = $dbw->nextSequenceValue( 'category_cat_id_seq' );
-                       $dbw->insert(
-                               'category',
-                               array(
-                                       'cat_id' => $seqVal,
-                                       'cat_title' => $this->mName
-                               ),
-                               __METHOD__,
-                               'IGNORE'
-                       );
                }
 
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+
+               # Let's be sure that the row exists in the table.  We don't need to
+               # do this if we got the row from the table in initialization!
+               $seqVal = $dbw->nextSequenceValue( 'category_cat_id_seq' );
+               $dbw->insert(
+                       'category',
+                       array(
+                               'cat_id' => $seqVal,
+                               'cat_title' => $this->mName
+                       ),
+                       __METHOD__,
+                       'IGNORE'
+               );
+
                $cond1 = $dbw->conditional( 'page_namespace=' . NS_CATEGORY, 1, 'NULL' );
                $cond2 = $dbw->conditional( 'page_namespace=' . NS_FILE, 1, 'NULL' );
                $result = $dbw->selectRow(