Class: Kaal::Internal::Sequel::DatabaseBackend

Inherits:
Backend::Adapter show all
Includes:
Backend::DispatchLogging
Defined in:
lib/kaal/internal/sequel/database_backend.rb,
sig/kaal/internal/sequel/database_backend.rbs

Overview

Shared table-backed Sequel SQL engine used by the public SQLite backend.

Instance Method Summary collapse

Methods included from Backend::DispatchLogging

#dispatch_attempt_logger, #log_dispatch_attempt, #parse_lock_key, parse_lock_key

Methods inherited from Backend::Adapter

#disconnect_for_fork, #with_lock

Constructor Details

#initialize(database, namespace: nil) ⇒ DatabaseBackend

Returns a new instance of DatabaseBackend.

Parameters:

  • database (Kaal::rbs_any)
  • namespace: (Kaal::rbs_any, nil) (defaults to: nil)


18
19
20
21
22
# File 'lib/kaal/internal/sequel/database_backend.rb', line 18

def initialize(database, namespace: nil)
  super()
  @database = Kaal::Persistence::Database.new(database)
  @namespace = namespace
end

Instance Method Details

#acquire(key, ttl) ⇒ Kaal::rbs_any

Parameters:

  • key (Kaal::rbs_any)
  • ttl (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/kaal/internal/sequel/database_backend.rb', line 36

def acquire(key, ttl)
  now = Time.now.utc
  expires_at = now + ttl

  2.times do |attempt|
    cleanup_expired_locks if attempt.positive?

    begin
      dataset.insert(key: key, acquired_at: now, expires_at: expires_at)
      log_dispatch_attempt(key)
      return true
    rescue ::Sequel::UniqueConstraintViolation
      next
    end
  end

  false
rescue StandardError => e
  raise Kaal::Backend::LockAdapterError, "Database acquire failed for #{key}: #{e.message}"
end

#cleanup_expired_locks ⇒ Kaal::rbs_any

Returns:

  • (Kaal::rbs_any)


63
64
65
# File 'lib/kaal/internal/sequel/database_backend.rb', line 63

def cleanup_expired_locks
  dataset.where { expires_at < Time.now.utc }.delete
end

#dataset ⇒ Kaal::rbs_any

Returns:

  • (Kaal::rbs_any)


69
70
71
# File 'lib/kaal/internal/sequel/database_backend.rb', line 69

def dataset
  @database.locks_dataset
end

#definition_registry ⇒ Kaal::rbs_any

Returns:

  • (Kaal::rbs_any)


28
29
30
# File 'lib/kaal/internal/sequel/database_backend.rb', line 28

def definition_registry
  @definition_registry ||= Kaal::Definition::DatabaseEngine.new(database: @database.connection)
end

#delayed_store ⇒ Kaal::rbs_any

Returns:

  • (Kaal::rbs_any)


32
33
34
# File 'lib/kaal/internal/sequel/database_backend.rb', line 32

def delayed_store
  @delayed_store ||= Kaal::DelayedJob::DatabaseEngine.new(database: @database.connection)
end

#dispatch_registry ⇒ Kaal::rbs_any

Returns:

  • (Kaal::rbs_any)


24
25
26
# File 'lib/kaal/internal/sequel/database_backend.rb', line 24

def dispatch_registry
  @dispatch_registry ||= Kaal::Dispatch::DatabaseEngine.new(database: @database.connection, namespace: resolved_namespace)
end

#release(key) ⇒ Kaal::rbs_any

Parameters:

  • key (Kaal::rbs_any)

Returns:

  • (Kaal::rbs_any)


57
58
59
60
61
# File 'lib/kaal/internal/sequel/database_backend.rb', line 57

def release(key)
  dataset.where(key: key).delete.positive?
rescue StandardError => e
  raise Kaal::Backend::LockAdapterError, "Database release failed for #{key}: #{e.message}"
end

#resolved_namespace ⇒ Kaal::rbs_any

Returns:

  • (Kaal::rbs_any)


73
74
75
# File 'lib/kaal/internal/sequel/database_backend.rb', line 73

def resolved_namespace
  @namespace || Kaal.configuration.namespace
end