sequel_acts_as_cacheable 1.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/lib/sequel_acts_as_cacheable.rb +129 -0
- metadata +45 -0
@@ -0,0 +1,129 @@
|
|
1
|
+
module Sequel
|
2
|
+
module Plugins
|
3
|
+
module ActsAsCacheable
|
4
|
+
def self.configure(model, opts={})
|
5
|
+
model.instance_eval do
|
6
|
+
@acts_as_cacheable_cache = opts[:cache]
|
7
|
+
@acts_as_cacheable_time_to_live = opts[:time_to_live] || 3600
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
attr_accessor :acts_as_cacheable_cache
|
13
|
+
attr_accessor :acts_as_cacheable_time_to_live
|
14
|
+
|
15
|
+
# Copy the necessary class instance variables to the subclass.
|
16
|
+
def inherited(subclass)
|
17
|
+
super
|
18
|
+
subclass.acts_as_cacheable_cache = acts_as_cacheable_cache
|
19
|
+
subclass.acts_as_cacheable_time_to_live = acts_as_cacheable_time_to_live
|
20
|
+
end
|
21
|
+
|
22
|
+
def model_cache_key model_id
|
23
|
+
base_model_klass = self
|
24
|
+
base_model_klass = base_model_klass.superclass while Sequel::Model != base_model_klass.superclass
|
25
|
+
"#{base_model_klass.name}~#{model_id}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](*args)
|
29
|
+
is_primary_key_lookup =
|
30
|
+
if 1 == args.size
|
31
|
+
if Fixnum == args.first.class
|
32
|
+
true
|
33
|
+
else
|
34
|
+
if String == args.first.class
|
35
|
+
begin
|
36
|
+
Integer(args.first)
|
37
|
+
true
|
38
|
+
rescue
|
39
|
+
false
|
40
|
+
end
|
41
|
+
else
|
42
|
+
false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
else
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
if is_primary_key_lookup
|
50
|
+
key = model_cache_key args.first
|
51
|
+
begin
|
52
|
+
cache_value = @acts_as_cacheable_cache.get key
|
53
|
+
rescue Exception => e
|
54
|
+
logger.error "CACHE.get failed in primary key lookup with args #{args.inspect} and model #{self.class.name} so using mysql lookup instead, exception was #{e.inspect}"
|
55
|
+
cache_value = super *args
|
56
|
+
end
|
57
|
+
|
58
|
+
if !cache_value
|
59
|
+
cache_value = super *args
|
60
|
+
cache_value.cache! if cache_value
|
61
|
+
end
|
62
|
+
|
63
|
+
cache_value
|
64
|
+
else
|
65
|
+
super *args
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module InstanceMethods
|
71
|
+
def cache!
|
72
|
+
unless new?
|
73
|
+
marshallable!
|
74
|
+
if respond_to? :before_cache
|
75
|
+
before_cache
|
76
|
+
end
|
77
|
+
acts_as_cacheable_cache.set model_cache_key, self, acts_as_cacheable_time_to_live
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def uncache!
|
82
|
+
acts_as_cacheable_cache.delete self.class.model_cache_key id
|
83
|
+
end
|
84
|
+
|
85
|
+
alias_method :invalidate_cache!, :uncache!
|
86
|
+
|
87
|
+
def cached?
|
88
|
+
acts_as_cacheable_cache.get(model_cache_key).present?
|
89
|
+
end
|
90
|
+
|
91
|
+
def save *columns
|
92
|
+
result = super *columns
|
93
|
+
invalidate_cache! if result && !new?
|
94
|
+
result
|
95
|
+
end
|
96
|
+
|
97
|
+
def delete
|
98
|
+
result = super
|
99
|
+
invalidate_cache!
|
100
|
+
result
|
101
|
+
end
|
102
|
+
|
103
|
+
def destroy opts = {}
|
104
|
+
result = super opts
|
105
|
+
invalidate_cache! unless false == result
|
106
|
+
result
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
def model_cache_key
|
111
|
+
model.model_cache_key id
|
112
|
+
end
|
113
|
+
|
114
|
+
def acts_as_cacheable_cache
|
115
|
+
model.acts_as_cacheable_cache
|
116
|
+
end
|
117
|
+
|
118
|
+
def acts_as_cacheable_time_to_live
|
119
|
+
model.acts_as_cacheable_time_to_live
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sequel_acts_as_cacheable
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Misha Conway
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-13 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email: MishaAConway@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/sequel_acts_as_cacheable.rb
|
21
|
+
homepage:
|
22
|
+
licenses: []
|
23
|
+
post_install_message:
|
24
|
+
rdoc_options: []
|
25
|
+
require_paths:
|
26
|
+
- lib
|
27
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '0'
|
32
|
+
none: false
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
none: false
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project: nowarning
|
41
|
+
rubygems_version: 1.8.24
|
42
|
+
signing_key:
|
43
|
+
specification_version: 3
|
44
|
+
summary: Memcaching for sequel models.
|
45
|
+
test_files: []
|