Class: Card::Cache::Shared

Inherits:
Object show all
Extended by:
SharedClass
Defined in:
card/lib/card/cache/shared.rb

Overview

Shared caches closely mirror the database and are intended to be altered only upon database alterations.

Unlike the database, the shared cache stores records of records that have been requested but are missing or, in the case of some cards, “virtual”, meaning that they follow known patterns but do not exist in the database.

Most shared cache implementations cannot store objects with singleton classes, therefore cards generally must have set_modules re-included after retrieval from the shared cache.

Instance Method Summary collapse

Methods included from SharedClass

new_stamp

Constructor Details

#initialize(opts) ⇒ Shared

Returns a new instance of Shared.

Parameters:

  • opts (Hash)

Options Hash (opts):

  • :store (Rails::Cache)
  • :class, (ruby Class)

    typically ActiveRecord descendant

  • :database (String)


23
24
25
26
27
28
29
# File 'card/lib/card/cache/shared.rb', line 23

def initialize opts
  @store = opts[:store]
  @file_cache = @store.is_a? ActiveSupport::Cache::FileStore
  @klass = opts[:class]
  @class_key = @klass.to_s.to_name.key
  @database = opts[:database] || Cardio.database
end

Instance Method Details

#annihilateObject

the nuclear option. can affect other applications sharing the same cache engine. keep in mind mutually assured destruction.



48
49
50
# File 'card/lib/card/cache/shared.rb', line 48

def annihilate
  @store.clear
end

#delete(key) ⇒ Object



123
124
125
# File 'card/lib/card/cache/shared.rb', line 123

def delete key
  @store.delete full_key(key)
end

#exist?(key) ⇒ Boolean

Returns:

  • (Boolean)


127
128
129
# File 'card/lib/card/cache/shared.rb', line 127

def exist? key
  @store.exist? full_key(key)
end

#fetch(key, &block) ⇒ Object



119
120
121
# File 'card/lib/card/cache/shared.rb', line 119

def fetch key, &block
  @store.fetch full_key(key), &block
end

#full_key(key) ⇒ String

returns prefix/key

Parameters:

  • key (String)

Returns:

  • (String)


72
73
74
75
76
# File 'card/lib/card/cache/shared.rb', line 72

def full_key key
  fk = "#{prefix}/#{key}"
  fk.tr! "*", "X" if @file_cache # save for windows fs
  fk
end

#prefixObject

prefix added to cache key to create a system-wide unique key



65
66
67
# File 'card/lib/card/cache/shared.rb', line 65

def prefix
  @prefix ||= "#{@database}-#{@class_key}-#{stamp}:"
end

#read(key) ⇒ Object



78
79
80
# File 'card/lib/card/cache/shared.rb', line 78

def read key
  @store.read full_key(key)
end

#read_attribute(key, attribute) ⇒ Object

def deep_read key binding.pry # local_cache = @store.send :local_cache # local_cache&.clear read key end



109
110
111
112
113
# File 'card/lib/card/cache/shared.rb', line 109

def read_attribute key, attribute
  # object = deep_read key
  object = read key
  object.instance_variable_get "@#{attribute}"
end

#read_multi(keys) ⇒ Object



82
83
84
85
86
# File 'card/lib/card/cache/shared.rb', line 82

def read_multi keys
  map = keys.each_with_object({}) { |k, h| h[full_key k] = k }
  raw = @store.read_multi(*map.keys)
  raw.each_with_object({}) { |(k, v), h| h[map[k]] = v }
end

#renewObject

renew insures you’re using the most current cache version by reaffirming the stamp and prefix



33
34
35
36
# File 'card/lib/card/cache/shared.rb', line 33

def renew
  @stamp = nil
  @prefix = nil
end

#resetObject

reset effectively clears the cache by setting a new stamp. However unlike annihilate, it won’t bother other apps using the same cache engine.



40
41
42
43
44
# File 'card/lib/card/cache/shared.rb', line 40

def reset
  @stamp = self.class.new_stamp
  @prefix = nil
  Cardio.cache.write stamp_key, @stamp
end

#stampObject

the current time stamp. changing this value effectively resets the cache. Note that Cardio.cache is a simple Rails::Cache, not a Card::Cache object.



55
56
57
# File 'card/lib/card/cache/shared.rb', line 55

def stamp
  @stamp ||= Cardio.cache.fetch(stamp_key) { self.class.new_stamp }
end

#stamp_keyObject

key for looking up the current stamp



60
61
62
# File 'card/lib/card/cache/shared.rb', line 60

def stamp_key
  "#{@database}-#{@class_key}-#{self.class.stamp}-stamp"
end

#write(key, value) ⇒ Object



115
116
117
# File 'card/lib/card/cache/shared.rb', line 115

def write key, value
  @store.write full_key(key), value
end

#write_attribute(key, attribute, value) ⇒ Object

update an attribute of an object already in the cache

Parameters:

  • key (String)
  • attribute (String, Symbol)


91
92
93
94
95
96
97
98
99
100
# File 'card/lib/card/cache/shared.rb', line 91

def write_attribute key, attribute, value
  return value unless @store

  # if (object = deep_read key)
  if (object = read key)
    object.instance_variable_set "@#{attribute}", value
    write key, object
  end
  value
end