Commit 27a7d352 authored by Frédéric Buclin's avatar Frédéric Buclin

Bug 898830: Improve loading time of show_bug.cgi

r=sgreen a=justdave
parent f1b5390e
...@@ -126,8 +126,7 @@ the ID of the bug to which the attachment is attached ...@@ -126,8 +126,7 @@ the ID of the bug to which the attachment is attached
=cut =cut
sub bug_id { sub bug_id {
my $self = shift; return $_[0]->{bug_id};
return $self->{bug_id};
} }
=over =over
...@@ -141,11 +140,8 @@ the bug object to which the attachment is attached ...@@ -141,11 +140,8 @@ the bug object to which the attachment is attached
=cut =cut
sub bug { sub bug {
my $self = shift;
require Bugzilla::Bug; require Bugzilla::Bug;
$self->{bug} ||= Bugzilla::Bug->new({ id => $self->bug_id, cache => 1 }); return $_[0]->{bug} //= Bugzilla::Bug->new({ id => $_[0]->bug_id, cache => 1 });
return $self->{bug};
} }
=over =over
...@@ -159,8 +155,7 @@ user-provided text describing the attachment ...@@ -159,8 +155,7 @@ user-provided text describing the attachment
=cut =cut
sub description { sub description {
my $self = shift; return $_[0]->{description};
return $self->{description};
} }
=over =over
...@@ -174,8 +169,7 @@ the attachment's MIME media type ...@@ -174,8 +169,7 @@ the attachment's MIME media type
=cut =cut
sub contenttype { sub contenttype {
my $self = shift; return $_[0]->{mimetype};
return $self->{mimetype};
} }
=over =over
...@@ -189,9 +183,8 @@ the user who attached the attachment ...@@ -189,9 +183,8 @@ the user who attached the attachment
=cut =cut
sub attacher { sub attacher {
my $self = shift; return $_[0]->{attacher}
return $self->{attacher} //= new Bugzilla::User({ id => $_[0]->{submitter_id}, cache => 1 });
||= new Bugzilla::User({ id => $self->{submitter_id}, cache => 1 });
} }
=over =over
...@@ -205,8 +198,7 @@ the date and time on which the attacher attached the attachment ...@@ -205,8 +198,7 @@ the date and time on which the attacher attached the attachment
=cut =cut
sub attached { sub attached {
my $self = shift; return $_[0]->{creation_ts};
return $self->{creation_ts};
} }
=over =over
...@@ -220,8 +212,7 @@ the date and time on which the attachment was last modified. ...@@ -220,8 +212,7 @@ the date and time on which the attachment was last modified.
=cut =cut
sub modification_time { sub modification_time {
my $self = shift; return $_[0]->{modification_time};
return $self->{modification_time};
} }
=over =over
...@@ -235,8 +226,7 @@ the name of the file the attacher attached ...@@ -235,8 +226,7 @@ the name of the file the attacher attached
=cut =cut
sub filename { sub filename {
my $self = shift; return $_[0]->{filename};
return $self->{filename};
} }
=over =over
...@@ -250,8 +240,7 @@ whether or not the attachment is a patch ...@@ -250,8 +240,7 @@ whether or not the attachment is a patch
=cut =cut
sub ispatch { sub ispatch {
my $self = shift; return $_[0]->{ispatch};
return $self->{ispatch};
} }
=over =over
...@@ -265,8 +254,7 @@ whether or not the attachment is obsolete ...@@ -265,8 +254,7 @@ whether or not the attachment is obsolete
=cut =cut
sub isobsolete { sub isobsolete {
my $self = shift; return $_[0]->{isobsolete};
return $self->{isobsolete};
} }
=over =over
...@@ -280,8 +268,7 @@ whether or not the attachment is private ...@@ -280,8 +268,7 @@ whether or not the attachment is private
=cut =cut
sub isprivate { sub isprivate {
my $self = shift; return $_[0]->{isprivate};
return $self->{isprivate};
} }
=over =over
...@@ -298,8 +285,7 @@ matches, because this will return a value even if it's matched by the generic ...@@ -298,8 +285,7 @@ matches, because this will return a value even if it's matched by the generic
=cut =cut
sub is_viewable { sub is_viewable {
my $self = shift; my $contenttype = $_[0]->contenttype;
my $contenttype = $self->contenttype;
my $cgi = Bugzilla->cgi; my $cgi = Bugzilla->cgi;
# We assume we can view all text and image types. # We assume we can view all text and image types.
...@@ -373,7 +359,7 @@ the length (in bytes) of the attachment content ...@@ -373,7 +359,7 @@ the length (in bytes) of the attachment content
sub datasize { sub datasize {
my $self = shift; 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. # If we have already retrieved the data, return its size.
return length($self->{data}) if exists $self->{data}; return length($self->{data}) if exists $self->{data};
...@@ -416,11 +402,8 @@ flags that have been set on the attachment ...@@ -416,11 +402,8 @@ flags that have been set on the attachment
=cut =cut
sub flags { sub flags {
my $self = shift;
# Don't cache it as it must be in sync with ->flag_types. # Don't cache it as it must be in sync with ->flag_types.
$self->{flags} = [map { @{$_->{flags}} } @{$self->flag_types}]; return $_[0]->{flags} = [map { @{$_->{flags}} } @{$_[0]->flag_types}];
return $self->{flags};
} }
=over =over
...@@ -443,8 +426,7 @@ sub flag_types { ...@@ -443,8 +426,7 @@ sub flag_types {
component_id => $self->bug->component_id, component_id => $self->bug->component_id,
attach_id => $self->id }; attach_id => $self->id };
$self->{flag_types} = Bugzilla::Flag->_flag_types($vars); return $self->{flag_types} = Bugzilla::Flag->_flag_types($vars);
return $self->{flag_types};
} }
############################### ###############################
...@@ -677,7 +659,7 @@ sub get_attachments_by_bug { ...@@ -677,7 +659,7 @@ sub get_attachments_by_bug {
# To avoid $attachment->flags to run SQL queries itself for each # To avoid $attachment->flags to run SQL queries itself for each
# attachment listed here, we collect all the data at once and # attachment listed here, we collect all the data at once and
# populate $attachment->{flags} ourselves. # 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}) { if ($vars->{preload}) {
# Preload flags. # Preload flags.
$_->{flags} = [] foreach @$attachments; $_->{flags} = [] foreach @$attachments;
...@@ -699,6 +681,16 @@ sub get_attachments_by_bug { ...@@ -699,6 +681,16 @@ sub get_attachments_by_bug {
foreach my $attachment (@$attachments) { foreach my $attachment (@$attachments) {
$attachment->{attacher} = $user_map{$attachment->{submitter_id}}; $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; return $attachments;
} }
......
...@@ -825,8 +825,7 @@ sub in_group_id { ...@@ -825,8 +825,7 @@ sub in_group_id {
sub groups_with_icon { sub groups_with_icon {
my $self = shift; my $self = shift;
my @groups = grep { $_->icon_url } @{ $self->groups }; return $self->{groups_with_icon} //= [grep { $_->icon_url } @{ $self->groups }];
return \@groups;
} }
sub get_products_by_permission { sub get_products_by_permission {
......
...@@ -71,7 +71,10 @@ sub html_quote { ...@@ -71,7 +71,10 @@ sub html_quote {
$var =~ s/"/"/g; $var =~ s/"/"/g;
# Obscure '@'. # Obscure '@'.
$var =~ s/\@/\@/g; $var =~ s/\@/\@/g;
if (Bugzilla->params->{'utf8'}) {
state $use_utf8 = Bugzilla->params->{'utf8'};
if ($use_utf8) {
# Remove the following characters because they're # Remove the following characters because they're
# influencing BiDi: # influencing BiDi:
# -------------------------------------------------------- # --------------------------------------------------------
...@@ -93,7 +96,7 @@ sub html_quote { ...@@ -93,7 +96,7 @@ sub html_quote {
# |U+200e|Left-To-Right Mark |0xe2 0x80 0x8e | # |U+200e|Left-To-Right Mark |0xe2 0x80 0x8e |
# |U+200f|Right-To-Left Mark |0xe2 0x80 0x8f | # |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; return $var;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment