module Moneta::Adapters::Sequel::SQLite

@api private

Public Class Methods

extended(mod) click to toggle source
# File lib/moneta/adapters/sequel/sqlite.rb, line 6
def self.extended(mod)
  version = mod.backend.get(::Sequel[:sqlite_version].function)
  # See https://sqlite.org/lang_UPSERT.html
  mod.instance_variable_set(:@can_upsert, ::Gem::Version.new(version) >= ::Gem::Version.new('3.24.0'))
end

Public Instance Methods

increment(key, amount = 1, options = {}) click to toggle source
Calls superclass method
# File lib/moneta/adapters/sequel/sqlite.rb, line 17
def increment(key, amount = 1, options = {})
  return super unless @can_upsert
  @backend.transaction do
    @increment.call(key: key, value: blob(amount.to_s), amount: amount)
    Integer(load(key))
  end
end
merge!(pairs, options = {}, &block) click to toggle source
# File lib/moneta/adapters/sequel/sqlite.rb, line 25
def merge!(pairs, options = {}, &block)
  @backend.transaction do
    pairs = yield_merge_pairs(pairs, &block) if block_given?
    @table.insert_conflict(:replace).import([config.key_column, config.value_column], blob_pairs(pairs).to_a)
  end

  self
end
store(key, value, options = {}) click to toggle source
# File lib/moneta/adapters/sequel/sqlite.rb, line 12
def store(key, value, options = {})
  @table.insert_conflict(:replace).insert(config.key_column => key, config.value_column => blob(value))
  value
end

Protected Instance Methods

prepare_increment() click to toggle source
Calls superclass method
# File lib/moneta/adapters/sequel/sqlite.rb, line 42
def prepare_increment
  return super unless @can_upsert
  update_expr = (::Sequel[config.value_column].cast(Integer) + :$amount).cast(:blob)
  @increment = @table
    .insert_conflict(
      target: config.key_column,
      update: { config.value_column => update_expr },
      update_where: ::Sequel.|({ config.value_column => blob("0") },
                               { ::Sequel.~(::Sequel[config.value_column].cast(Integer)) => 0 })
    )
    .prepare(:insert, statement_id(:increment), config.key_column => :$key, config.value_column => :$value)
end
prepare_store() click to toggle source
# File lib/moneta/adapters/sequel/sqlite.rb, line 36
def prepare_store
  @store = @table
    .insert_conflict(:replace)
    .prepare(:insert, statement_id(:store), config.key_column => :$key, config.value_column => :$value)
end