From db29480b097468be60ff0ffbc4344166443ae525 Mon Sep 17 00:00:00 2001 From: Byron Jones Date: Thu, 3 Jan 2013 01:03:31 +0800 Subject: Bug 817486: fix _sync_fulltext to avoid always updating bugs_fulltext.short_desc r=LpSolit,a=LpSolit --- Bugzilla/Bug.pm | 59 +++++++++++++++++++++++++++++++++++------------------ Bugzilla/Comment.pm | 2 +- Bugzilla/Migrate.pm | 2 +- importxml.pl | 2 +- sanitycheck.cgi | 2 +- 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index d912cd4ea..c58fec460 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -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 { diff --git a/Bugzilla/Comment.pm b/Bugzilla/Comment.pm index 0277819c4..d4e3383ea 100644 --- a/Bugzilla/Comment.pm +++ b/Bugzilla/Comment.pm @@ -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; } diff --git a/Bugzilla/Migrate.pm b/Bugzilla/Migrate.pm index a23cbd32a..6671ac375 100644 --- a/Bugzilla/Migrate.pm +++ b/Bugzilla/Migrate.pm @@ -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 { diff --git a/importxml.pl b/importxml.pl index 3b0bc093b..92a85c6da 100755 --- a/importxml.pl +++ b/importxml.pl @@ -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) diff --git a/sanitycheck.cgi b/sanitycheck.cgi index ad5925d06..256438bd8 100755 --- a/sanitycheck.cgi +++ b/sanitycheck.cgi @@ -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)}); -- cgit v1.2.3-24-g4f1b