Class: Slimer::Database Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/slimer/database.rb

Overview

This class is abstract.

Wraps Sequel.connect to easily interface with the Slimer database

Constant Summary collapse

MAX_CONNECTION_RETRIES =
10
REQUIRED_TABLES =
%i[api_keys substances].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url) ⇒ Database

Returns a new instance of Database.



16
17
18
19
20
21
# File 'lib/slimer/database.rb', line 16

def initialize(url)
  @url = url
  add_supported_extensions
  resolve_missing_tables!
  connection.loggers << Slimer.logger if connection.loggers.empty?
end

Instance Attribute Details

#urlObject (readonly)

Returns the value of attribute url.



11
12
13
# File 'lib/slimer/database.rb', line 11

def url
  @url
end

Class Method Details

.connection(url) ⇒ Object



23
24
25
26
27
28
29
30
# File 'lib/slimer/database.rb', line 23

def self.connection(url)
  db = new(url)
  # Sequel::Model requires a connection before you can subclass.  Now that
  # we have a connection, require the models.
  connection = db.connection
  db.load_models
  connection
end

Instance Method Details

#connectionObject Also known as: connect



32
33
34
35
36
37
38
# File 'lib/slimer/database.rb', line 32

def connection
  retry_count = 1
  @connection ||= Sequel.connect(url)
rescue Sequel::DatabaseConnectionError
  Slimer.logger.warn "Waiting for database to become available... #{retry_count}"
  sleep 1 and retry if retry_count >= MAX_CONNECTION_RETRIES
end

#create!Object



47
48
49
50
# File 'lib/slimer/database.rb', line 47

def create!
  create_substances unless connection.table_exists?(:substances)
  create_api_keys unless connection.table_exists?(:api_keys)
end

#load_modelsObject



56
57
58
59
# File 'lib/slimer/database.rb', line 56

def load_models
  require_relative "api_key" unless defined?(Slimer::ApiKey)
  require_relative "substance" unless defined?(Slimer::Substance)
end

#migrated?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/slimer/database.rb', line 52

def migrated?
  REQUIRED_TABLES.all? { |t| connection.table_exists?(t) }
end

#resolve_missing_tables!Object



41
42
43
44
45
# File 'lib/slimer/database.rb', line 41

def resolve_missing_tables!
  return if migrated?

  create!
end