From 217beee45f5ba22aea80c8a61a639b55fe53293c Mon Sep 17 00:00:00 2001 From: Max Kanat-Alexander Date: Sat, 13 Mar 2010 16:32:32 -0800 Subject: Bug 498309: Speed up show_bug.cgi when there are many comments by caching field-descs globally for all template calls r=LpSolit, a=LpSolit --- Bugzilla/Template.pm | 7 ++++++- Bugzilla/Util.pm | 30 +++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) (limited to 'Bugzilla') diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm index 79382ece2..618af4726 100644 --- a/Bugzilla/Template.pm +++ b/Bugzilla/Template.pm @@ -236,7 +236,7 @@ sub quoteUrls { # we have to do this in one pattern, and so this is semi-messy. # Also, we can't use $bug_re?$comment_re? because that will match the # empty string - my $bug_word = get_text('term', { term => 'bug' }); + my $bug_word = template_var('terms')->{bug}; my $bug_re = qr/\Q$bug_word\E\s*\#?\s*(\d+)/i; my $comment_re = qr/comment\s*\#?\s*(\d+)/i; $text =~ s~\b($bug_re(?:\s*,?\s*$comment_re)?|$comment_re) @@ -774,6 +774,11 @@ sub create { 'feature_enabled' => sub { return Bugzilla->feature(@_); }, + # field_descs can be somewhat slow to generate, so we generate + # it only once per-language no matter how many times + # $template->process() is called. + 'field_descs' => sub { return template_var('field_descs') }, + 'install_string' => \&Bugzilla::Install::Util::install_string, # These don't work as normal constants. diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm index 437979c85..35a5c0aea 100644 --- a/Bugzilla/Util.pm +++ b/Bugzilla/Util.pm @@ -44,7 +44,7 @@ use base qw(Exporter); file_mod_time is_7bit_clean bz_crypt generate_random_password validate_email_syntax clean_text - get_text disable_utf8); + get_text template_var disable_utf8); use Bugzilla::Constants; @@ -621,6 +621,26 @@ sub get_text { return $message; } +sub template_var { + my $name = shift; + my $cache = Bugzilla->request_cache->{util_template_var} ||= {}; + my $template = Bugzilla->template_inner; + my $lang = $template->context->{bz_language}; + return $cache->{$lang}->{$name} if defined $cache->{$lang}; + my %vars; + # Note: If we suddenly start needing a lot of template_var variables, + # they should move into their own template, not field-descs. + my $result = $template->process('global/field-descs.none.tmpl', + { vars => \%vars, in_template_var => 1 }); + # Bugzilla::Error can't be "use"d in Bugzilla::Util. + if (!$result) { + require Bugzilla::Error; + Bugzilla::Error::ThrowTemplateError($template->error); + } + $cache->{$lang} = \%vars; + return $vars{$name}; +} + sub disable_utf8 { if (Bugzilla->params->{'utf8'}) { binmode STDOUT, ':bytes'; # Turn off UTF8 encoding. @@ -902,6 +922,14 @@ A string. =back + +=item C + +This is a method of getting the value of a variable from a template in +Perl code. The available variables are in the C +template. Just pass in the name of the variable that you want the value of. + + =back =head2 Formatting Time -- cgit v1.2.3-24-g4f1b