A cache store implementation which stores everything on the filesystem.
FileStore implements the Strategy::LocalCache strategy which implements an in memory cache inside of a block.
# File lib/active_support/cache/file_store.rb, line 28 28: def cleanup(options = nil) 29: options = merged_options(options) 30: each_key(options) do |key| 31: entry = read_entry(key, options) 32: delete_entry(key, options) if entry && entry.expired? 33: end 34: end
# File lib/active_support/cache/file_store.rb, line 23 23: def clear(options = nil) 24: root_dirs = Dir.entries(cache_path).reject{|f| ['.', '..'].include?(f)} 25: FileUtils.rm_r(root_dirs.collect{|f| File.join(cache_path, f)}) 26: end
# File lib/active_support/cache/file_store.rb, line 50 50: def decrement(name, amount = 1, options = nil) 51: file_name = key_file_path(namespaced_key(name, options)) 52: lock_file(file_name) do 53: options = merged_options(options) 54: if num = read(name, options) 55: num = num.to_i - amount 56: write(name, num, options) 57: num 58: else 59: nil 60: end 61: end 62: end
# File lib/active_support/cache/file_store.rb, line 64 64: def delete_matched(matcher, options = nil) 65: options = merged_options(options) 66: instrument(:delete_matched, matcher.inspect) do 67: matcher = key_matcher(matcher, options) 68: search_dir(cache_path) do |path| 69: key = file_path_key(path) 70: delete_entry(key, options) if key.match(matcher) 71: end 72: end 73: end
# File lib/active_support/cache/file_store.rb, line 36 36: def increment(name, amount = 1, options = nil) 37: file_name = key_file_path(namespaced_key(name, options)) 38: lock_file(file_name) do 39: options = merged_options(options) 40: if num = read(name, options) 41: num = num.to_i + amount 42: write(name, num, options) 43: num 44: else 45: nil 46: end 47: end 48: end
# File lib/active_support/cache/file_store.rb, line 105 105: def delete_entry(key, options) 106: file_name = key_file_path(key) 107: if File.exist?(file_name) 108: begin 109: File.delete(file_name) 110: delete_empty_directories(File.dirname(file_name)) 111: true 112: rescue => e 113: # Just in case the error was caused by another process deleting the file first. 114: raise e if File.exist?(file_name) 115: false 116: end 117: end 118: end
# File lib/active_support/cache/file_store.rb, line 77 77: def read_entry(key, options) 78: file_name = key_file_path(key) 79: if File.exist?(file_name) 80: entry = File.open(file_name) { |f| Marshal.load(f) } 81: if entry && !entry.expired? && !entry.expires_in && !self.options[:expires_in] 82: # Check for deprecated use of +:expires_in+ option from versions < 3.0 83: deprecated_expires_in = options[:expires_in] 84: if deprecated_expires_in 85: ActiveSupport::Deprecation.warn('Setting :expires_in on read has been deprecated in favor of setting it on write.', caller) 86: if entry.created_at + deprecated_expires_in.to_f <= Time.now.to_f 87: delete_entry(key, options) 88: entry = nil 89: end 90: end 91: end 92: entry 93: end 94: rescue 95: nil 96: end
# File lib/active_support/cache/file_store.rb, line 98 98: def write_entry(key, entry, options) 99: file_name = key_file_path(key) 100: ensure_cache_path(File.dirname(file_name)) 101: File.atomic_write(file_name, cache_path) {|f| Marshal.dump(entry, f)} 102: true 103: end
Delete empty directories in the cache.
# File lib/active_support/cache/file_store.rb, line 163 163: def delete_empty_directories(dir) 164: return if dir == cache_path 165: if Dir.entries(dir).reject{|f| ['.', '..'].include?(f)}.empty? 166: File.delete(dir) rescue nil 167: delete_empty_directories(File.dirname(dir)) 168: end 169: end
Make sure a file path’s directories exist.
# File lib/active_support/cache/file_store.rb, line 172 172: def ensure_cache_path(path) 173: FileUtils.makedirs(path) unless File.exist?(path) 174: end
Translate a file path into a key.
# File lib/active_support/cache/file_store.rb, line 157 157: def file_path_key(path) 158: fname = path[cache_path.size, path.size].split(File::SEPARATOR, 4).last 159: fname.gsub(UNESCAPE_FILENAME_CHARS){|match| $1.ord.to_s(16)} 160: end
Translate a key into a file path.
# File lib/active_support/cache/file_store.rb, line 138 138: def key_file_path(key) 139: fname = key.to_s.gsub(ESCAPE_FILENAME_CHARS){|match| "%#{match.ord.to_s(16).upcase}"} 140: hash = Zlib.adler32(fname) 141: hash, dir_1 = hash.divmod(0x1000) 142: dir_2 = hash.modulo(0x1000) 143: fname_paths = [] 144: # Make sure file name is < 255 characters so it doesn't exceed file system limits. 145: if fname.size <= 255 146: fname_paths << fname 147: else 148: while fname.size <= 255 149: fname_path << fname[0, 255] 150: fname = fname[255, 1] 151: end 152: end 153: File.join(cache_path, DIR_FORMATTER % dir_1, DIR_FORMATTER % dir_2, *fname_paths) 154: end
# File lib/active_support/cache/file_store.rb, line 176 176: def search_dir(dir, &callback) 177: Dir.foreach(dir) do |d| 178: next if d == "." || d == ".." 179: name = File.join(dir, d) 180: if File.directory?(name) 181: search_dir(name, &callback) 182: else 183: callback.call name 184: end 185: end 186: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.