Class: Moneta::Adapters::File
- Inherits:
-
Object
- Object
- Moneta::Adapters::File
- 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.
-
#each_key(&block) ⇒ Object
Calls block once for each key in store, passing the key as a parameter.
-
#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 Config
Methods included from Defaults
#[], #[]=, #close, #decrement, #features, #fetch, #fetch_values, included, #merge!, #slice, #supports?, #update, #values_at
Methods included from OptionSupport
#expires, #prefix, #raw, #with
Constructor Details
#initialize(options = {}) ⇒ File
Returns a new instance of File.
18 19 20 21 22 |
# File 'lib/moneta/adapters/file.rb', line 18 def initialize( = {}) configure(**) FileUtils.mkpath(config.dir) raise "#{config.dir} is not a directory" unless ::File.directory?(config.dir) end |
Instance Method Details
#clear(options = {}) ⇒ void
This method returns an undefined value.
Clear all keys in this store
73 74 75 76 77 78 79 80 81 82 |
# File 'lib/moneta/adapters/file.rb', line 73 def clear( = {}) temp_dir = "#{config.dir}-#{$PROCESS_ID}-#{Thread.current.object_id}" ::File.rename(config.dir, temp_dir) FileUtils.mkpath(config.dir) self rescue Errno::ENOENT self ensure FileUtils.rm_rf(temp_dir) 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.
105 106 107 108 109 110 111 112 |
# File 'lib/moneta/adapters/file.rb', line 105 def create(key, value, = {}) 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 |
#delete(key, options = {}) ⇒ Object
Delete the key from the store and return the current value
64 65 66 67 68 69 70 |
# File 'lib/moneta/adapters/file.rb', line 64 def delete(key, = {}) value = load(key, ) ::File.unlink(store_path(key)) value rescue Errno::ENOENT nil end |
#each_key ⇒ Enumerator #each_key {|key| ... } ⇒ self
Not every Moneta store implements this method, a NotImplementedError is raised if it is not supported.
Calls block once for each key in store, passing the key as a parameter. If no block is given, an enumerator is returned instead.
30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/moneta/adapters/file.rb', line 30 def each_key(&block) entries = ::Dir.entries(config.dir).reject do |k| ::File.directory?(::File.join(config.dir, k)) end if block_given? entries.each { |k| yield(k) } self else enum_for(:each_key) { ::Dir.entries(config.dir).length - 2 } end 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.
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/moneta/adapters/file.rb', line 85 def increment(key, amount = 1, = {}) 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 += Integer(content) unless content.empty? content = amount.to_s f.binmode f.pos = 0 f.write(content) f.truncate(content.bytesize) amount end end |
#key?(key, options = {}) ⇒ Boolean
Exists the value with key
25 26 27 |
# File 'lib/moneta/adapters/file.rb', line 25 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
44 45 46 47 48 |
# File 'lib/moneta/adapters/file.rb', line 44 def load(key, = {}) ::File.read(store_path(key), mode: 'rb') rescue Errno::ENOENT nil end |
#store(key, value, options = {}) ⇒ Object
Store value with key
51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/moneta/adapters/file.rb', line 51 def store(key, value, = {}) temp_file = ::File.join(config.dir, "value-#{$PROCESS_ID}-#{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 File.unlink(temp_file) rescue nil raise end |