cache2base 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- hsh.each_pair do |k,v|
30
- self.send(:"#{k}=", v)
31
- end
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
- o = {}
58
- self.class.fields.each do |field|
59
- o[field] = self.send(field) if !self.send(field).nil?
60
- end
61
- o
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 "attr_accessor :#{field}"
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 "attr_accessor :#{field}"
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
- @hashed_collections ||= {}
200
- @hashed_collections[fields.join(",").to_s] = true if params[:hash_key]
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
- @hashed_collections[Array(field).join(',').to_s]
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
- arr = server.get(collection_key(fields))
250
- find_by_keys(Array(arr)).compact
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
@@ -1,3 +1,3 @@
1
1
  module Cache2base
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
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: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jason Pearlman