]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 993926: Bugzilla::User::Setting::get_all_settings() should use memcached
authorByron Jones <glob@mozilla.com>
Tue, 12 Aug 2014 06:05:32 +0000 (14:05 +0800)
committerByron Jones <glob@mozilla.com>
Tue, 12 Aug 2014 06:05:32 +0000 (14:05 +0800)
r=sgreen,a=glob

Bugzilla/Memcached.pm
Bugzilla/User/Setting.pm
editsettings.cgi
userprefs.cgi

index 1464b6c003e33ac2fa9571da76d825df02af4c62..df90fef9342d6a77b22805f8c1ec466c862ca7c2 100644 (file)
@@ -254,10 +254,13 @@ sub _get {
     elsif (ref($value) eq 'ARRAY') {
         foreach my $value (@$value) {
             next unless defined $value;
-            # arrays of hashes are common
+            # arrays of hashes and arrays are common
             if (ref($value) eq 'HASH') {
                 _detaint_hashref($value);
             }
+            elsif (ref($value) eq 'ARRAY') {
+                _detaint_arrayref($value);
+            }
             elsif (!ref($value)) {
                 trick_taint($value);
             }
@@ -278,6 +281,15 @@ sub _detaint_hashref {
     }
 }
 
+sub _detaint_arrayref {
+    my ($arrayref) = @_;
+    foreach my $value (@$arrayref) {
+        if (defined($value) && !ref($value)) {
+            trick_taint($value);
+        }
+    }
+}
+
 sub _delete {
     my ($self, $key) = @_;
     $key = $self->_encode_key($key)
index 451e946f7746108c38c103db06087b2e87f720b0..5b518da6507822fe2025c3460d627a4b257a84c0 100644 (file)
@@ -15,8 +15,12 @@ use parent qw(Exporter);
 
 
 # Module stuff
-@Bugzilla::User::Setting::EXPORT = qw(get_all_settings get_defaults
-     add_setting);
+@Bugzilla::User::Setting::EXPORT = qw(
+    get_all_settings
+    get_defaults
+    add_setting
+    clear_settings_cache
+);
 
 use Bugzilla::Error;
 use Bugzilla::Util qw(trick_taint get_text);
@@ -159,15 +163,20 @@ sub get_all_settings {
     my $settings = {};
     my $dbh = Bugzilla->dbh;
 
-    my $rows = $dbh->selectall_arrayref(
-           q{SELECT name, default_value, is_enabled, setting_value, subclass
-               FROM setting
-          LEFT JOIN profile_setting
-                 ON setting.name = profile_setting.setting_name
-                AND profile_setting.user_id = ?}, undef, ($user_id));
+    my $cache_key = "user_settings.$user_id";
+    my $rows = Bugzilla->memcached->get_config({ key => $cache_key });
+    if (!$rows) {
+        $rows = $dbh->selectall_arrayref(
+            q{SELECT name, default_value, is_enabled, setting_value, subclass
+                FROM setting
+           LEFT JOIN profile_setting
+                     ON setting.name = profile_setting.setting_name
+                     AND profile_setting.user_id = ?}, undef, ($user_id));
+        Bugzilla->memcached->set_config({ key => $cache_key, data => $rows });
+    }
 
     foreach my $row (@$rows) {
-        my ($name, $default_value, $is_enabled, $value, $subclass) = @$row; 
+        my ($name, $default_value, $is_enabled, $value, $subclass) = @$row;
 
         my $is_default;
 
@@ -179,13 +188,18 @@ sub get_all_settings {
         }
 
         $settings->{$name} = new Bugzilla::User::Setting(
-           $name, $user_id, $is_enabled, 
+           $name, $user_id, $is_enabled,
            $default_value, $value, $is_default, $subclass);
     }
 
     return $settings;
 }
 
+sub clear_settings_cache {
+    my ($user_id) = @_;
+    Bugzilla->memcached->clear_config({ key => "user_settings.$user_id" });
+}
+
 sub get_defaults {
     my ($user_id) = @_;
     my $dbh = Bugzilla->dbh;
@@ -368,6 +382,13 @@ Params:      C<$setting_name> - string - the name of the setting
              C<$is_enabled> - boolean - if false, all users must use the global default
 Returns:     nothing
 
+=item C<clear_settings_cache($user_id)>
+
+Description: Clears cached settings data for the specified user.  Must be
+             called after updating any user's setting.
+Params:      C<$user_id> - integer - the user id.
+Returns:     nothing
+
 =begin private
 
 =item C<_setting_exists>
index bf5e2025b2d771da2c64a7b93ee6bb429b7aec5e..f2c6e2cc39f2aea18b5feaff3811f62005ecc9e6 100755 (executable)
@@ -53,6 +53,7 @@ if ($action eq 'update') {
     }
     $vars->{'message'} = 'default_settings_updated';
     $vars->{'changes_saved'} = $changed;
+    Bugzilla->memcached->clear_config();
     delete_token($token);
 }
 
index 13f817d534b757fe68303c7ae59a7c1a065f8480..f798d4c7678387c27428515833e143e6c14f438f 100755 (executable)
@@ -19,6 +19,7 @@ use Bugzilla::Util;
 use Bugzilla::Error;
 use Bugzilla::User;
 use Bugzilla::User::APIKey;
+use Bugzilla::User::Setting qw(clear_settings_cache);
 use Bugzilla::Token;
 
 my $template = Bugzilla->template;
@@ -170,6 +171,7 @@ sub SaveSettings {
         }
     }
     $vars->{'settings'} = $user->settings(1);
+    clear_settings_cache($user->id);
 }
 
 sub DoEmail {