ngmoco-cache-money 0.2.23 → 0.2.24.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,263 +0,0 @@
1
- # require 'memcache'
2
- # require 'memcached'
3
-
4
- #typically MemCache/Memcached can be used via the following in rails/init.rb:
5
- #$memcache = MemCache.new(memcache_config[:servers].gsub(' ', '').split(','), memcache_config)
6
- #$memcache = Memcached::Rails.new(memcache_config[:servers].gsub(' ', '').split(','), memcache_config)
7
-
8
- #this wrapper lets both work.
9
-
10
- ########## they have Memcached installed (do need the wrapper)
11
- if defined? Memcached
12
- Rails.logger.info("cache-money: Memcached installed") if defined? Rails
13
-
14
- class Memcached
15
- alias :get_multi :get #:nodoc:
16
- end
17
-
18
- class MemcachedWrapper < ::Memcached
19
- DEFAULTS = { :servers => '127.0.0.1:11211' }
20
-
21
- attr_reader :logger, :default_ttl
22
-
23
- # See Memcached#new for details.
24
- def initialize(*args)
25
- opts = DEFAULTS.merge(args.last.is_a?(Hash) ? args.pop : {})
26
-
27
- if opts.respond_to?(:symbolize_keys!)
28
- opts.symbolize_keys!
29
- else
30
- opts = symbolize_keys(opts)
31
- end
32
-
33
- servers = Array(
34
- args.any? ? args.unshift : opts.delete(:servers)
35
- ).flatten.compact
36
-
37
- opts[:prefix_key] ||= "#{opts[:namespace]}:"
38
-
39
- @logger = opts[:logger]
40
- @debug = opts[:debug]
41
-
42
- super(servers, opts)
43
- end
44
-
45
- def symbolize_keys(opts)
46
- # Destructively convert all keys to symbols.
47
- if opts.kind_of?(Hash) && !opts.kind_of?(HashWithIndifferentAccess)
48
- opts.keys.each do |key|
49
- unless key.is_a?(Symbol)
50
- opts[key.to_sym] = opts[key]
51
- opts.delete(key)
52
- end
53
- end
54
- end
55
- opts
56
- end
57
-
58
- def namespace
59
- options[:prefix_key]
60
- end
61
-
62
- # Wraps Memcached::Rails#add to return a text string - for cache money
63
- def add(key, value, ttl=@default_ttl, raw=false)
64
- logger.debug("Memcached add: #{key.inspect}") if logger && @debug
65
- super(key, value, ttl, !raw)
66
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
67
- stored
68
- rescue Memcached::NotStored
69
- logger.debug("Memcached miss: #{key.inspect}") if logger && @debug
70
- not_stored
71
- rescue Memcached::Error
72
- log_error($!) if logger
73
- not_stored
74
- end
75
-
76
- def replace(key, value, ttl = @default_ttl, raw = false)
77
- logger.debug("Memcached replace: #{key.inspect}") if logger && @debug
78
- super(key, value, ttl, !raw)
79
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
80
- stored
81
- rescue Memcached::NotStored
82
- logger.debug("Memcached miss: #{key.inspect}") if logger && @debug
83
- not_stored
84
- rescue Memcached::Error
85
- log_error($!) if logger
86
- not_stored
87
- end
88
-
89
- # Wraps Memcached#get so that it doesn't raise. This has the side-effect of preventing you from
90
- # storing <tt>nil</tt> values.
91
- def get(key, raw=false)
92
- logger.debug("Memcached get: #{key.inspect}") if logger && @debug
93
- value = super(key, !raw)
94
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
95
- value
96
- rescue Memcached::NotFound
97
- logger.debug("Memcached miss: #{key.inspect}") if logger && @debug
98
- nil
99
- rescue TypeError
100
- log_error($!) if logger
101
- delete(key)
102
- logger.debug("Memcached deleted: #{key.inspect}") if logger && @debug
103
- nil
104
- rescue Memcached::Error
105
- log_error($!) if logger
106
- nil
107
- end
108
-
109
- def fetch(key, expiry = 0, raw = false)
110
- value = get(key, !raw)
111
-
112
- if value.nil? && block_given?
113
- value = yield
114
- add(key, value, expiry, !raw)
115
- end
116
-
117
- value
118
- end
119
-
120
- # Wraps Memcached#cas so that it doesn't raise. Doesn't set anything if no value is present.
121
- def cas(key, ttl=@default_ttl, raw=false, &block)
122
- logger.debug("Memcached cas: #{key.inspect}") if logger && @debug
123
- super(key, ttl, !raw, &block)
124
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
125
- stored
126
- rescue Memcached::NotFound
127
- logger.debug("Memcached miss: #{key.inspect}") if logger && @debug
128
- rescue TypeError
129
- log_error($!) if logger
130
- delete(key)
131
- logger.debug("Memcached deleted: #{key.inspect}") if logger && @debug
132
- rescue Memcached::Error
133
- if $!.is_a?(Memcached::ClientError)
134
- raise $!
135
- end
136
- log_error($!) if logger
137
- end
138
-
139
- def get_multi(*keys)
140
- keys.flatten!
141
- logger.debug("Memcached get_multi: #{keys.inspect}") if logger && @debug
142
- values = super(keys, true)
143
- logger.debug("Memcached hit: #{keys.inspect}") if logger && @debug
144
- values
145
- rescue Memcached::NotFound
146
- logger.debug("Memcached miss: #{keys.inspect}") if logger && @debug
147
- {}
148
- rescue TypeError
149
- log_error($!) if logger
150
- keys.each { |key| delete(key) }
151
- logger.debug("Memcached deleted: #{keys.inspect}") if logger && @debug
152
- {}
153
- rescue Memcached::Error
154
- log_error($!) if logger
155
- {}
156
- end
157
-
158
- def set(key, value, ttl=@default_ttl, raw=false)
159
- logger.debug("Memcached set: #{key.inspect}") if logger && @debug
160
- super(key, value, ttl, !raw)
161
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
162
- stored
163
- rescue Memcached::Error
164
- log_error($!) if logger
165
- not_stored
166
- end
167
-
168
- def append(key, value)
169
- logger.debug("Memcached append: #{key.inspect}") if logger && @debug
170
- super(key, value)
171
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
172
- stored
173
- rescue Memcached::NotStored
174
- logger.debug("Memcached miss: #{key.inspect}") if logger && @debug
175
- not_stored
176
- rescue Memcached::Error
177
- log_error($!) if logger
178
- end
179
-
180
- def prepend(key, value)
181
- logger.debug("Memcached prepend: #{key.inspect}") if logger && @debug
182
- super(key, value)
183
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
184
- stored
185
- rescue Memcached::NotStored
186
- logger.debug("Memcached miss: #{key.inspect}") if logger && @debug
187
- not_stored
188
- rescue Memcached::Error
189
- log_error($!) if logger
190
- end
191
-
192
- def delete(key)
193
- logger.debug("Memcached delete: #{key.inspect}") if logger && @debug
194
- super(key)
195
- logger.debug("Memcached hit: #{key.inspect}") if logger && @debug
196
- deleted
197
- rescue Memcached::NotFound
198
- logger.debug("Memcached miss: #{key.inspect}") if logger && @debug
199
- not_found
200
- rescue Memcached::Error
201
- log_error($!) if logger
202
- end
203
-
204
- def incr(*args)
205
- super
206
- rescue Memcached::NotFound
207
- rescue Memcached::Error
208
- log_error($!) if logger
209
- end
210
-
211
- def decr(*args)
212
- super
213
- rescue Memcached::NotFound
214
- rescue Memcached::Error
215
- log_error($!) if logger
216
- end
217
-
218
- def get_server_for_key(key, options = {})
219
- server_by_key(key)
220
- end
221
-
222
- alias :reset :quit
223
- alias :close :quit #nodoc
224
- alias :flush_all :flush
225
- alias :compare_and_swap :cas
226
- alias :"[]" :get
227
- alias :"[]=" :set
228
-
229
- private
230
-
231
- def stored
232
- "STORED\r\n"
233
- end
234
-
235
- def deleted
236
- "DELETED\r\n"
237
- end
238
-
239
- def not_stored
240
- "NOT_STORED\r\n"
241
- end
242
-
243
- def not_found
244
- "NOT_FOUND\r\n"
245
- end
246
-
247
- def log_error(err)
248
- #logger.error("#{err}: \n\t#{err.backtrace.join("\n\t")}") if logger
249
- logger.error("Memcached ERROR, #{err.class}: #{err}") if logger
250
- end
251
-
252
- end
253
- ####### they have MemCache installed (don't need the wrapper)
254
- elsif defined? MemCache
255
-
256
- Rails.logger.info("cache-money: MemCache installed") if defined? Rails
257
- #TODO add logging?
258
- class MemcachedWrapper < ::MemCache
259
- end
260
-
261
- else
262
- Rails.logger.warn 'unable to determine memcache implementation' if defined? Rails
263
- end #include the wraper
@@ -1,209 +0,0 @@
1
- require 'test_helper'
2
- require 'memcache'
3
-
4
- class MemcachedWrapperTest < ActiveSupport::TestCase
5
-
6
- context "with single memcached server" do
7
-
8
- setup do
9
- @wrapper = MemcachedWrapper.new("127.0.0.1:11211", {:namespace => "wrapper", :show_backtraces => true, :support_cas => true})
10
- @memcache = MemCache.new("127.0.0.1:11211", {:namespace => "memcache"})
11
- @wrapper.flush_all
12
- @memcache.flush_all
13
- end
14
-
15
- teardown do
16
- @wrapper.close
17
- @memcache.reset
18
- end
19
-
20
- should "add" do
21
- assert_equal(@wrapper.add("blah/toe", "blah"), @memcache.add("blah/toe", "blah"))
22
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
23
- assert_equal(@wrapper.add("blah/toe", "blah2"), @memcache.add("blah/toe", "blah2"))
24
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
25
- end
26
-
27
- should "replace" do
28
- assert_equal(@wrapper.replace("blah/toe", "blah"), @memcache.replace("blah/toe", "blah"))
29
- assert_equal(@wrapper.add("blah/toe", "blah"), @memcache.add("blah/toe", "blah"))
30
- assert_equal(@wrapper.replace("blah/toe", "blah2"), @memcache.replace("blah/toe", "blah2"))
31
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
32
- end
33
-
34
- should "get" do
35
- assert_equal(@wrapper.add("blah/toe", "blah"), @memcache.add("blah/toe", "blah"))
36
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
37
- end
38
-
39
- should "fetch" do
40
- assert_equal(@wrapper.fetch("blah/toe") { "blah" }, @memcache.fetch("blah/toe") { "blah" })
41
- assert_equal(@wrapper.fetch("blah/toe") { "blah2" }, @memcache.fetch("blah/toe") { "blah2" })
42
- end
43
-
44
- should "compare and swap" do
45
- assert_equal(@wrapper.cas("blah/toe") { "blah" }, @memcache.cas("blah/toe") { "blah" })
46
- assert_equal(@wrapper.add("blah/toe", "blah"), @memcache.add("blah/toe", "blah"))
47
- assert_equal(@wrapper.cas("blah/toe") { "blah2" }, @memcache.cas("blah/toe") { "blah2" })
48
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
49
- end
50
-
51
- should "get multiple" do
52
- assert_equal(@wrapper.add("blah/toe", "blah"), @memcache.add("blah/toe", "blah"))
53
- assert_equal(@wrapper.add("blah/finger", "blah2"), @memcache.add("blah/finger", "blah2"))
54
- assert_equal(@wrapper.get_multi(["blah/toe", "blah/finger"]), @memcache.get_multi(["blah/toe", "blah/finger"]))
55
- end
56
-
57
- should "set" do
58
- assert_equal(@wrapper.set("blah/toe", "blah"), @memcache.set("blah/toe", "blah"))
59
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
60
- end
61
-
62
- should "append" do
63
- assert_equal(@wrapper.append("blah/toe", "blah"), @memcache.append("blah/toe", "blah"))
64
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
65
-
66
- assert_equal(@wrapper.set("blah/toe", "blah", 0, true), @memcache.set("blah/toe", "blah", 0, true))
67
- assert_equal(@wrapper.get("blah/toe", true), @memcache.get("blah/toe", true))
68
- assert_equal(@wrapper.append("blah/toe", "blah2"), @memcache.append("blah/toe", "blah2"))
69
- assert_equal(@wrapper.get("blah/toe", true), @memcache.get("blah/toe", true))
70
- end
71
-
72
- should "prepend" do
73
- assert_equal(@wrapper.prepend("blah/toe", "blah"), @memcache.prepend("blah/toe", "blah"))
74
- assert_equal(@wrapper.get("blah/toe"), @memcache.get("blah/toe"))
75
-
76
- assert_equal(@wrapper.set("blah/toe", "blah", 0, true), @memcache.set("blah/toe", "blah", 0, true))
77
- assert_equal(@wrapper.prepend("blah/toe", "blah2"), @memcache.prepend("blah/toe", "blah2"))
78
- assert_equal(@wrapper.get("blah/toe", true), @memcache.get("blah/toe", true))
79
- end
80
-
81
- should "delete" do
82
- assert_equal(@wrapper.delete("blah/toe"), @memcache.delete("blah/toe"))
83
- assert_equal(@wrapper.set("blah/toe", "blah"), @memcache.set("blah/toe", "blah"))
84
- assert_equal(@wrapper.delete("blah/toe"), @memcache.delete("blah/toe"))
85
- end
86
-
87
- should "increment" do
88
- assert_equal(@wrapper.incr("blah/count"), @memcache.incr("blah/count"))
89
- assert_equal(@wrapper.set("blah/count", 0, 0, true), @memcache.set("blah/count", 0, 0, true))
90
- assert_equal(@wrapper.incr("blah/count"), @memcache.incr("blah/count"))
91
- end
92
-
93
- should "decrement" do
94
- assert_equal(@wrapper.decr("blah/count"), @memcache.decr("blah/count"))
95
- assert_equal(@wrapper.set("blah/count", 2, 0, true), @memcache.set("blah/count", 2, 0, true))
96
- assert_equal(@wrapper.decr("blah/count"), @memcache.decr("blah/count"))
97
- end
98
-
99
- # should "stats" do
100
- # assert_equal(@wrapper.stats(), @memcache.stats())
101
- # end
102
-
103
- end
104
-
105
- # context "with two memcached servers" do
106
- #
107
- # setup do
108
- # @wrapper = MemcachedWrapper.new(["127.0.0.1:11211", "127.0.0.1:1111"], {:show_backtraces => true, :support_cas => true})
109
- # # @wrapper = MemCache.new(["127.0.0.1:11211", "127.0.0.1:1111"], {:show_backtraces => true, :support_cas => true})
110
- # @wrapper.flush_all
111
- # end
112
- #
113
- # teardown do
114
- # # @wrapper.close
115
- # end
116
- #
117
- # should "add value" do
118
- # assert_stored(@wrapper.add("blah/toe", "blah"))
119
- # assert_equal( "blah", @wrapper.get("blah/toe"))
120
- # assert_not_stored(@wrapper.add("blah/toe", "blah2"))
121
- # assert_equal( "blah", @wrapper.get("blah/toe"))
122
- # end
123
- #
124
- # should "get value" do
125
- # assert_stored(@wrapper.add("blah/toe", "blah"))
126
- # assert_equal( "blah", @wrapper.get("blah/toe"))
127
- # end
128
- #
129
- # should "fetch value" do
130
- # assert_equal( "blah", @wrapper.fetch("blah/toe") { "blah" })
131
- # assert_equal( "blah", @wrapper.fetch("blah/toe") { "blah2" })
132
- # end
133
- #
134
- # should "check and set value" do
135
- # assert_nil( @wrapper.cas("blah/toe") { "blah" })
136
- # assert_stored(@wrapper.add("blah/toe", "blah"))
137
- # assert_stored(@wrapper.cas("blah/toe") { "blah2" })
138
- # assert_equal( "blah2", @wrapper.get("blah/toe"))
139
- # end
140
- #
141
- # should "get multiple values" do
142
- # assert_stored(@wrapper.add("blah/toe", "blah"))
143
- # assert_stored(@wrapper.add("blah/finger", "blah2"))
144
- # assert_equal( {'blah/toe'=>'blah','blah/finger'=>'blah2'}, @wrapper.get_multi(["blah/toe", "blah/finger"]))
145
- # end
146
- #
147
- # should "set value" do
148
- # assert_stored(@wrapper.set("blah/toe", "blah"))
149
- # assert_equal( "blah", @wrapper.get("blah/toe"))
150
- # end
151
- #
152
- # should "append value" do
153
- # assert_not_stored( @wrapper.append("blah/toe", "blah"))
154
- # assert_nil( @wrapper.get("blah/toe"))
155
- #
156
- # assert_stored( @wrapper.set("blah/toe", "blah", 0, true))
157
- # assert_equal( "blah", @wrapper.get("blah/toe", true))
158
- # assert_stored( @wrapper.append("blah/toe", "blah2"))
159
- # assert_equal( "blahblah2", @wrapper.get("blah/toe", true))
160
- # end
161
- #
162
- # should "prepend value" do
163
- # assert_not_stored(@wrapper.prepend("blah/toe", "blah"))
164
- # assert_nil( @wrapper.get("blah/toe"))
165
- #
166
- # assert_stored( @wrapper.set("blah/toe", "blah", 0, true))
167
- # assert_stored( @wrapper.prepend("blah/toe", "blah2"))
168
- # assert_equal( "blah2blah", @wrapper.get("blah/toe", true))
169
- # end
170
- #
171
- # should "delete value" do
172
- # assert_not_found( @wrapper.delete("blah/toe"))
173
- # assert_stored( @wrapper.set("blah/toe", "blah"))
174
- # assert_deleted( @wrapper.delete("blah/toe"))
175
- # end
176
- #
177
- # should "increment value" do
178
- # assert_nil( @wrapper.incr("blah/count"))
179
- # assert_stored(@wrapper.set("blah/count", 0, 0, true))
180
- # assert_equal( 1, @wrapper.incr("blah/count"))
181
- # end
182
- #
183
- # should "decrement value" do
184
- # assert_nil( @wrapper.decr("blah/count"))
185
- # assert_stored(@wrapper.set("blah/count", 2, 0, true))
186
- # assert_equal( 1, @wrapper.decr("blah/count"))
187
- # end
188
- #
189
- # end
190
-
191
- private
192
-
193
- def assert_stored(val)
194
- assert_equal("STORED\r\n", val)
195
- end
196
-
197
- def assert_deleted(val)
198
- assert_equal("DELETED\r\n", val)
199
- end
200
-
201
- def assert_not_stored(val)
202
- assert_equal("NOT_STORED\r\n", val)
203
- end
204
-
205
- def assert_not_found(val)
206
- assert_equal("NOT_FOUND\r\n", val)
207
- end
208
-
209
- end