]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 817486: fix _sync_fulltext to avoid always updating bugs_fulltext.short_desc
authorByron Jones <bjones@mozilla.com>
Wed, 2 Jan 2013 17:03:31 +0000 (01:03 +0800)
committerByron Jones <bjones@mozilla.com>
Wed, 2 Jan 2013 17:03:31 +0000 (01:03 +0800)
r=LpSolit,a=LpSolit

Bugzilla/Bug.pm
Bugzilla/Comment.pm
Bugzilla/Migrate.pm
importxml.pl
sanitycheck.cgi

index d912cd4ea9a2fda955445c458ba64296e8e2cf90..c58fec4607579016ff2adb304e33745ee2613ec4 100644 (file)
@@ -731,7 +731,7 @@ sub create {
     # Because MySQL doesn't support transactions on the fulltext table,
     # we do this after we've committed the transaction. That way we're
     # sure we're inserting a good Bug ID.
-    $bug->_sync_fulltext('new bug');
+    $bug->_sync_fulltext( new_bug => 1 );
 
     return $bug;
 }
@@ -1026,9 +1026,10 @@ sub update {
     # in the middle of a transaction, and if that transaction is rolled
     # back, this change will *not* be rolled back. As we expect rollbacks
     # to be extremely rare, that is OK for us.
-    $self->_sync_fulltext()
-        if $self->{added_comments} || $changes->{short_desc}
-           || $self->{comment_isprivate};
+    $self->_sync_fulltext(
+        update_short_desc => $changes->{short_desc},
+        update_comments   => $self->{added_comments} || $self->{comment_isprivate}
+    );
 
     # Remove obsolete internal variables.
     delete $self->{'_old_assigned_to'};
@@ -1062,25 +1063,43 @@ sub _extract_multi_selects {
 
 # Should be called any time you update short_desc or change a comment.
 sub _sync_fulltext {
-    my ($self, $new_bug) = @_;
+    my ($self, %options) = @_;
     my $dbh = Bugzilla->dbh;
-    if ($new_bug) {
-        $dbh->do('INSERT INTO bugs_fulltext (bug_id, short_desc)
-                  SELECT bug_id, short_desc FROM bugs WHERE bug_id = ?',
-                 undef, $self->id);
+
+    my($all_comments, $public_comments);
+    if ($options{new_bug} || $options{update_comments}) {
+        my $comments = $dbh->selectall_arrayref(
+            'SELECT thetext, isprivate FROM longdescs WHERE bug_id = ?',
+            undef, $self->id);
+        $all_comments = join("\n", map { $_->[0] } @$comments);
+        my @no_private = grep { !$_->[1] } @$comments;
+        $public_comments = join("\n", map { $_->[0] } @no_private);
     }
-    else {
-        $dbh->do('UPDATE bugs_fulltext SET short_desc = ? WHERE bug_id = ?',
-                 undef, $self->short_desc, $self->id);
+
+    if ($options{new_bug}) {
+        $dbh->do('INSERT INTO bugs_fulltext (bug_id, short_desc, comments,
+                                             comments_noprivate)
+                 VALUES (?, ?, ?, ?)',
+                 undef,
+                 $self->id, $self->short_desc, $all_comments, $public_comments);
+    } else {
+        my(@names, @values);
+        if ($options{update_short_desc}) {
+            push @names, 'short_desc';
+            push @values, $self->short_desc;
+        }
+        if ($options{update_comments}) {
+            push @names, ('comments', 'comments_noprivate');
+            push @values, ($all_comments, $public_comments);
+        }
+        if (@names) {
+            $dbh->do('UPDATE bugs_fulltext SET ' .
+                     join(', ', map { "$_ = ?" } @names) .
+                     ' WHERE bug_id = ?',
+                     undef,
+                     @values, $self->id);
+        }
     }
-    my $comments = $dbh->selectall_arrayref(
-        'SELECT thetext, isprivate FROM longdescs WHERE bug_id = ?',
-        undef, $self->id);
-    my $all = join("\n", map { $_->[0] } @$comments);
-    my @no_private = grep { !$_->[1] } @$comments;
-    my $nopriv_string = join("\n", map { $_->[0] } @no_private);
-    $dbh->do('UPDATE bugs_fulltext SET comments = ?, comments_noprivate = ?
-               WHERE bug_id = ?', undef, $all, $nopriv_string, $self->id);
 }
 
 sub remove_from_db {
index 0277819c4c4f05bdee7ea7c3c447b82de5509e20..d4e3383eaf07c253a6b5402e2636f1fcb783c77e 100644 (file)
@@ -80,7 +80,7 @@ use constant VALIDATOR_DEPENDENCIES => {
 sub update {
     my $self = shift;
     my $changes = $self->SUPER::update(@_);
-    $self->bug->_sync_fulltext();
+    $self->bug->_sync_fulltext( update_comments => 1);
     return $changes;
 }
 
index a23cbd32a781097ce316f059894bd0b85382968a..6671ac3759097dc76d009df7f9a3ffa79d8b50b4 100644 (file)
@@ -815,7 +815,7 @@ sub _insert_comments {
         $self->_do_table_insert('longdescs', \%copy);
         $self->debug("  Inserted comment from " . $who->login, 2);
     }
-    $bug->_sync_fulltext();
+    $bug->_sync_fulltext( update_comments => 1 );
 }
 
 sub _insert_history {
index 3b0bc093bcb7c9879d57bf190261b62000902eb9..92a85c6da65246af2f468a525d524949af1b34f8 100755 (executable)
@@ -1192,7 +1192,7 @@ sub process_bug {
                               $c->{isprivate}, $c->{thetext}, 0);
     }
     $sth_comment->execute($id, $exporterid, $timestamp, 0, $comments, $worktime);
-    Bugzilla::Bug->new($id)->_sync_fulltext('new_bug');
+    Bugzilla::Bug->new($id)->_sync_fulltext( new_bug => 1);
 
     # Add this bug to each group of which its product is a member.
     my $sth_group = $dbh->prepare("INSERT INTO bug_group_map (bug_id, group_id) 
index ad5925d064b4a4820f09976e16239b905f5c16a6..256438bd875d6ddcb6b13fdceca70335d63c90bd 100755 (executable)
@@ -207,7 +207,7 @@ if ($cgi->param('repair_bugs_fulltext')) {
                                             WHERE bugs_fulltext.bug_id IS NULL');
 
    foreach my $bugid (@$bug_ids) {
-       Bugzilla::Bug->new($bugid)->_sync_fulltext('new_bug');
+       Bugzilla::Bug->new($bugid)->_sync_fulltext( new_bug => 1 );
    }
 
    Status('bugs_fulltext_fixed', {bug_count => scalar(@$bug_ids)});