Sequel backend @api public
Sequel::UniqueConstraintViolation is defined since sequel 3.44.0 older versions raise a Sequel::DatabaseError.
@param [Hash] options @option options [String] :db Sequel database @option options [String/Symbol] :table (:moneta) Table name @option options All other options passed to `Sequel#connect` @option options [Sequel connection] :backend Use existing backend instance
# File lib/moneta/adapters/sequel.rb, line 22 def initialize(options = {}) table = (options.delete(:table) || :moneta).to_sym @backend = options[:backend] || begin raise ArgumentError, 'Option :db is required' unless db = options.delete(:db) ::Sequel.connect(db, options) end @backend.create_table?(table) do String :k, null: false, primary_key: true Blob :v end @table = @backend[table] end
(see Moneta::Proxy#clear)
# File lib/moneta/adapters/sequel.rb, line 96 def clear(options = {}) @table.delete self end
(see Moneta::Proxy#close)
# File lib/moneta/adapters/sequel.rb, line 102 def close @backend.disconnect nil end
(see Moneta::Proxy#store)
# File lib/moneta/adapters/sequel.rb, line 61 def create(key, value, options = {}) @table.insert(k: key, v: blob(value)) true rescue UniqueConstraintViolation false end
(see Moneta::Proxy#delete)
# File lib/moneta/adapters/sequel.rb, line 88 def delete(key, options = {}) if value = load(key, options) @table.filter(k: key).delete value end end
(see Moneta::Proxy#increment)
# File lib/moneta/adapters/sequel.rb, line 69 def increment(key, amount = 1, options = {}) @backend.transaction do locked_table = @table.for_update if record = locked_table[k: key] value = Utils.to_int(record[:v]) + amount locked_table.where(k: key).update(v: blob(value.to_s)) value else locked_table.insert(k: key, v: blob(amount.to_s)) amount end end rescue ::Sequel::DatabaseError # Concurrent modification might throw a bunch of different errors tries ||= 0 (tries += 1) < 10 ? retry : raise end
(see Moneta::Proxy#key?)
# File lib/moneta/adapters/sequel.rb, line 37 def key?(key, options = {}) @table[k: key] != nil end
(see Moneta::Proxy#load)
# File lib/moneta/adapters/sequel.rb, line 42 def load(key, options = {}) record = @table[k: key] record && record[:v] end
(see Moneta::Proxy#store)
# File lib/moneta/adapters/sequel.rb, line 48 def store(key, value, options = {}) begin @table.insert(k: key, v: blob(value)) rescue UniqueConstraintViolation @table.where(k: key).update(v: blob(value)) end value rescue ::Sequel::DatabaseError tries ||= 0 (tries += 1) < 10 ? retry : raise end
See github.com/jeremyevans/sequel/issues/715
# File lib/moneta/adapters/sequel.rb, line 110 def blob(s) s.empty? ? '' : ::Sequel.blob(s) end