aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-06-21 14:35:14 +0100
committerPratik Naik <pratiknaik@gmail.com>2009-06-21 15:25:28 +0100
commitb5775c2b3efb3ae5ef9074d26f6fc3e302a4f6f0 (patch)
treeab1ed892e04ed605c122e9a42a17286e63c5f1e8 /activesupport
parent9f7eaea201b2f408d9effbf82f2731957e284adf (diff)
downloadrails-b5775c2b3efb3ae5ef9074d26f6fc3e302a4f6f0.tar.gz
rails-b5775c2b3efb3ae5ef9074d26f6fc3e302a4f6f0.tar.bz2
rails-b5775c2b3efb3ae5ef9074d26f6fc3e302a4f6f0.zip
Add expiry support File cache store [#1693 state:resolved] [Roman Shterenzon, Pratik Naik]
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/lib/active_support/cache.rb12
-rw-r--r--activesupport/lib/active_support/cache/file_store.rb14
-rw-r--r--activesupport/lib/active_support/cache/mem_cache_store.rb4
-rw-r--r--activesupport/test/caching_test.rb10
4 files changed, 33 insertions, 7 deletions
diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb
index feb6b1f2cf..192a82e74f 100644
--- a/activesupport/lib/active_support/cache.rb
+++ b/activesupport/lib/active_support/cache.rb
@@ -129,8 +129,8 @@ module ActiveSupport
#
# For example, MemCacheStore's #write method supports the +:expires_in+
# option, which tells the memcached server to automatically expire the
- # cache item after a certain period. We can use this option with #fetch
- # too:
+ # cache item after a certain period. This options is also supported by
+ # FileStore's #read method. We can use this option with #fetch too:
#
# cache = ActiveSupport::Cache::MemCacheStore.new
# cache.fetch("foo", :force => true, :expires_in => 5.seconds) do
@@ -169,6 +169,10 @@ module ActiveSupport
# You may also specify additional options via the +options+ argument.
# The specific cache store implementation will decide what to do with
# +options+.
+ #
+ # For example, FileStore supports the +:expires_in+ option, which
+ # makes the method return nil for cache items older than the specified
+ # period.
def read(key, options = nil)
log("read", key, options)
end
@@ -223,6 +227,10 @@ module ActiveSupport
end
private
+ def expires_in(options)
+ (options && options[:expires_in]) || 0
+ end
+
def log(operation, key, options)
logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}") if logger && !@silence && !@logger_off
end
diff --git a/activesupport/lib/active_support/cache/file_store.rb b/activesupport/lib/active_support/cache/file_store.rb
index 3217350d58..75eed5ed94 100644
--- a/activesupport/lib/active_support/cache/file_store.rb
+++ b/activesupport/lib/active_support/cache/file_store.rb
@@ -10,11 +10,23 @@ module ActiveSupport
@cache_path = cache_path
end
+ # Reads a value from the cache.
+ #
+ # Possible options:
+ # - +:expires_in+ - the number of seconds that this value may stay in
+ # the cache.
def read(name, options = nil)
super
- File.open(real_file_path(name), 'rb') { |f| Marshal.load(f) } rescue nil
+
+ file_name = real_file_path(name)
+ expires = expires_in(options)
+
+ if File.exist?(file_name) && (expires <= 0 || Time.now - File.mtime(file_name) < expires)
+ File.open(file_name, 'rb') { |f| Marshal.load(f) }
+ end
end
+ # Writes a value to the cache.
def write(name, value, options = nil)
super
ensure_cache_path(File.dirname(real_file_path(name)))
diff --git a/activesupport/lib/active_support/cache/mem_cache_store.rb b/activesupport/lib/active_support/cache/mem_cache_store.rb
index 38b3409ca6..954d0f5423 100644
--- a/activesupport/lib/active_support/cache/mem_cache_store.rb
+++ b/activesupport/lib/active_support/cache/mem_cache_store.rb
@@ -130,10 +130,6 @@ module ActiveSupport
end
private
- def expires_in(options)
- (options && options[:expires_in]) || 0
- end
-
def raw?(options)
options && options[:raw]
end
diff --git a/activesupport/test/caching_test.rb b/activesupport/test/caching_test.rb
index 51d04d9388..e6e2205708 100644
--- a/activesupport/test/caching_test.rb
+++ b/activesupport/test/caching_test.rb
@@ -146,6 +146,16 @@ class FileStoreTest < ActiveSupport::TestCase
end
include CacheStoreBehavior
+
+ def test_expires_in
+ @cache.write('foo', 'bar')
+ cache_read = lambda { @cache.read('foo', :expires_in => 2) }
+ assert_equal 'bar', cache_read.call
+ sleep(1)
+ assert_equal 'bar', cache_read.call
+ sleep(1)
+ assert_nil cache_read.call
+ end
end
class MemoryStoreTest < ActiveSupport::TestCase