cache2base 0.0.5 → 0.0.6

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.
@@ -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