Class: Moneta::Adapters::File
- Inherits:
-
Object
- Object
- Moneta::Adapters::File
- Includes:
- Defaults
- Defined in:
- lib/moneta/adapters/file.rb
Overview
Filesystem backend
Instance Method Summary collapse
-
#clear(options = {}) ⇒ void
Clear all keys in this store.
-
#create(key, value, options = {}) ⇒ Boolean
Atomically sets a key to value if it’s not set.
-
#delete(key, options = {}) ⇒ Object
Delete the key from the store and return the current value.
-
#increment(key, amount = 1, options = {}) ⇒ Object
Atomically increment integer value with key.
-
#initialize(options = {}) ⇒ File
constructor
A new instance of File.
-
#key?(key, options = {}) ⇒ Boolean
Exists the value with key.
-
#load(key, options = {}) ⇒ Object
Fetch value with key.
-
#store(key, value, options = {}) ⇒ Object
Store value with key.
Methods included from Defaults
#[], #[]=, #close, #decrement, #features, #fetch, included, #supports?
Methods included from OptionSupport
#expires, #prefix, #raw, #with
Constructor Details
#initialize(options = {}) ⇒ File
Returns a new instance of File.
13 14 15 16 17 |
# File 'lib/moneta/adapters/file.rb', line 13 def initialize( = {}) raise ArgumentError, 'Option :dir is required' unless @dir = [:dir] FileUtils.mkpath(@dir) raise "#{@dir} is not a directory" unless ::File.directory?(@dir) end |
Instance Method Details
#clear(options = {}) ⇒ void
This method returns an undefined value.
Clear all keys in this store
53 54 55 56 57 58 59 60 61 |
# File 'lib/moneta/adapters/file.rb', line 53 def clear( = {}) temp_dir = "#{@dir}-#{$$}-#{Thread.current.object_id}" ::File.rename(@dir, temp_dir) FileUtils.mkpath(@dir) FileUtils.rm_rf(temp_dir) self rescue Errno::ENOENT self end |
#create(key, value, options = {}) ⇒ Boolean
Not every Moneta store implements this method, a NotImplementedError is raised if it is not supported.
Atomically sets a key to value if it’s not set.
84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/moneta/adapters/file.rb', line 84 def create(key, value, = {}) path = store_path(key) FileUtils.mkpath(::File.dirname(path)) ::File.open(path, ::File::WRONLY | ::File::CREAT | ::File::EXCL) do |file| file.binmode file.write(value) end true rescue Errno::EEXIST false end |
#delete(key, options = {}) ⇒ Object
Delete the key from the store and return the current value
45 46 47 48 49 50 |
# File 'lib/moneta/adapters/file.rb', line 45 def delete(key, = {}) value = load(key, ) ::File.unlink(store_path(key)) value rescue Errno::ENOENT end |
#increment(key, amount = 1, options = {}) ⇒ Object
Not every Moneta store implements this method, a NotImplementedError is raised if it is not supported.
Atomically increment integer value with key
This method also accepts negative amounts.
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/moneta/adapters/file.rb', line 64 def increment(key, amount = 1, = {}) path = store_path(key) ::File.open(path, 'rb+') do |f| Thread.pass until f.flock(::File::LOCK_EX) value = Utils.to_int(f.read) + amount f.truncate(0) f.pos = 0 f.write(value.to_s) value end rescue Errno::ENOENT if create(key, amount.to_s, ) amount else # Concurrent modification retry end end |
#key?(key, options = {}) ⇒ Boolean
Exists the value with key
20 21 22 |
# File 'lib/moneta/adapters/file.rb', line 20 def key?(key, = {}) ::File.exist?(store_path(key)) end |
#load(key, options = {}) ⇒ Object
Fetch value with key. Return nil if the key doesn’t exist
25 26 27 28 |
# File 'lib/moneta/adapters/file.rb', line 25 def load(key, = {}) ::File.read(store_path(key)) rescue Errno::ENOENT end |
#store(key, value, options = {}) ⇒ Object
Store value with key
31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/moneta/adapters/file.rb', line 31 def store(key, value, = {}) path = store_path(key) temp_file = ::File.join(@dir, "value-#{$$}-#{Thread.current.object_id}") FileUtils.mkpath(::File.dirname(path)) ::File.open(temp_file, 'wb') {|file| file.write(value) } ::File.unlink(path) if ::File.exist?(path) ::File.rename(temp_file, path) value rescue Errno::ENOENT ::File.unlink(temp_file) rescue nil value end |