Sha256: f0e89e15d4261a0dbf67f1567ed2cd974a30f63086081682400e24d73b4240ad

Contents?: true

Size: 1.11 KB

Versions: 1

Compression:

Stored size: 1.11 KB

Contents

require 'fileutils'
require 'tmpdir'

module Glue
 
  # TODO: safe locking of files, because Nitro can be multiprocess
  
  class FileCache

    setting :basedir, :default => "#{Dir.tmpdir}/nitro_file_cache", :doc => 'The directory to store files'

    def initialize(name, keepalive = nil)
      @path = File.join(FileCache.basedir, name)
      @keepalive = keepalive

      FileUtils.mkdir_p(@path, :mode => 0700)
    end

    def []=(k,v)
      fn = File.join(@path, k.to_s)
      encode_file(fn, v)
    end

    def [](k)
      fn = File.join(@path, k.to_s)
      return nil unless File.exists?(fn)
      decode_file(fn)
    end

    def gc!
      return unless @keepalive

      now = Time.now
      all.each do |fn|
        expire_time = File.stat(fn).atime + @keepalive 
        File.delete(fn) if now > expire_time
      end
    end

    def all
      Dir.glob( File.join(@path, '*' ) )
    end

    private

    def decode_file(fn)
      Marshal.load( File.read(fn) )
    end

    def encode_file(fn, value)
      File.open(fn, "w") do |f| 
        f.chmod(0600)
        f.write(Marshal.dump(value))
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
glue-0.28.0 lib/glue/cache/file.rb