cache2base 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/cache2base/core.rb +67 -16
- data/lib/cache2base/version.rb +1 -1
- metadata +3 -3
data/lib/cache2base/core.rb
CHANGED
@@ -4,6 +4,7 @@ module Cache2base
|
|
4
4
|
klass.class_eval "@ttl ||= 0"
|
5
5
|
klass.class_eval "@collections ||= []"
|
6
6
|
klass.class_eval "@server ||= Cache2base.server"
|
7
|
+
klass.class_eval "attr_accessor :values"
|
7
8
|
klass.extend(ClassMethods)
|
8
9
|
end
|
9
10
|
|
@@ -26,9 +27,10 @@ module Cache2base
|
|
26
27
|
|
27
28
|
def initialize(hsh = {}, params = {})
|
28
29
|
@new_instance = params[:new_instance].nil? ? true : params[:new_instance]
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
@values ||= hsh
|
31
|
+
#hsh.each_pair do |k,v|
|
32
|
+
# self.send(:"#{k}=", v)
|
33
|
+
#end
|
32
34
|
end
|
33
35
|
|
34
36
|
def new?
|
@@ -54,17 +56,22 @@ module Cache2base
|
|
54
56
|
end
|
55
57
|
|
56
58
|
def field_hash
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
@values
|
60
|
+
#o = {}
|
61
|
+
#self.class.fields.each do |field|
|
62
|
+
# o[field] = self.send(field) if !self.send(field).nil?
|
63
|
+
#end
|
64
|
+
#o
|
62
65
|
end
|
63
66
|
|
64
67
|
def collection_key(field)
|
65
68
|
self.class.collection_key(Hash[Array(field).collect {|f| [f, self.send(f)]}])
|
66
69
|
end
|
67
70
|
|
71
|
+
def collection_max(field)
|
72
|
+
self.class.collection_max(field)
|
73
|
+
end
|
74
|
+
|
68
75
|
def add_to_collections
|
69
76
|
self.class.collections.each do |field|
|
70
77
|
raise "Could not add field #{field} collection" unless add_to_collection(field)
|
@@ -75,6 +82,7 @@ module Cache2base
|
|
75
82
|
Array(field).each { |f| return 'could_not_add' if self.send(f).nil? } # still evaluates to true, so add_to_collections does not fail
|
76
83
|
success = server.cas(collection_key(field), self.class.ttl) do |value|
|
77
84
|
value << self.key unless value.include?(self.key)
|
85
|
+
value = value.drop(value.length - collection_max(field)) if collection_max(field) && value.length > collection_max(field)
|
78
86
|
value
|
79
87
|
end
|
80
88
|
|
@@ -140,6 +148,13 @@ module Cache2base
|
|
140
148
|
@server
|
141
149
|
end
|
142
150
|
|
151
|
+
def field_accessor(*fields)
|
152
|
+
fields.each do |field|
|
153
|
+
class_eval "def #{field}; @values[:\"#{field}\"]; end"
|
154
|
+
class_eval "def #{field}=(v); @values[:\"#{field}\"] = v; end"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
143
158
|
def set_primary_key(mk, params = {})
|
144
159
|
@primary_key = Array(mk)
|
145
160
|
#o = '#{self.class}'
|
@@ -173,7 +188,7 @@ module Cache2base
|
|
173
188
|
def set_fields(*fields)
|
174
189
|
@fields = @fields ? (@fields + (fields)) : (fields)
|
175
190
|
fields.each do |field|
|
176
|
-
class_eval "
|
191
|
+
class_eval "field_accessor :#{field}"
|
177
192
|
end
|
178
193
|
end
|
179
194
|
|
@@ -185,7 +200,7 @@ module Cache2base
|
|
185
200
|
@field_meta[field] ||= {}
|
186
201
|
@field_meta[field][:hash] = true
|
187
202
|
end
|
188
|
-
class_eval "
|
203
|
+
class_eval "field_accessor :#{field}"
|
189
204
|
end
|
190
205
|
|
191
206
|
def uses_hash?(field)
|
@@ -196,8 +211,10 @@ module Cache2base
|
|
196
211
|
fields = Array(fields).sort { |a,b| a.to_s <=> b.to_s }
|
197
212
|
@collections ||= []
|
198
213
|
@collections << fields
|
199
|
-
@
|
200
|
-
@
|
214
|
+
@collection_settings ||= {}
|
215
|
+
@collection_settings[fields.join(",").to_s] = {}
|
216
|
+
@collection_settings[fields.join(",").to_s][:hash_key] = true if params[:hash_key]
|
217
|
+
@collection_settings[fields.join(",").to_s][:max] = params[:max].to_i if params[:max]
|
201
218
|
end
|
202
219
|
|
203
220
|
def collections
|
@@ -209,12 +226,16 @@ module Cache2base
|
|
209
226
|
"#{@basename}_c_#{hash_collection?(keys) ? hash_key(keys.collect {|field| vhsh[field].to_s.gsub('_','-') }.join("_")) : keys.collect {|field| vhsh[field].to_s.gsub('_','-') }.join("_")}"
|
210
227
|
end
|
211
228
|
|
229
|
+
def collection_max(field)
|
230
|
+
@collection_settings[Array(field).join(',').to_s][:max]
|
231
|
+
end
|
232
|
+
|
212
233
|
def fields
|
213
234
|
@fields
|
214
235
|
end
|
215
236
|
|
216
237
|
def hash_collection?(field)
|
217
|
-
@
|
238
|
+
@collection_settings[Array(field).join(',').to_s][:hash_key]
|
218
239
|
end
|
219
240
|
|
220
241
|
def find(fields, params = {})
|
@@ -232,7 +253,7 @@ module Cache2base
|
|
232
253
|
def find_by_keys(keys)
|
233
254
|
hsh = server.get_multi(keys)
|
234
255
|
keys.collect do |key| # to get it back in order since get_multi results in a hash
|
235
|
-
self.from_hash(Marshal.load(hsh[key]))
|
256
|
+
hsh[key] ? self.from_hash(Marshal.load(hsh[key])) : nil
|
236
257
|
end.compact
|
237
258
|
end
|
238
259
|
|
@@ -245,9 +266,39 @@ module Cache2base
|
|
245
266
|
o.save
|
246
267
|
end
|
247
268
|
|
269
|
+
def clean_nil_keys(fields, keys)
|
270
|
+
server.cas(collection_key(fields), @ttl) do |current_keys|
|
271
|
+
keys.each do |key|
|
272
|
+
current_keys.delete(key)
|
273
|
+
end
|
274
|
+
|
275
|
+
current_keys
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
248
279
|
def all(fields, params = {})
|
249
|
-
|
250
|
-
|
280
|
+
keys = server.get(collection_key(fields))
|
281
|
+
hsh = server.get_multi(keys)
|
282
|
+
nils = []
|
283
|
+
|
284
|
+
o = (keys||[]).collect do |key| # to get it back in order since get_multi results in a hash
|
285
|
+
if hsh[key]
|
286
|
+
self.from_hash(Marshal.load(hsh[key]))
|
287
|
+
else
|
288
|
+
nils << key
|
289
|
+
nil
|
290
|
+
end
|
291
|
+
end.compact
|
292
|
+
|
293
|
+
# I do not like doing "garbage collection" on read, but cant find any other place to put it.
|
294
|
+
clean_nil_keys(fields, nils) if @ttl > 0 && !nils.empty?
|
295
|
+
|
296
|
+
o
|
251
297
|
end
|
298
|
+
|
299
|
+
#def all(fields, params = {})
|
300
|
+
# arr = server.get(collection_key(fields))
|
301
|
+
# find_by_keys(Array(arr)).compact
|
302
|
+
#end
|
252
303
|
end
|
253
304
|
end
|
data/lib/cache2base/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cache2base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jason Pearlman
|