Sha256: 2d2343d1633f500775d76c6bdedd647afba163dc2b7f04e5d022d7848a317ea7

Contents?: true

Size: 1.76 KB

Versions: 5

Compression:

Stored size: 1.76 KB

Contents

module Kasket
  class Cache
    def initialize
      clear_local
    end

    def read(*args)
      result = @local_cache[args[0]] || Rails.cache.read(*args)
      if result.is_a?(Array) && result.first.is_a?(String)
        models = get_multi(result)
        result = result.map { |key| models[key] }
      end

      @local_cache[args[0]] = result if result
      result
    end

    def get_multi(keys)
      map = Hash[*keys.zip(keys.map { |key| @local_cache[key] }).flatten]
      missing_keys = map.select { |key, value| value.nil? }.map(&:first)

      unless missing_keys.empty?
        if Rails.cache.respond_to?(:read_multi)
          missing_map = Rails.cache.read_multi(missing_keys)
          missing_map.each do |key, value|
            missing_map[key] = @local_cache[key] = value
          end
          map.merge!(missing_map)
        else
          missing_keys.each do |key|
            map[key] = read(key)
          end
        end
      end

      map
    end

    def write(key, value)
      if storable?(value)
        @local_cache[key] = value.duplicable? ? value.dup : value
        Rails.cache.write(key, value.duplicable? ? value.dup : value) # Fix due to Rails.cache freezing values in 2.3.4
      end
      value
    end

    def delete(*args)
      @local_cache.delete(args[0])
      Rails.cache.delete(*args)
    end

    def delete_local(*keys)
      keys.each do |key|
        @local_cache.delete(key)
      end
    end

    def delete_matched_local(matcher)
      @local_cache.delete_if { |k,v| k =~ matcher }
    end

    def clear_local
      @local_cache = {}
    end

    def local
      @local_cache
    end

    protected

      def storable?(value)
        !value.is_a?(Array) || value.size <= Kasket::CONFIGURATION[:max_collection_size]
      end

  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
kasket-0.6.4 lib/kasket/cache.rb
kasket-0.6.3 lib/kasket/cache.rb
kasket-0.6.2 lib/kasket/cache.rb
kasket-0.6.1 lib/kasket/cache.rb
kasket-0.6.0 lib/kasket/cache.rb