aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrédéric Buclin <LpSolit@gmail.com>2013-08-09 11:13:45 +0200
committerFrédéric Buclin <LpSolit@gmail.com>2013-08-09 11:13:45 +0200
commit27a7d352a3cd9fddb7146ddd8f2a137994210250 (patch)
tree6e06cf24fae3bf4cf14dd97f28a5ec4d680a7b0b
parentf1b5390ec67981857ee6bc1ef5c4a274cbe4af10 (diff)
downloadbugs-27a7d352a3cd9fddb7146ddd8f2a137994210250.tar
bugs-27a7d352a3cd9fddb7146ddd8f2a137994210250.tar.gz
bugs-27a7d352a3cd9fddb7146ddd8f2a137994210250.tar.bz2
bugs-27a7d352a3cd9fddb7146ddd8f2a137994210250.tar.xz
bugs-27a7d352a3cd9fddb7146ddd8f2a137994210250.zip
Bug 898830: Improve loading time of show_bug.cgi
r=sgreen a=justdave
-rw-r--r--Bugzilla/Attachment.pm62
-rw-r--r--Bugzilla/User.pm3
-rw-r--r--Bugzilla/Util.pm7
3 files changed, 33 insertions, 39 deletions
diff --git a/Bugzilla/Attachment.pm b/Bugzilla/Attachment.pm
index df1a11fcc..7e758c874 100644
--- a/Bugzilla/Attachment.pm
+++ b/Bugzilla/Attachment.pm
@@ -126,8 +126,7 @@ the ID of the bug to which the attachment is attached
=cut
sub bug_id {
- my $self = shift;
- return $self->{bug_id};
+ return $_[0]->{bug_id};
}
=over
@@ -141,11 +140,8 @@ the bug object to which the attachment is attached
=cut
sub bug {
- my $self = shift;
-
require Bugzilla::Bug;
- $self->{bug} ||= Bugzilla::Bug->new({ id => $self->bug_id, cache => 1 });
- return $self->{bug};
+ return $_[0]->{bug} //= Bugzilla::Bug->new({ id => $_[0]->bug_id, cache => 1 });
}
=over
@@ -159,8 +155,7 @@ user-provided text describing the attachment
=cut
sub description {
- my $self = shift;
- return $self->{description};
+ return $_[0]->{description};
}
=over
@@ -174,8 +169,7 @@ the attachment's MIME media type
=cut
sub contenttype {
- my $self = shift;
- return $self->{mimetype};
+ return $_[0]->{mimetype};
}
=over
@@ -189,9 +183,8 @@ the user who attached the attachment
=cut
sub attacher {
- my $self = shift;
- return $self->{attacher}
- ||= new Bugzilla::User({ id => $self->{submitter_id}, cache => 1 });
+ return $_[0]->{attacher}
+ //= new Bugzilla::User({ id => $_[0]->{submitter_id}, cache => 1 });
}
=over
@@ -205,8 +198,7 @@ the date and time on which the attacher attached the attachment
=cut
sub attached {
- my $self = shift;
- return $self->{creation_ts};
+ return $_[0]->{creation_ts};
}
=over
@@ -220,8 +212,7 @@ the date and time on which the attachment was last modified.
=cut
sub modification_time {
- my $self = shift;
- return $self->{modification_time};
+ return $_[0]->{modification_time};
}
=over
@@ -235,8 +226,7 @@ the name of the file the attacher attached
=cut
sub filename {
- my $self = shift;
- return $self->{filename};
+ return $_[0]->{filename};
}
=over
@@ -250,8 +240,7 @@ whether or not the attachment is a patch
=cut
sub ispatch {
- my $self = shift;
- return $self->{ispatch};
+ return $_[0]->{ispatch};
}
=over
@@ -265,8 +254,7 @@ whether or not the attachment is obsolete
=cut
sub isobsolete {
- my $self = shift;
- return $self->{isobsolete};
+ return $_[0]->{isobsolete};
}
=over
@@ -280,8 +268,7 @@ whether or not the attachment is private
=cut
sub isprivate {
- my $self = shift;
- return $self->{isprivate};
+ return $_[0]->{isprivate};
}
=over
@@ -298,8 +285,7 @@ matches, because this will return a value even if it's matched by the generic
=cut
sub is_viewable {
- my $self = shift;
- my $contenttype = $self->contenttype;
+ my $contenttype = $_[0]->contenttype;
my $cgi = Bugzilla->cgi;
# We assume we can view all text and image types.
@@ -373,7 +359,7 @@ the length (in bytes) of the attachment content
sub datasize {
my $self = shift;
- return $self->{datasize} if exists $self->{datasize};
+ return $self->{datasize} if defined $self->{datasize};
# If we have already retrieved the data, return its size.
return length($self->{data}) if exists $self->{data};
@@ -416,11 +402,8 @@ flags that have been set on the attachment
=cut
sub flags {
- my $self = shift;
-
# Don't cache it as it must be in sync with ->flag_types.
- $self->{flags} = [map { @{$_->{flags}} } @{$self->flag_types}];
- return $self->{flags};
+ return $_[0]->{flags} = [map { @{$_->{flags}} } @{$_[0]->flag_types}];
}
=over
@@ -443,8 +426,7 @@ sub flag_types {
component_id => $self->bug->component_id,
attach_id => $self->id };
- $self->{flag_types} = Bugzilla::Flag->_flag_types($vars);
- return $self->{flag_types};
+ return $self->{flag_types} = Bugzilla::Flag->_flag_types($vars);
}
###############################
@@ -677,7 +659,7 @@ sub get_attachments_by_bug {
# To avoid $attachment->flags to run SQL queries itself for each
# attachment listed here, we collect all the data at once and
# populate $attachment->{flags} ourselves.
- # We also load all attachers at once for the same reason.
+ # We also load all attachers and datasizes at once for the same reason.
if ($vars->{preload}) {
# Preload flags.
$_->{flags} = [] foreach @$attachments;
@@ -699,6 +681,16 @@ sub get_attachments_by_bug {
foreach my $attachment (@$attachments) {
$attachment->{attacher} = $user_map{$attachment->{submitter_id}};
}
+
+ # Preload datasizes.
+ my $sizes =
+ $dbh->selectall_hashref('SELECT attach_id, LENGTH(thedata) AS size
+ FROM attachments LEFT JOIN attach_data ON attach_id = id
+ WHERE bug_id = ?',
+ 'attach_id', undef, $bug->id);
+
+ # Force the size of attachments not in the DB to be recalculated.
+ $_->{datasize} = $sizes->{$_->id}->{size} || undef foreach @$attachments;
}
return $attachments;
}
diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm
index c6cd23840..84487dbbe 100644
--- a/Bugzilla/User.pm
+++ b/Bugzilla/User.pm
@@ -825,8 +825,7 @@ sub in_group_id {
sub groups_with_icon {
my $self = shift;
- my @groups = grep { $_->icon_url } @{ $self->groups };
- return \@groups;
+ return $self->{groups_with_icon} //= [grep { $_->icon_url } @{ $self->groups }];
}
sub get_products_by_permission {
diff --git a/Bugzilla/Util.pm b/Bugzilla/Util.pm
index 58d6ab365..8c88731e3 100644
--- a/Bugzilla/Util.pm
+++ b/Bugzilla/Util.pm
@@ -71,7 +71,10 @@ sub html_quote {
$var =~ s/"/&quot;/g;
# Obscure '@'.
$var =~ s/\@/\&#64;/g;
- if (Bugzilla->params->{'utf8'}) {
+
+ state $use_utf8 = Bugzilla->params->{'utf8'};
+
+ if ($use_utf8) {
# Remove the following characters because they're
# influencing BiDi:
# --------------------------------------------------------
@@ -93,7 +96,7 @@ sub html_quote {
# |U+200e|Left-To-Right Mark |0xe2 0x80 0x8e |
# |U+200f|Right-To-Left Mark |0xe2 0x80 0x8f |
# --------------------------------------------------------
- $var =~ s/[\x{202a}-\x{202e}]//g;
+ $var =~ tr/\x{202a}-\x{202e}//d;
}
return $var;
}