Sha256: de604ceeb9b73b499245b5cd0ecb730a490e699db560b3f7c40e9b47011beecc

Contents?: true

Size: 1.97 KB

Versions: 1

Compression:

Stored size: 1.97 KB

Contents

require 'active_support'
require 'redis-store-with-cas'
require 'active_support/cache/redis_store'

module ActiveSupport
  module Cache
    module RedisStoreCas

      attr_accessor :read_only

      def cas name,options=nil
        options = merged_options(options)
        key = normalize_key(name, options)
        instrument(:cas, name, options) do
          ttl = cas_expiration options
          @data.cas(key,ttl) do |entry|
            value = yield entry.value
            break true if read_only
            options[:raw].present? ? value : Entry.new(value, options)
          end
        end
      end

      def cas_multi(*names)
        options = names.extract_options!
        return if names.empty?

        options = merged_options(options)
        keys_to_names = Hash[names.map { |name| [normalize_key(name, options), name] }]

        instrument(:cas_multi, names, options) do
          @data.cas_multi(*(keys_to_names.keys), {:expires_in => cas_expiration(options)}) do |raw_values|
            values = {}
            raw_values.each do |key, entry|
              values[keys_to_names[key]] = entry.value unless entry.expired?
            end
            values = yield values
            break true if read_only
            mapped_values = values.map do |name,value|
              [normalize_key(name, options),options[:raw].present? ? value : Entry.new(value, options)]
            end
            Hash[mapped_values]
          end
          true
        end

      end

      private

      def cas_expiration(options)
        if options[:expires_in].present? && options[:race_condition_ttl].present? && options[:raw].blank?
          options[:expires_in].to_f + options[:race_condition_ttl].to_f
        else
          nil
        end
      end

    end

    class RedisStoreWithCas < RedisStore

      def initialize(*adresses)
        super 
        check_and_extend_cas
      end

      private

      def check_and_extend_cas
        extend RedisStoreCas 
      end

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
redis-activesupport-with-cas-0.0.4 lib/active_support/cache/redis_store_with_cas.rb