Skip to content

Commit

Permalink
Add expiry support File cache store [#1693 state:resolved] [Roman Sht…
Browse files Browse the repository at this point in the history
…erenzon, Pratik Naik]
  • Loading branch information
lifo committed Jun 21, 2009
1 parent 9f7eaea commit b5775c2
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 7 deletions.
12 changes: 10 additions & 2 deletions activesupport/lib/active_support/cache.rb
Expand Up @@ -129,8 +129,8 @@ def silence!
#
# 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
Expand Down Expand Up @@ -169,6 +169,10 @@ def fetch(key, options = {})
# 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
Expand Down Expand Up @@ -223,6 +227,10 @@ def decrement(key, amount = 1)
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
Expand Down
14 changes: 13 additions & 1 deletion activesupport/lib/active_support/cache/file_store.rb
Expand Up @@ -10,11 +10,23 @@ def initialize(cache_path)
@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)))
Expand Down
4 changes: 0 additions & 4 deletions activesupport/lib/active_support/cache/mem_cache_store.rb
Expand Up @@ -130,10 +130,6 @@ def stats
end

private
def expires_in(options)
(options && options[:expires_in]) || 0
end

def raw?(options)
options && options[:raw]
end
Expand Down
10 changes: 10 additions & 0 deletions activesupport/test/caching_test.rb
Expand Up @@ -146,6 +146,16 @@ def teardown
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
Expand Down

0 comments on commit b5775c2

Please sign in to comment.