Parent

Included Modules

Files

Class/Module Index [+]

Quicksearch

Moneta::Adapters::Sequel

Sequel backend @api public

Constants

UniqueConstraintViolation

Sequel::UniqueConstraintViolation is defined since sequel 3.44.0 older versions raise a Sequel::DatabaseError.

Attributes

backend[R]

Public Class Methods

new(options = {}) click to toggle source

@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

Public Instance Methods

clear(options = {}) click to toggle source

(see Proxy#clear)

# File lib/moneta/adapters/sequel.rb, line 96
def clear(options = {})
  @table.delete
  self
end
close() click to toggle source

(see Proxy#close)

# File lib/moneta/adapters/sequel.rb, line 102
def close
  @backend.disconnect
  nil
end
create(key, value, options = {}) click to toggle source

(see Proxy#store)

# File lib/moneta/adapters/sequel.rb, line 61
def create(key, value, options = {})
  @table.insert(:k => key, :v => value)
  true
rescue UniqueConstraintViolation
  false
end
delete(key, options = {}) click to toggle source

(see 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
increment(key, amount = 1, options = {}) click to toggle source

(see 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 => value.to_s)
      value
    else
      locked_table.insert(:k => key, :v => 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
key?(key, options = {}) click to toggle source

(see Proxy#key?)

# File lib/moneta/adapters/sequel.rb, line 37
def key?(key, options = {})
  @table[:k => key] != nil
end
load(key, options = {}) click to toggle source

(see Proxy#load)

# File lib/moneta/adapters/sequel.rb, line 42
def load(key, options = {})
  record = @table[:k => key]
  record && record[:v]
end
store(key, value, options = {}) click to toggle source

(see Proxy#store)

# File lib/moneta/adapters/sequel.rb, line 48
def store(key, value, options = {})
  begin
    @table.insert(:k => key, :v => value)
  rescue UniqueConstraintViolation
    @table.where(:k => key).update(:v => value)
  end
  value
rescue ::Sequel::DatabaseError
  tries ||= 0
  (tries += 1) < 10 ? retry : raise
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.