/usr/lib/ruby/vendor_ruby/moneta/adapters/file.rb is in ruby-moneta 0.7.20-2.2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | require 'fileutils'
module Moneta
module Adapters
# Filesystem backend
# @api public
class File
include Defaults
supports :create, :increment
# @param [Hash] options
# @option options [String] :dir Directory where files will be stored
def initialize(options = {})
raise ArgumentError, 'Option :dir is required' unless @dir = options[:dir]
FileUtils.mkpath(@dir)
raise "#{@dir} is not a directory" unless ::File.directory?(@dir)
end
# (see Proxy#key?)
def key?(key, options = {})
::File.exist?(store_path(key))
end
# (see Proxy#load)
def load(key, options = {})
::File.read(store_path(key))
rescue Errno::ENOENT
end
# (see Proxy#store)
def store(key, value, options = {})
temp_file = ::File.join(@dir, "value-#{$$}-#{Thread.current.object_id}")
path = store_path(key)
FileUtils.mkpath(::File.dirname(path))
::File.open(temp_file, 'wb') {|f| f.write(value) }
::File.rename(temp_file, path)
value
rescue Exception
File.unlink(temp_file) rescue nil
raise
end
# (see Proxy#delete)
def delete(key, options = {})
value = load(key, options)
::File.unlink(store_path(key))
value
rescue Errno::ENOENT
end
# (see Proxy#clear)
def clear(options = {})
temp_dir = "#{@dir}-#{$$}-#{Thread.current.object_id}"
::File.rename(@dir, temp_dir)
FileUtils.mkpath(@dir)
self
rescue Errno::ENOENT
self
ensure
FileUtils.rm_rf(temp_dir)
end
# (see Proxy#increment)
def increment(key, amount = 1, options = {})
path = store_path(key)
FileUtils.mkpath(::File.dirname(path))
::File.open(path, ::File::RDWR | ::File::CREAT) do |f|
Thread.pass until f.flock(::File::LOCK_EX)
content = f.read
amount += Utils.to_int(content) unless content.empty?
content = amount.to_s
f.pos = 0
f.write(content)
f.truncate(content.bytesize)
amount
end
end
# HACK: The implementation using File::EXCL is not atomic under JRuby 1.7.4
# See https://github.com/jruby/jruby/issues/827
if defined?(JRUBY_VERSION)
# (see Proxy#create)
def create(key, value, options = {})
path = store_path(key)
FileUtils.mkpath(::File.dirname(path))
# Call native java.io.File#createNewFile
return false unless ::Java::JavaIo::File.new(path).createNewFile
::File.open(path, 'wb+') {|f| f.write(value) }
true
end
else
# (see Proxy#create)
def create(key, value, options = {})
path = store_path(key)
FileUtils.mkpath(::File.dirname(path))
::File.open(path, ::File::WRONLY | ::File::CREAT | ::File::EXCL) do |f|
f.binmode
f.write(value)
end
true
rescue Errno::EEXIST
false
end
end
protected
def store_path(key)
::File.join(@dir, key)
end
end
end
end
|