cachetastic 2.1.4 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +21 -0
- data/README +57 -43
- data/doc/classes/Cachetastic/Adapters.html +180 -0
- data/doc/classes/Cachetastic/Adapters/Base.html +206 -123
- data/doc/classes/Cachetastic/Adapters/File.html +17 -130
- data/doc/classes/Cachetastic/Adapters/LocalMemory.html +7 -228
- data/doc/classes/Cachetastic/Adapters/Memcached.html +193 -0
- data/doc/classes/Cachetastic/Cache.html +425 -0
- data/doc/classes/Cachetastic/Cacheable.html +26 -30
- data/doc/classes/Cachetastic/Cacheable/ClassAndInstanceMethods.html +66 -62
- data/doc/classes/Cachetastic/Cacheable/ClassOnlyMethods.html +30 -30
- data/doc/classes/Cachetastic/Logger.html +31 -33
- data/doc/created.rid +1 -1
- data/doc/files/{lib/cachetastic/adapters/html_file_rb.html → LICENSE.html} +29 -34
- data/doc/files/README.html +91 -57
- data/doc/files/lib/cachetastic/adapters/base_rb.html +1 -39
- data/doc/files/lib/cachetastic/adapters/file_rb.html +1 -21
- data/doc/files/lib/cachetastic/adapters/local_memory_rb.html +1 -9
- data/doc/files/lib/cachetastic/{ruby_extensions/kernel_rb.html → adapters/memcached_rb.html} +4 -4
- data/doc/files/lib/cachetastic/{ruby_extensions/string_rb.html → cache_rb.html} +5 -5
- data/doc/files/lib/cachetastic/cacheable_rb.html +1 -1
- data/doc/files/lib/cachetastic/{caches/base_rb.html → extensions/string_rb.html} +5 -5
- data/doc/files/lib/cachetastic/logger_rb.html +1 -7
- data/doc/files/lib/cachetastic/{adapters/store_object_rb.html → store_object_rb.html} +3 -3
- data/doc/files/lib/cachetastic_rb.html +4 -95
- data/doc/fr_class_index.html +3 -15
- data/doc/fr_file_index.html +5 -16
- data/doc/fr_method_index.html +26 -78
- data/lib/cachetastic.rb +16 -70
- data/lib/cachetastic/adapters/base.rb +178 -76
- data/lib/cachetastic/adapters/file.rb +63 -46
- data/lib/cachetastic/adapters/local_memory.rb +36 -67
- data/lib/cachetastic/adapters/memcached.rb +114 -0
- data/lib/cachetastic/cache.rb +165 -0
- data/lib/cachetastic/cacheable.rb +19 -15
- data/lib/cachetastic/extensions/string.rb +8 -0
- data/lib/cachetastic/logger.rb +41 -41
- data/lib/cachetastic/store_object.rb +22 -0
- metadata +43 -64
- data/bin/cachetastic_drb_server +0 -115
- data/doc/classes/ActiveRecord/Base.html +0 -194
- data/doc/classes/CGI/Session/CachetasticStore.html +0 -124
- data/doc/classes/Cachetastic/Adapters/Drb.html +0 -332
- data/doc/classes/Cachetastic/Adapters/FileBase.html +0 -309
- data/doc/classes/Cachetastic/Adapters/HtmlFile.html +0 -224
- data/doc/classes/Cachetastic/Adapters/Memcache.html +0 -498
- data/doc/classes/Cachetastic/Caches/Base.html +0 -643
- data/doc/classes/Cachetastic/Caches/Base/RegisteredCaches.html +0 -179
- data/doc/classes/Cachetastic/Caches/MackSessionCache.html +0 -119
- data/doc/classes/Cachetastic/Caches/PageCache.html +0 -121
- data/doc/classes/Cachetastic/Caches/RailsSessionCache.html +0 -154
- data/doc/classes/Cachetastic/Connection.html +0 -212
- data/doc/classes/Cachetastic/Errors/UnsupportedAdapter.html +0 -146
- data/doc/classes/Object.html +0 -222
- data/doc/classes/String.html +0 -172
- data/doc/files/lib/cachetastic/adapters/drb_rb.html +0 -115
- data/doc/files/lib/cachetastic/adapters/file_base_rb.html +0 -109
- data/doc/files/lib/cachetastic/adapters/memcache_rb.html +0 -127
- data/doc/files/lib/cachetastic/caches/mack_session_cache_rb.html +0 -107
- data/doc/files/lib/cachetastic/caches/page_cache_rb.html +0 -109
- data/doc/files/lib/cachetastic/caches/rails_session_cache_rb.html +0 -107
- data/doc/files/lib/cachetastic/connection_rb.html +0 -107
- data/doc/files/lib/cachetastic/errors/unsupported_adapter_rb.html +0 -101
- data/doc/files/lib/cachetastic/rails_extensions/active_record_base_rb.html +0 -101
- data/doc/files/lib/cachetastic/rails_extensions/cgi_session_store_rb.html +0 -109
- data/doc/files/lib/cachetastic/ruby_extensions/object_rb.html +0 -101
- data/lib/cachetastic/adapters/drb.rb +0 -51
- data/lib/cachetastic/adapters/file_base.rb +0 -86
- data/lib/cachetastic/adapters/html_file.rb +0 -68
- data/lib/cachetastic/adapters/memcache.rb +0 -114
- data/lib/cachetastic/adapters/store_object.rb +0 -28
- data/lib/cachetastic/caches/base.rb +0 -238
- data/lib/cachetastic/caches/mack_session_cache.rb +0 -3
- data/lib/cachetastic/caches/page_cache.rb +0 -6
- data/lib/cachetastic/caches/rails_session_cache.rb +0 -12
- data/lib/cachetastic/connection.rb +0 -24
- data/lib/cachetastic/errors/unsupported_adapter.rb +0 -7
- data/lib/cachetastic/rails_extensions/active_record_base.rb +0 -24
- data/lib/cachetastic/rails_extensions/cgi_session_store.rb +0 -59
- data/lib/cachetastic/ruby_extensions/kernel.rb +0 -25
- data/lib/cachetastic/ruby_extensions/object.rb +0 -22
- data/lib/cachetastic/ruby_extensions/string.rb +0 -15
- data/test/active_record_test.rb +0 -89
- data/test/cacheable_test.rb +0 -88
- data/test/cachetastic_unit_test.rb +0 -74
- data/test/config.rb +0 -30
- data/test/drb_adapter_test.rb +0 -14
- data/test/file_adapter_test.rb +0 -49
- data/test/memcache_adapter_test.rb +0 -18
- data/test/test_helper.rb +0 -75
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# This adapter uses the file system as it's backing.
|
|
2
|
-
# Caches are stored in files called index.html.
|
|
3
|
-
# At the beginning of the html the following html comments are pre-pended:
|
|
4
|
-
# <!-- cachetastic: expires_at: Fri Feb 01 20:51:45 -0500 2008 -->
|
|
5
|
-
# <!-- cachetastic: key: /channels/1-arts-humanities -->
|
|
6
|
-
# Obviously the expires_at date will be the ACTUAL expire date,
|
|
7
|
-
# same goes for the key.
|
|
8
|
-
# The configuration for this should look something like this:
|
|
9
|
-
# my_awesome_cache_options:
|
|
10
|
-
# debug: false
|
|
11
|
-
# adapter: html_file
|
|
12
|
-
# marshall_method: none
|
|
13
|
-
# default_expiry: <%= 24.hours %>
|
|
14
|
-
# store_options:
|
|
15
|
-
# dir: /usr/local/caches/
|
|
16
|
-
# logging:
|
|
17
|
-
# logger_1:
|
|
18
|
-
# type: file
|
|
19
|
-
# file: log/file_store_cache.log
|
|
20
|
-
require 'time'
|
|
21
|
-
class Cachetastic::Adapters::HtmlFile < Cachetastic::Adapters::FileBase
|
|
22
|
-
|
|
23
|
-
def get(key)
|
|
24
|
-
full_path = full_path_from_dir(get_key_directoy(key, false))
|
|
25
|
-
return nil unless File.exists?(full_path)
|
|
26
|
-
so = html_to_store_object(File.open(full_path).read)
|
|
27
|
-
if so
|
|
28
|
-
if so.invalid?
|
|
29
|
-
self.delete(key)
|
|
30
|
-
return nil
|
|
31
|
-
end
|
|
32
|
-
return so.value
|
|
33
|
-
end
|
|
34
|
-
return nil
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def set(key, value, expiry = 0)
|
|
38
|
-
so = Cachetastic::Adapters::StoreObject.new(key.to_s, value, expiry)
|
|
39
|
-
File.open(full_path_from_key(key), "w") do |f|
|
|
40
|
-
f.puts store_object_to_html(so)
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
protected
|
|
45
|
-
def store_file_name
|
|
46
|
-
return STORE_FILE_NAME
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
private
|
|
50
|
-
def html_to_store_object(html)
|
|
51
|
-
key = html.match(/<!-- cachetastic: key: (.*) -->/).captures.first
|
|
52
|
-
expires_at = html.match(/<!-- cachetastic: expires_at: (.*) -->/).captures.first
|
|
53
|
-
html.gsub!(/<!-- cachetastic: key: .* -->/, '')
|
|
54
|
-
html.gsub!(/<!-- cachetastic: expires_at: .* -->/, '')
|
|
55
|
-
so = Cachetastic::Adapters::StoreObject.new(key, html, 0)
|
|
56
|
-
so.expires_at = Time.parse(expires_at)
|
|
57
|
-
so
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def store_object_to_html(so)
|
|
61
|
-
x = so.value
|
|
62
|
-
x << "\n<!-- cachetastic: expires_at: #{so.expires_at} -->"
|
|
63
|
-
x << "\n<!-- cachetastic: key: #{so.key} -->"
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
STORE_FILE_NAME = "index.html"
|
|
67
|
-
|
|
68
|
-
end
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
# This adapter uses Memcache as it's backing.
|
|
2
|
-
# The configuration for this should look something like this:
|
|
3
|
-
# my_awesome_cache_options:
|
|
4
|
-
# debug: false
|
|
5
|
-
# adapter: memcache
|
|
6
|
-
# marshall_method: none
|
|
7
|
-
# default_expiry: <%= 24.hours %>
|
|
8
|
-
# store_options:
|
|
9
|
-
# c_threshold: 10_000
|
|
10
|
-
# compression: true
|
|
11
|
-
# debug: false
|
|
12
|
-
# readonly: false
|
|
13
|
-
# urlencode: false
|
|
14
|
-
# logging:
|
|
15
|
-
# logger_1:
|
|
16
|
-
# type: file
|
|
17
|
-
# file: log/memcached.log
|
|
18
|
-
# servers:
|
|
19
|
-
# - 127.0.0.1:11211
|
|
20
|
-
class Cachetastic::Adapters::Memcache < Cachetastic::Adapters::Base
|
|
21
|
-
|
|
22
|
-
def setup
|
|
23
|
-
self.conn = MemCache.new([configuration.servers].flatten, configuration.store_options.to_hash.merge({:namespace => self.namespace}))
|
|
24
|
-
self.version = self.get_version(self.name)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def set(key, value, expiry = 0, raw = false)
|
|
28
|
-
self.conn.set(key, value, expiry, raw)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def delete(key, delay = 0)
|
|
32
|
-
self.conn.delete(key, delay)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def get(key, raw = false)
|
|
36
|
-
self.conn.get(key, raw)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def expire_all
|
|
40
|
-
self.increment_version(self.name)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def inspect
|
|
44
|
-
self.conn.inspect + " <version: #{self.version}> #{self.conn.stats.inspect}"
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def valid?
|
|
48
|
-
begin
|
|
49
|
-
return (self.conn.active? && self.version == self.get_version(self.name))
|
|
50
|
-
rescue Exception => e
|
|
51
|
-
puts e.message
|
|
52
|
-
puts e.backtrace.join("\n")
|
|
53
|
-
return false
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def stats
|
|
58
|
-
super
|
|
59
|
-
begin
|
|
60
|
-
puts "Memcache stats for all caches:"
|
|
61
|
-
memc = self.conn
|
|
62
|
-
puts Kernel.pp_to_s(memc.stats)
|
|
63
|
-
paths = `sh -c 'echo $PATH'`
|
|
64
|
-
paths = paths.split(':')
|
|
65
|
-
memcached_tool_found = false
|
|
66
|
-
paths.each do |path|
|
|
67
|
-
cmd_path = File.expand_path(File.join(path,'memcached_tool'))
|
|
68
|
-
if File.exists?(cmd_path)
|
|
69
|
-
memcached_tool_found = true
|
|
70
|
-
break
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
if memcached_tool_found
|
|
74
|
-
configuration.memcache_servers.each do |server|
|
|
75
|
-
puts `memcached_tool #{server}`
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
rescue
|
|
79
|
-
end
|
|
80
|
-
puts ""
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
protected
|
|
84
|
-
attr_accessor :conn
|
|
85
|
-
attr_accessor :version
|
|
86
|
-
|
|
87
|
-
def namespace
|
|
88
|
-
v = self.get_version(self.name)
|
|
89
|
-
return "#{name}.#{v}"
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def ns_versions
|
|
93
|
-
ivar_cache do
|
|
94
|
-
ns_conn = MemCache.new([configuration.servers].flatten, configuration.store_options.to_hash.merge({:namespace => :namespace_versions}))
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def increment_version(name)
|
|
99
|
-
name = name.to_s
|
|
100
|
-
v = get_version(name)
|
|
101
|
-
self.ns_versions.set(name, v + 1)
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def get_version(name)
|
|
105
|
-
name = name.to_s
|
|
106
|
-
v = self.ns_versions.get(name)
|
|
107
|
-
if v.nil?
|
|
108
|
-
self.ns_versions.set(name, 1)
|
|
109
|
-
v = 1
|
|
110
|
-
end
|
|
111
|
-
v
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
class Cachetastic::Adapters::StoreObject #:nodoc:#
|
|
2
|
-
attr_accessor :key
|
|
3
|
-
attr_accessor :value
|
|
4
|
-
attr_accessor :expires_at
|
|
5
|
-
|
|
6
|
-
def initialize(key, value, expiry)
|
|
7
|
-
self.key = key
|
|
8
|
-
self.value = value
|
|
9
|
-
begin
|
|
10
|
-
self.expires_at = (Time.now + (expiry == 0 ? (31536000) : expiry)) # 31536000 = one year
|
|
11
|
-
rescue RangeError => e
|
|
12
|
-
self.expires_at = Time.at(expiry)
|
|
13
|
-
end
|
|
14
|
-
# puts "now: #{Time.now}"
|
|
15
|
-
# puts "expiry: #{expiry}"
|
|
16
|
-
# puts "expires_at: #{self.expires_at}"
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def size
|
|
20
|
-
return self.value.size if self.value.respond_to?(:size)
|
|
21
|
-
-1
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def invalid?
|
|
25
|
-
Time.now >= self.expires_at
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
end
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
require 'singleton'
|
|
2
|
-
# When creating a new 'Cache' this class should be extended.
|
|
3
|
-
# Once extended you'll only need to override just the methods
|
|
4
|
-
# that are different for your cache.
|
|
5
|
-
# class MyAwesomeCache < Cachetastic::Caches::Base
|
|
6
|
-
# end
|
|
7
|
-
# MyAwesomeCache.set(1, "One")
|
|
8
|
-
# MyAwesomeCache.get(1) # => "One"
|
|
9
|
-
# MyAwesomeCache.update(1, "One!!")
|
|
10
|
-
# MyAwesomeCache.get(1) # => "One!!"
|
|
11
|
-
# MyAwesomeCache.delete(1)
|
|
12
|
-
# MyAwesomeCache.get(1) # => nil
|
|
13
|
-
#
|
|
14
|
-
# class MyAwesomeCache < Cachetastic::Caches::Base
|
|
15
|
-
# class << self
|
|
16
|
-
# def get(key)
|
|
17
|
-
# super(key) do
|
|
18
|
-
# set(key, key * 10)
|
|
19
|
-
# end
|
|
20
|
-
# end
|
|
21
|
-
# end
|
|
22
|
-
# end
|
|
23
|
-
# MyAwesomeCache.set(1, "One")
|
|
24
|
-
# MyAwesomeCache.get(1) # => "One"
|
|
25
|
-
# MyAwesomeCache.delete(1)
|
|
26
|
-
# MyAwesomeCache.get(1) # => 10
|
|
27
|
-
class Cachetastic::Caches::Base
|
|
28
|
-
|
|
29
|
-
# Used to store a list of all the caches registered with the system.
|
|
30
|
-
# In order for a cache to be registered it must extend Cachetastic::Caches::Base.
|
|
31
|
-
class RegisteredCaches
|
|
32
|
-
include Singleton
|
|
33
|
-
|
|
34
|
-
# list of all caches registered with the system.
|
|
35
|
-
attr_reader :list
|
|
36
|
-
|
|
37
|
-
def initialize
|
|
38
|
-
@list = []
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# everything is done at the class level. there won't be any 'instances of it'
|
|
44
|
-
# using class << self means we don't have to prefix each method with 'self.'
|
|
45
|
-
class << self
|
|
46
|
-
|
|
47
|
-
# Returns a list of all registered caches in the system.
|
|
48
|
-
def all_registered_caches
|
|
49
|
-
RegisteredCaches.instance.list
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Returns an object from the cache for a given key.
|
|
53
|
-
# If the object comes back as nil and a block is given
|
|
54
|
-
# that block will be run and the results of the block
|
|
55
|
-
# will be run. This can be used to JIT caches, just make
|
|
56
|
-
# sure in the block to call the set method because the
|
|
57
|
-
# results of the block are not automatically cached.
|
|
58
|
-
def get(key, &block)
|
|
59
|
-
res = nil
|
|
60
|
-
do_with_logging(:get, key) do
|
|
61
|
-
retryable(:on => ArgumentError) do
|
|
62
|
-
begin
|
|
63
|
-
res = adapter.get(key.to_s)
|
|
64
|
-
if res.nil?
|
|
65
|
-
res = yield key if block_given?
|
|
66
|
-
else
|
|
67
|
-
res = unmarshall(res)
|
|
68
|
-
end
|
|
69
|
-
res
|
|
70
|
-
rescue ArgumentError => e
|
|
71
|
-
m = e.message.match(/class\/module .*/)
|
|
72
|
-
if m
|
|
73
|
-
m = m.to_s
|
|
74
|
-
m.gsub!("class/module", '')
|
|
75
|
-
m.gsub!("(ArgumentError)", '')
|
|
76
|
-
require m.strip.underscore
|
|
77
|
-
raise e
|
|
78
|
-
end
|
|
79
|
-
rescue Exception => e
|
|
80
|
-
raise e
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
res
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# Set a particular object info the cache for the given key.
|
|
88
|
-
# An optional third parameter sets the expiry time for the object in the cache.
|
|
89
|
-
# The default for this expiry is set as either 0, meaning it never expires, or
|
|
90
|
-
# if there's a default_expiry time set in the config file, that file will be
|
|
91
|
-
# used.
|
|
92
|
-
# If there is an expiry_swing set in the config file it will be +/- to the
|
|
93
|
-
# expiry time. See also: calculate_expiry_time
|
|
94
|
-
def set(key, value, expiry = adapter.configuration.retrieve(:default_expiry, 0))
|
|
95
|
-
do_with_logging(:set, key) do
|
|
96
|
-
expiry = calculate_expiry_time(expiry)
|
|
97
|
-
adapter.set(key.to_s, marshall(value), expiry.to_i)
|
|
98
|
-
logger.info('', '', :expiry, cache_name, key, expiry.to_i)
|
|
99
|
-
value
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
alias_method :put, :set
|
|
104
|
-
|
|
105
|
-
# Deletes an object from the cache. The optional delay parameter
|
|
106
|
-
# sets an offset, in seconds, for when the object should get deleted.
|
|
107
|
-
# The default of 0 means the object gets deleted right away.
|
|
108
|
-
def delete(key, delay = 0)
|
|
109
|
-
do_with_logging(:delete, key) do
|
|
110
|
-
adapter.delete(key.to_s, delay)
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
# Expires all objects for this cache.
|
|
115
|
-
def expire_all
|
|
116
|
-
adapter.expire_all
|
|
117
|
-
logger.info('', '', :expired, cache_name)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
# Raises a MethodNotImplemented exception. This method should be overridden
|
|
121
|
-
# in the child class to enable a populating the cache with all things that
|
|
122
|
-
# should be in there.
|
|
123
|
-
needs_method :populate_all
|
|
124
|
-
|
|
125
|
-
# A convenience method that returns statistics for the underlying Cachetastic::Adapters::Base for the cache.
|
|
126
|
-
def stats
|
|
127
|
-
adapter.stats
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
# Returns a 'methodize' version of the cache's class name. This gets used in logging,
|
|
131
|
-
# namespacing, and as the key in the Cachetastic::Connection class.
|
|
132
|
-
# MyAwesomeCache.cache # => "my_awesome_cache"
|
|
133
|
-
# Cachetastic::Caches::Base # => "cachetastic_caches_base"
|
|
134
|
-
def cache_name
|
|
135
|
-
self.name.methodize
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
# Returns the underlying Cachetastic::Adapters::Base for this cache.
|
|
139
|
-
def adapter
|
|
140
|
-
a = cache_conn_instance.get(cache_name)
|
|
141
|
-
if adapter_supported?(a.class)
|
|
142
|
-
return a
|
|
143
|
-
else
|
|
144
|
-
raise Cachetastic::Errors::UnsupportedAdapter.new(cache_name, a.class)
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
# Returns the Cachetastic::Logger for the underlying Cachetastic::Adapters::Base.
|
|
149
|
-
def logger
|
|
150
|
-
adapter.logger
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
# Returns an array of unsupported adapters for this cache. Defaults to an empty
|
|
154
|
-
# array which will let any adapter be used by the cache. Override in your specific
|
|
155
|
-
# cache to prevent certain adapters.
|
|
156
|
-
def unsupported_adapters
|
|
157
|
-
[]
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
# Returns true/false on whether the adapter you want to use is supported for the cache.
|
|
161
|
-
def adapter_supported?(a = cache_conn_instance.get(cache_name).class)
|
|
162
|
-
return !unsupported_adapters.include?(a)
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def marshall(value)
|
|
166
|
-
return value if value.nil?
|
|
167
|
-
return case adapter.configuration.retrieve(:marshall_method, :none).to_sym
|
|
168
|
-
when :yaml
|
|
169
|
-
YAML.dump(value)
|
|
170
|
-
when :ruby
|
|
171
|
-
Marshal.dump(value)
|
|
172
|
-
else
|
|
173
|
-
value
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
def unmarshall(value)
|
|
178
|
-
return value if value.nil?
|
|
179
|
-
return case adapter.configuration.retrieve(:marshall_method, :none).to_sym
|
|
180
|
-
when :yaml
|
|
181
|
-
YAML.load(value)
|
|
182
|
-
when :ruby
|
|
183
|
-
Marshal.load(value)
|
|
184
|
-
else
|
|
185
|
-
value
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
private
|
|
190
|
-
# If the expiry time is set to 60 minutes and the expiry_swing time is set to
|
|
191
|
-
# 15 minutes, this method will return a number between 45 minutes and 75 minutes.
|
|
192
|
-
def calculate_expiry_time(expiry) # :doc:
|
|
193
|
-
exp_swing = adapter.configuration.retrieve(:expiry_swing, 0)
|
|
194
|
-
if exp_swing && exp_swing != 0
|
|
195
|
-
swing = rand(exp_swing.to_i)
|
|
196
|
-
case rand(2)
|
|
197
|
-
when 0
|
|
198
|
-
expiry = (expiry.to_i + swing)
|
|
199
|
-
when 1
|
|
200
|
-
expiry = (expiry.to_i - swing)
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
|
-
expiry
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
def inherited(child)
|
|
207
|
-
# puts "child: #{child.inspect}"
|
|
208
|
-
all_registered_caches << child.to_s
|
|
209
|
-
# puts "all_registered_caches: #{all_registered_caches.inspect}"
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
def cache_conn_instance
|
|
213
|
-
Cachetastic::Connection.instance
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
def do_with_logging(action, key)
|
|
217
|
-
start_time = Time.now
|
|
218
|
-
logger.info(:starting, action, cache_name, key)
|
|
219
|
-
res = yield if block_given?
|
|
220
|
-
end_time = Time.now
|
|
221
|
-
str = ""
|
|
222
|
-
unless res.nil?
|
|
223
|
-
str = "[#{res.class.name}]"
|
|
224
|
-
str << "\t[Size = #{res.size}]" if res.respond_to? :size
|
|
225
|
-
str << "\t" << res.inspect if adapter.debug?
|
|
226
|
-
end
|
|
227
|
-
logger.info(:finished, action, cache_name, key, (end_time - start_time), str)
|
|
228
|
-
res
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
# make sure people can't instaniate this object!
|
|
232
|
-
def new(*args)
|
|
233
|
-
raise NoMethodError.new("You can not instaniate this class!")
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
end
|