]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 811280: Adds a caching mechanism to Bugzilla::Object to avoid querying the databa...
authorByron Jones <bjones@mozilla.com>
Thu, 22 Nov 2012 14:39:05 +0000 (22:39 +0800)
committerByron Jones <bjones@mozilla.com>
Thu, 22 Nov 2012 14:39:05 +0000 (22:39 +0800)
r=dkl,a=LpSolit

Bugzilla/Attachment.pm
Bugzilla/Bug.pm
Bugzilla/Comment.pm
Bugzilla/Object.pm
Bugzilla/Product.pm
Bugzilla/Template.pm
attachment.cgi
show_bug.cgi

index ba6c25736a3be8ffaa6c3c6418f6fdc87042c0d3..c00b931fbd47b79816bc6e27ff201efac109d434 100644 (file)
@@ -144,7 +144,7 @@ sub bug {
     my $self = shift;
 
     require Bugzilla::Bug;
-    $self->{bug} ||= Bugzilla::Bug->new($self->bug_id);
+    $self->{bug} ||= Bugzilla::Bug->new({ id => $self->bug_id, cache => 1 });
     return $self->{bug};
 }
 
index 4a172375401573bd045a4f1d481fc78554e8cc0e..b72a8fcdbeb06187801aa6e7521491ddedd4483a 100644 (file)
@@ -318,9 +318,13 @@ sub new {
 
     # If we get something that looks like a word (not a number),
     # make it the "name" param.
-    if (!defined $param || (!ref($param) && $param !~ /^\d+$/)) {
+    if (!defined $param
+        || (!ref($param) && $param =~ /\D/)
+        || (ref($param) && $param->{id} =~ /\D/))
+    {
         if ($param) {
-            $param = { name => $param };
+            $param = { name => ref($param) ? $param->{id} : $param,
+                       cache => ref($param) ? $param->{cache} : 0 };
         }
         else {
             # We got something that's not a number.
@@ -354,6 +358,13 @@ sub new {
     return $self;
 }
 
+sub cache_key {
+    my $class = shift;
+    my $key = $class->SUPER::cache_key(@_)
+      || return;
+    return $key . ',' . Bugzilla->user->id;
+}
+
 sub check {
     my $class = shift;
     my ($id, $field) = @_;
@@ -3216,7 +3227,8 @@ sub component_obj {
     my ($self) = @_;
     return $self->{component_obj} if defined $self->{component_obj};
     return {} if $self->{error};
-    $self->{component_obj} = new Bugzilla::Component($self->{component_id});
+    $self->{component_obj} =
+        new Bugzilla::Component({ id => $self->{component_id}, cache => 1 });
     return $self->{component_obj};
 }
 
@@ -3424,7 +3436,8 @@ sub product {
 sub product_obj {
     my $self = shift;
     return {} if $self->{error};
-    $self->{product_obj} ||= new Bugzilla::Product($self->{product_id});
+    $self->{product_obj} ||=
+        new Bugzilla::Product({ id => $self->{product_id}, cache => 1 });
     return $self->{product_obj};
 }
 
index 7cf924893d23cced8e88bd201b178c33607b653c..2a7633bc2f66c9f724d1fc6b5e940205d208d4a4 100644 (file)
@@ -130,7 +130,8 @@ sub is_about_attachment {
 sub attachment {
     my ($self) = @_;
     return undef if not $self->is_about_attachment;
-    $self->{attachment} ||= new Bugzilla::Attachment($self->extra_data);
+    $self->{attachment} ||=
+        new Bugzilla::Attachment({ id => $self->extra_data, cache => 1 });
     return $self->{attachment};
 }
 
index ce59a23f0c775816fdf4737210806caf58529833..9d7ab7391f9de2579f2e8b3510424b1c49f8a9fa 100644 (file)
@@ -59,6 +59,8 @@ sub new {
 sub _init {
     my $class = shift;
     my ($param) = @_;
+    my $object = $class->_cache_get($param);
+    return $object if $object;
     my $dbh = Bugzilla->dbh;
     my $columns = join(',', $class->_get_db_columns);
     my $table   = $class->DB_TABLE;
@@ -69,7 +71,6 @@ sub _init {
     if (ref $param eq 'HASH') {
         $id = $param->{id};
     }
-    my $object;
 
     if (defined $id) {
         # We special-case if somebody specifies an ID, so that we can
@@ -112,9 +113,37 @@ sub _init {
             "SELECT $columns FROM $table WHERE $condition", undef, @values);
     }
 
+    $class->_cache_set($param, $object) if $object;
     return $object;
 }
 
+# Provides a mechanism for objects to be cached in the request_cahce
+sub _cache_get {
+    my $class = shift;
+    my ($param) = @_;
+    my $cache_key = $class->cache_key($param)
+      || return;
+    return Bugzilla->request_cache->{$cache_key};
+}
+
+sub _cache_set {
+    my $class = shift;
+    my ($param, $object) = @_;
+    my $cache_key = $class->cache_key($param)
+      || return;
+    Bugzilla->request_cache->{$cache_key} = $object;
+}
+
+sub cache_key {
+    my $class = shift;
+    my ($param) = @_;
+    if (ref($param) && $param->{cache} && ($param->{id} || $param->{name})) {
+        return $class . ',' . ($param->{id} || $param->{name});
+    } else {
+        return;
+    }
+}
+
 sub check {
     my ($invocant, $param) = @_;
     my $class = ref($invocant) || $invocant;
index 894db422ee893807741178bad49c3529a14b250a..536961ce554b8d35d68b7d5aa7961e80a6e47e45 100644 (file)
@@ -810,8 +810,8 @@ sub flag_types {
 
 sub classification {
     my $self = shift;
-    $self->{'classification'} ||= 
-        new Bugzilla::Classification($self->classification_id);
+    $self->{'classification'} ||=
+        new Bugzilla::Classification({ id => $self->classification_id, cache => 1 });
     return $self->{'classification'};
 }
 
index e13efec2b8542d63ca4a8ad5db605a06b9aa7296..f62a7c498e80639b4c6c72423454031a01428e4a 100644 (file)
@@ -284,7 +284,7 @@ sub get_attachment_link {
     my $dbh = Bugzilla->dbh;
     $user ||= Bugzilla->user;
 
-    my $attachment = new Bugzilla::Attachment($attachid);
+    my $attachment = new Bugzilla::Attachment({ id => $attachid, cache => 1 });
 
     if ($attachment) {
         my $title = "";
@@ -334,10 +334,10 @@ sub get_bug_link {
     $options->{user} ||= Bugzilla->user;
     my $dbh = Bugzilla->dbh;
 
-    if (defined $bug) {
+    if (defined $bug && $bug ne '') {
         if (!blessed($bug)) {
             require Bugzilla::Bug;
-            $bug = new Bugzilla::Bug($bug);
+            $bug = new Bugzilla::Bug({ id => $bug, cache => 1 });
         }
         return $link_text if $bug->{error};
     }
index 120cc2b45410b0b9c5c0e5e0da17bd9060ce2af2..7009a5e00b75d133786849873165f3cdb5323e37 100755 (executable)
@@ -140,7 +140,7 @@ sub validateID {
                           { attach_id => scalar $cgi->param($param) });
   
     # Make sure the attachment exists in the database.
-    my $attachment = new Bugzilla::Attachment($attach_id)
+    my $attachment = new Bugzilla::Attachment({ id => $attach_id, cache => 1 })
         || ThrowUserError("invalid_attach_id", { attach_id => $attach_id });
 
     return $attachment if ($dont_validate_access || check_can_access($attachment));
@@ -152,7 +152,7 @@ sub check_can_access {
     my $user = Bugzilla->user;
 
     # Make sure the user is authorized to access this attachment's bug.
-    Bugzilla::Bug->check($attachment->bug_id);
+    Bugzilla::Bug->check({ id => $attachment->bug_id, cache => 1 });
     if ($attachment->isprivate && $user->id != $attachment->attacher->id 
         && !$user->is_insider) 
     {
@@ -414,7 +414,7 @@ sub diff {
 # HTML page.
 sub viewall {
     # Retrieve and validate parameters
-    my $bug = Bugzilla::Bug->check(scalar $cgi->param('bugid'));
+    my $bug = Bugzilla::Bug->check({ id => scalar $cgi->param('bugid'), cache => 1 });
 
     my $attachments = Bugzilla::Attachment->get_attachments_by_bug($bug);
     # Ignore deleted attachments.
index e9bf7fe43dfd3fff9728a9f2d5944788a38919dd..f84bfc5310e974f42b00aec190b0c5e57e352701 100755 (executable)
@@ -47,7 +47,7 @@ Bugzilla->switch_to_shadow_db unless $user->id;
 
 if ($single) {
     my $id = $cgi->param('id');
-    push @bugs, Bugzilla::Bug->check($id);
+    push @bugs, Bugzilla::Bug->check({ id => $id, cache => 1 });
     if (defined $cgi->param('mark')) {
         foreach my $range (split ',', $cgi->param('mark')) {
             if ($range =~ /^(\d+)-(\d+)$/) {
@@ -67,7 +67,7 @@ if ($single) {
 
         foreach my $bug_id (@ids) {
             next unless $bug_id;
-            my $bug = new Bugzilla::Bug($bug_id);
+            my $bug = new Bugzilla::Bug({ id => $bug_id, cache => 1 });
             if (!$bug->{error}) {
                 push(@check_bugs, $bug);
             }