Sha256: 99dd82bde8f24b839f6ae343fd0911bf4a7b7c17e956dc22b8941b5fae71fb13

Contents?: true

Size: 1.51 KB

Versions: 4

Compression:

Stored size: 1.51 KB

Contents

require 'active_support/cache'

module Instagram
  class FailsafeStore < ActiveSupport::Cache::FileStore
    # Reuses the stale cache if a known exception occurs while yielding to the block.
    # The list of exception classes is read from the ":exceptions" array.
    def fetch(name, options = nil)
      options = merged_options(options)
      key = namespaced_key(name, options)
      entry = unless options[:force]
        instrument(:read, name, options) do |payload|
          payload[:super_operation] = :fetch if payload
          read_entry(key, options)
        end
      end

      if entry and not entry.expired?
        instrument(:fetch_hit, name, options) { |payload| }
        entry.value
      else
        reusing_stale = false
        
        result = begin
          instrument(:generate, name, options) do |payload|
            yield
          end
        rescue
          if entry and ignore_exception?($!)
            reusing_stale = true
            instrument(:reuse_stale, name, options) do |payload|
              payload[:exception] = $! if payload
              entry.value
            end
          else
            # TODO: figure out if deleting entries is ever necessary
            # delete_entry(key, options) if entry
            raise
          end
        end
        
        write(name, result, options) unless reusing_stale
        result
      end
    end
    
    private
    
    def ignore_exception?(ex)
      options[:exceptions] && options[:exceptions].any? { |klass| ex.is_a? klass }
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
instagram-0.3.2 lib/instagram/failsafe_store.rb
instagram-0.3.1 lib/instagram/failsafe_store.rb
instagram-0.3.0 lib/instagram/failsafe_store.rb
instagram-0.2.0 lib/instagram/failsafe_store.rb