class Slimer::Database

@abstract Wraps Sequel.connect to easily interface with the Slimer database

Constants

MAX_CONNECTION_RETRIES
REQUIRED_TABLES

Attributes

url[R]

Public Class Methods

connection(url) click to toggle source
# 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
new(url) click to toggle source
# 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

Public Instance Methods

connect()
Alias for: connection
connection() click to toggle source
# 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
Also aliased as: connect
create!() click to toggle source
# 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_models() click to toggle source
# 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?() click to toggle source
# File lib/slimer/database.rb, line 52
def migrated?
  REQUIRED_TABLES.all? { |t| connection.table_exists?(t) }
end
resolve_missing_tables!() click to toggle source
# File lib/slimer/database.rb, line 41
def resolve_missing_tables!
  return if migrated?

  create!
end

Private Instance Methods

add_supported_extensions() click to toggle source
# File lib/slimer/database.rb, line 63
def add_supported_extensions
  return if connection.database_type != :postgres

  connection.extension :pg_json
  Sequel.extension :pg_json_ops
end
create_api_keys() click to toggle source
# File lib/slimer/database.rb, line 95
def create_api_keys
  connection.create_table(:api_keys, ignore_index_errors: true) do
    primary_key :id
    String :name
    String :token
  end
end
create_substances() click to toggle source
# File lib/slimer/database.rb, line 70
def create_substances
  return create_substances_for_postgres if connection.database_type == :postgres

  connection.create_table(:substances, ignore_index_errors: true) do
    primary_key :id
    String :uid
    String :group, default: Slimer::DEFAULT_GROUP
    String :payload, text: true
    String :metadata, text: true
    full_text_index :payload
    full_text_index :metadata
  end
end
create_substances_for_postgres() click to toggle source
# File lib/slimer/database.rb, line 84
def create_substances_for_postgres
  connection.create_table(:substances, ignore_index_errors: true) do
    String :uid
    String :group, default: Slimer::DEFAULT_GROUP
    JSONB :payload
    JSONB :metadata
    index :payload, type: :gin
    index :metadata, type: :gin
  end
end