Patch #8222 » rails-cache.diff
| app/models/setting.rb | ||
|---|---|---|
| 85 | 85 |
validates_inclusion_of :name, :in => @@available_settings.keys |
| 86 | 86 |
validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting| @@available_settings[setting.name]['format'] == 'int' }
|
| 87 | 87 | |
| 88 |
# Hash used to cache setting values |
|
| 89 |
@cached_settings = {}
|
|
| 90 |
@cached_cleared_on = Time.now |
|
| 91 | ||
| 92 | 88 |
def value |
| 93 | 89 |
v = read_attribute(:value) |
| 94 | 90 |
# Unserialize serialized settings |
| ... | ... | |
| 104 | 100 | |
| 105 | 101 |
# Returns the value of the setting named name |
| 106 | 102 |
def self.[](name) |
| 107 |
v = @cached_settings[name] |
|
| 108 |
v ? v : (@cached_settings[name] = find_or_default(name).value) |
|
| 103 |
Marshal.load(Rails.cache.fetch("chiliproject/setting/#{name}") {
|
|
| 104 |
Marshal.dump(find_or_default(name).value) |
|
| 105 |
}).freeze |
|
| 109 | 106 |
end |
| 110 | 107 | |
| 111 | 108 |
def self.[]=(name, v) |
| 112 | 109 |
setting = find_or_default(name) |
| 113 | 110 |
setting.value = (v ? v : "") |
| 114 |
@cached_settings[name] = nil
|
|
| 111 |
Rails.cache.delete "chiliproject/setting/#{name}"
|
|
| 115 | 112 |
setting.save |
| 116 |
setting.value |
|
| 113 |
setting.value.freeze
|
|
| 117 | 114 |
end |
| 118 | 115 | |
| 119 | 116 |
# Defines getter and setter for each setting |
| ... | ... | |
| 150 | 147 |
# Called once per request |
| 151 | 148 |
def self.check_cache |
| 152 | 149 |
settings_updated_on = Setting.maximum(:updated_on) |
| 153 |
if settings_updated_on && @cached_cleared_on <= settings_updated_on |
|
| 154 |
@cached_settings.clear |
|
| 155 |
@cached_cleared_on = Time.now |
|
| 156 |
logger.info "Settings cache cleared." if logger |
|
| 150 |
cache_cleared_on = Rails.cache.read('chiliproject/setting-cleared_on')
|
|
| 151 |
cache_cleared_on = cache_cleared_on ? Marshal.load(cache_cleared_on) : Time.now |
|
| 152 |
if settings_updated_on && cache_cleared_on <= settings_updated_on |
|
| 153 |
Rails.cache.delete_matched( /^chiliproject\/setting\/.+$/ ) |
|
| 154 |
Rails.cache.write('chiliproject/setting-cleared_on', Marshal.dump(Time.now))
|
|
| 155 |
logger.info 'Settings cache cleared.' if logger |
|
| 157 | 156 |
end |
| 158 | 157 |
end |
| 159 | 158 | |
| test/functional/documents_controller_test.rb | ||
|---|---|---|
| 67 | 67 | |
| 68 | 68 |
def test_new_with_one_attachment |
| 69 | 69 |
ActionMailer::Base.deliveries.clear |
| 70 |
Setting.notified_events << 'document_added' |
|
| 70 |
Setting.notified_events = Setting.notified_events.dup << 'document_added'
|
|
| 71 | 71 |
@request.session[:user_id] = 2 |
| 72 | 72 |
set_tmp_attachments_directory |
| 73 | 73 | |
| test/functional/news_controller_test.rb | ||
|---|---|---|
| 67 | 67 |
|
| 68 | 68 |
def test_post_create |
| 69 | 69 |
ActionMailer::Base.deliveries.clear |
| 70 |
Setting.notified_events << 'news_added' |
|
| 70 |
Setting.notified_events = Setting.notified_events.dup << 'news_added'
|
|
| 71 | 71 | |
| 72 | 72 |
@request.session[:user_id] = 2 |
| 73 | 73 |
post :create, :project_id => 1, :news => { :title => 'NewsControllerTest',
|
| test/functional/repositories_filesystem_controller_test.rb | ||
|---|---|---|
| 35 | 35 |
@request = ActionController::TestRequest.new |
| 36 | 36 |
@response = ActionController::TestResponse.new |
| 37 | 37 |
User.current = nil |
| 38 |
Setting.enabled_scm << 'Filesystem' unless Setting.enabled_scm.include?('Filesystem')
|
|
| 38 |
Setting.enabled_scm = Setting.enabled_scm.dup << 'Filesystem' unless Setting.enabled_scm.include?('Filesystem')
|
|
| 39 | 39 |
@repository = Repository::Filesystem.create( |
| 40 | 40 |
:project => Project.find(PRJ_ID), |
| 41 | 41 |
:url => REPOSITORY_PATH, |
| test/unit/comment_test.rb | ||
|---|---|---|
| 33 | 33 |
end |
| 34 | 34 |
|
| 35 | 35 |
def test_create_should_send_notification |
| 36 |
Setting.notified_events << 'news_comment_added' |
|
| 36 |
Setting.notified_events = Setting.notified_events.dup << 'news_comment_added'
|
|
| 37 | 37 |
Watcher.create!(:watchable => @news, :user => @jsmith) |
| 38 | 38 |
|
| 39 | 39 |
assert_difference 'ActionMailer::Base.deliveries.size' do |
| test/unit/document_test.rb | ||
|---|---|---|
| 27 | 27 | |
| 28 | 28 |
def test_create_should_send_email_notification |
| 29 | 29 |
ActionMailer::Base.deliveries.clear |
| 30 |
Setting.notified_events << 'document_added' |
|
| 30 |
Setting.notified_events = Setting.notified_events.dup << 'document_added'
|
|
| 31 | 31 |
doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation'))
|
| 32 | 32 | |
| 33 | 33 |
assert doc.save |
| test/unit/news_test.rb | ||
|---|---|---|
| 30 | 30 |
|
| 31 | 31 |
def test_create_should_send_email_notification |
| 32 | 32 |
ActionMailer::Base.deliveries.clear |
| 33 |
Setting.notified_events << 'news_added' |
|
| 33 |
Setting.notified_events = Setting.notified_events.dup << 'news_added'
|
|
| 34 | 34 |
news = Project.find(:first).news.new(valid_news) |
| 35 | 35 | |
| 36 | 36 |
assert news.save |
| test/unit/repository_filesystem_test.rb | ||
|---|---|---|
| 25 | 25 | |
| 26 | 26 |
def setup |
| 27 | 27 |
@project = Project.find(3) |
| 28 |
Setting.enabled_scm << 'Filesystem' unless Setting.enabled_scm.include?('Filesystem')
|
|
| 28 |
unless Setting.enabled_scm.include?('Filesystem')
|
|
| 29 |
Setting.enabled_scm = Setting.enabled_scm.dup << 'Filesystem' |
|
| 30 |
end |
|
| 29 | 31 |
@repository = Repository::Filesystem.create( |
| 30 | 32 |
:project => @project, |
| 31 | 33 |
:url => REPOSITORY_PATH |
| app/models/setting.rb | ||
|---|---|---|
| 100 | 100 | |
| 101 | 101 |
# Returns the value of the setting named name |
| 102 | 102 |
def self.[](name) |
| 103 |
Marshal.load(Rails.cache.fetch("chiliproject/setting/#{name}") {
|
|
| 103 |
Marshal.load(Rails.cache.fetch("redmine/setting/#{name}") {
|
|
| 104 | 104 |
Marshal.dump(find_or_default(name).value) |
| 105 | 105 |
}).freeze |
| 106 | 106 |
end |
| ... | ... | |
| 108 | 108 |
def self.[]=(name, v) |
| 109 | 109 |
setting = find_or_default(name) |
| 110 | 110 |
setting.value = (v ? v : "") |
| 111 |
Rails.cache.delete "chiliproject/setting/#{name}"
|
|
| 111 |
Rails.cache.delete "redmine/setting/#{name}"
|
|
| 112 | 112 |
setting.save |
| 113 | 113 |
setting.value.freeze |
| 114 | 114 |
end |
| ... | ... | |
| 147 | 147 |
# Called once per request |
| 148 | 148 |
def self.check_cache |
| 149 | 149 |
settings_updated_on = Setting.maximum(:updated_on) |
| 150 |
cache_cleared_on = Rails.cache.read('chiliproject/setting-cleared_on')
|
|
| 150 |
cache_cleared_on = Rails.cache.read('redmine/setting-cleared_on')
|
|
| 151 | 151 |
cache_cleared_on = cache_cleared_on ? Marshal.load(cache_cleared_on) : Time.now |
| 152 | 152 |
if settings_updated_on && cache_cleared_on <= settings_updated_on |
| 153 |
Rails.cache.delete_matched( /^chiliproject\/setting\/.+$/ )
|
|
| 154 |
Rails.cache.write('chiliproject/setting-cleared_on', Marshal.dump(Time.now))
|
|
| 153 |
Rails.cache.delete_matched( /^redmine\/setting\/.+$/ )
|
|
| 154 |
Rails.cache.write('redmine/setting-cleared_on', Marshal.dump(Time.now))
|
|
| 155 | 155 |
logger.info 'Settings cache cleared.' if logger |
| 156 | 156 |
end |
| 157 | 157 |
end |
| app/models/setting.rb | ||
|---|---|---|
| 150 | 150 |
cache_cleared_on = Rails.cache.read('redmine/setting-cleared_on')
|
| 151 | 151 |
cache_cleared_on = cache_cleared_on ? Marshal.load(cache_cleared_on) : Time.now |
| 152 | 152 |
if settings_updated_on && cache_cleared_on <= settings_updated_on |
| 153 |
Rails.cache.delete_matched( /^redmine\/setting\/.+$/ ) |
|
| 154 |
Rails.cache.write('redmine/setting-cleared_on', Marshal.dump(Time.now))
|
|
| 155 |
logger.info 'Settings cache cleared.' if logger |
|
| 153 |
clear_cache |
|
| 156 | 154 |
end |
| 157 | 155 |
end |
| 158 | 156 | |
| 157 |
# Clears all of the Setting caches |
|
| 158 |
def self.clear_cache |
|
| 159 |
Rails.cache.delete_matched( /^redmine\/setting\/.+$/ ) |
|
| 160 |
Rails.cache.write('redmine/setting-cleared_on', Marshal.dump(Time.now))
|
|
| 161 |
logger.info 'Settings cache cleared.' if logger |
|
| 162 |
end |
|
| 163 | ||
| 159 | 164 |
private |
| 160 | 165 |
# Returns the Setting instance for the setting named name |
| 161 | 166 |
# (record found in database or new record with default value) |
| test/test_helper.rb | ||
|---|---|---|
| 47 | 47 |
self.use_instantiated_fixtures = false |
| 48 | 48 | |
| 49 | 49 |
# Add more helper methods to be used by all tests here... |
| 50 |
def setup |
|
| 51 |
super |
|
| 52 |
Setting.clear_cache |
|
| 53 |
end |
|
| 50 | 54 |
|
| 51 | 55 |
def log_user(login, password) |
| 52 | 56 |
User.anonymous |