File: active_support/cache/file_store.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: ActiveSupport#1
  module: Cache#2
  class: FileStore#4
inherits from
  Store ( ActiveSupport::Cache )
has properties
attribute: cache_path [R] #5
method: initialize / 1 #7
method: read / 2 #11
method: write / 3 #16
method: delete / 2 #25
method: delete_matched / 2 #32
method: exist? / 2 #45
method: real_file_path / 1 #51
method: ensure_cache_path / 1 #55
method: search_dir / 2 #59

Class Hierarchy

Object ( Builtin-Module )
Store ( ActiveSupport::Cache )
  FileStore    #4

Code

   1  module ActiveSupport
   2    module Cache
   3      # A cache store implementation which stores everything on the filesystem.
   4      class FileStore < Store
   5        attr_reader :cache_path
   6 
   7        def initialize(cache_path)
   8          @cache_path = cache_path
   9        end
  10 
  11        def read(name, options = nil)
  12          super
  13          File.open(real_file_path(name), 'rb') { |f| Marshal.load(f) } rescue nil
  14        end
  15 
  16        def write(name, value, options = nil)
  17          super
  18          ensure_cache_path(File.dirname(real_file_path(name)))
  19          File.atomic_write(real_file_path(name), cache_path) { |f| Marshal.dump(value, f) }
  20          value
  21        rescue => e
  22          logger.error "Couldn't create cache directory: #{name} (#{e.message})" if logger
  23        end
  24 
  25        def delete(name, options = nil)
  26          super
  27          File.delete(real_file_path(name))
  28        rescue SystemCallError => e
  29          # If there's no cache, then there's nothing to complain about
  30        end
  31 
  32        def delete_matched(matcher, options = nil)
  33          super
  34          search_dir(@cache_path) do |f|
  35            if f =~ matcher
  36              begin
  37                File.delete(f)
  38              rescue SystemCallError => e
  39                # If there's no cache, then there's nothing to complain about
  40              end
  41            end
  42          end
  43        end
  44 
  45        def exist?(name, options = nil)
  46          super
  47          File.exist?(real_file_path(name))
  48        end
  49 
  50        private
  51          def real_file_path(name)
  52            '%s/%s.cache' % [@cache_path, name.gsub('?', '.').gsub(':', '.')]
  53          end
  54 
  55          def ensure_cache_path(path)
  56            FileUtils.makedirs(path) unless File.exist?(path)
  57          end
  58 
  59          def search_dir(dir, &callback)
  60            Dir.foreach(dir) do |d|
  61              next if d == "." || d == ".."
  62              name = File.join(dir, d)
  63              if File.directory?(name)
  64                search_dir(name, &callback)
  65              else
  66                callback.call name
  67              end
  68            end
  69          end
  70      end
  71    end
  72  end