##// END OF EJS Templates
Added cache for application settings (Setting model)....
Jean-Philippe Lang -
r674:6bdc13b33d8d
parent child
Show More
@@ -0,0 +1,11
1 class AddSettingsUpdatedOn < ActiveRecord::Migration
2 def self.up
3 add_column :settings, :updated_on, :timestamp
4 # set updated_on
5 Setting.find(:all).each(&:save)
6 end
7
8 def self.down
9 remove_column :settings, :updated_on
10 end
11 end
@@ -32,6 +32,7 class ApplicationController < ActionController::Base
32 end
32 end
33
33
34 def user_setup
34 def user_setup
35 Setting.check_cache
35 if session[:user_id]
36 if session[:user_id]
36 # existing session
37 # existing session
37 User.current = User.find(session[:user_id])
38 User.current = User.find(session[:user_id])
@@ -23,25 +23,28 class Setting < ActiveRecord::Base
23 validates_uniqueness_of :name
23 validates_uniqueness_of :name
24 validates_inclusion_of :name, :in => @@available_settings.keys
24 validates_inclusion_of :name, :in => @@available_settings.keys
25 validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting| @@available_settings[setting.name]['format'] == 'int' }
25 validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting| @@available_settings[setting.name]['format'] == 'int' }
26
26
27 def self.get(name)
27 # Hash used to cache setting values
28 name = name.to_s
28 @cached_settings = {}
29 setting = find_by_name(name)
29 @cached_cleared_on = Time.now
30 setting ||= new(:name => name, :value => @@available_settings[name]['default']) if @@available_settings.has_key? name
30
31 setting
31 # Returns the value of the setting named name
32 end
33
34 def self.[](name)
32 def self.[](name)
35 get(name).value
33 value = @cached_settings[name]
34 value ? value : (@cached_settings[name] = find_or_default(name).value)
36 end
35 end
37
36
38 def self.[]=(name, value)
37 def self.[]=(name, value)
39 setting = get(name)
38 setting = find_or_default(name)
40 setting.value = (value ? value.to_s : "")
39 setting.value = (value ? value.to_s : "")
40 @cached_settings[name] = nil
41 setting.save
41 setting.save
42 setting.value
42 setting.value
43 end
43 end
44
44
45 # Defines getter and setter for each setting
46 # Then setting values can be read using: Setting.some_setting_name
47 # or set using Setting.some_setting_name = "some value"
45 @@available_settings.each do |name, params|
48 @@available_settings.each do |name, params|
46 src = <<-END_SRC
49 src = <<-END_SRC
47 def self.#{name}
50 def self.#{name}
@@ -58,4 +61,26 class Setting < ActiveRecord::Base
58 END_SRC
61 END_SRC
59 class_eval src, __FILE__, __LINE__
62 class_eval src, __FILE__, __LINE__
60 end
63 end
64
65 # Checks if settings have changed since the values were read
66 # and clears the cache hash if it's the case
67 # Called once per request
68 def self.check_cache
69 settings_updated_on = Setting.maximum(:updated_on)
70 if settings_updated_on && @cached_cleared_on <= settings_updated_on
71 @cached_settings.clear
72 @cached_cleared_on = Time.now
73 logger.info "Settings cache cleared." if logger
74 end
75 end
76
77 private
78 # Returns the Setting instance for the setting named name
79 # (record found in database or new record with default value)
80 def self.find_or_default(name)
81 name = name.to_s
82 raise "There's no setting named #{name}" unless @@available_settings.has_key?(name)
83 setting = find_by_name(name)
84 setting ||= new(:name => name, :value => @@available_settings[name]['default']) if @@available_settings.has_key? name
85 end
61 end
86 end
General Comments 0
You need to be logged in to leave comments. Login now