diff options
author | Byron Jones <bjones@mozilla.com> | 2012-11-22 15:39:05 +0100 |
---|---|---|
committer | Byron Jones <bjones@mozilla.com> | 2012-11-22 15:39:05 +0100 |
commit | 4c3e00573133dfc53d07805629af19599aaef7df (patch) | |
tree | e9ce090e958fb60edee1656af12fa414ba79efc3 /Bugzilla/Object.pm | |
parent | da12cec61f8c7e667b00fc5fc39c827d3593f021 (diff) | |
download | bugzilla-4c3e00573133dfc53d07805629af19599aaef7df.tar.gz bugzilla-4c3e00573133dfc53d07805629af19599aaef7df.tar.xz |
Bug 811280: Adds a caching mechanism to Bugzilla::Object to avoid querying the database repeatedly for the same information
r=dkl,a=LpSolit
Diffstat (limited to 'Bugzilla/Object.pm')
-rw-r--r-- | Bugzilla/Object.pm | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/Bugzilla/Object.pm b/Bugzilla/Object.pm index ce59a23f0..9d7ab7391 100644 --- a/Bugzilla/Object.pm +++ b/Bugzilla/Object.pm @@ -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; |