module Checkpoint::DB

Module for everything related to the Checkpoint database.

Constants

ALREADY_CONNECTED
CONNECTION_ERROR
LOAD_ERROR
MISSING_CONFIG
SCHEMA_HEADER

Public Class Methods

[](*args) click to toggle source

Forward the Sequel::Database []-syntax down to db for convenience. Everything else must be called on db directly, but this is nice sugar.

# File lib/checkpoint/db.rb, line 163
def [](*args)
  db[*args]
end
config() click to toggle source
# File lib/checkpoint/db.rb, line 144
def config
  @config ||= OpenStruct.new(
    url: ENV['CHECKPOINT_DATABASE_URL'] || ENV['DATABASE_URL']
  )
end
conn_opts() click to toggle source
# File lib/checkpoint/db.rb, line 131
def conn_opts
  log = { logger: Logger.new('db/checkpoint.log') }
  url = config.url
  opts = config.opts
  if url
    [url, log]
  elsif opts
    [log.merge(opts)]
  else
    []
  end
end
connect!(config = {}) click to toggle source

Connect to the Checkpoint database.

The default is to use the settings under {.config}, but can be supplied here (and they will be merged into config as a side effect). The keys that will be used from either source are documented here as the options.

Only one “mode” will be used; the first of these supplied will take precedence:

  1. An already-connected {Sequel::Database} object

  2. A connection string

  3. A connection options hash

While Checkpoint serves as a singleton, this will raise a DatabaseError if already connected. Check `connected?` if you are unsure.

@see {Sequel.connect} @param [Hash] config Optional connection config @option config [String] :url A Sequel database URL @option config [Hash] :opts A set of connection options @option config [Sequel::Database] :db An already-connected database; @return [Sequel::Database] The initialized database connection

# File lib/checkpoint/db.rb, line 79
def connect!(config = {})
  raise DatabaseError, ALREADY_CONNECTED if connected?
  merge_config!(config)
  raise DatabaseError, MISSING_CONFIG if self.config.db.nil? && conn_opts.empty?

  # We splat here because we might give one or two arguments depending
  # on whether we have a string or not; to add our logger regardless.
  @db = self.config.db || Sequel.connect(*conn_opts)
end
connected?() click to toggle source
# File lib/checkpoint/db.rb, line 150
def connected?
  !@db.nil?
end
db() click to toggle source

The Checkpoint database @return [Sequel::Database] The connected database; be sure to call initialize! first.

# File lib/checkpoint/db.rb, line 156
def db
  raise DatabaseError, CONNECTION_ERROR unless connected?
  @db
end
dump_schema!() click to toggle source
# File lib/checkpoint/db.rb, line 105
def dump_schema!
  connect! unless connected?
  version = db[schema_table].first.to_yaml
  File.write(schema_file, SCHEMA_HEADER + version)
end
initialize!() click to toggle source

Initialize Checkpoint

This connects to the database if it has not already happened and requires all of the Checkpoint model classes. It is required to do the connection setup first because of the design decision in Sequel that the schema is examined at the time of extending Sequel::Model.

# File lib/checkpoint/db.rb, line 44
def initialize!
  connect! unless connected?
  begin
    model_files.each do |file|
      require_relative file
    end
  rescue Sequel::DatabaseError, NoMethodError => e
    raise DatabaseError, LOAD_ERROR + "\n" + e.message
  end
  db
end
load_schema!() click to toggle source
# File lib/checkpoint/db.rb, line 111
def load_schema!
  connect! unless connected?
  version = YAML.load_file(schema_file)[:version]
  db[schema_table].delete
  db[schema_table].insert(version: version)
end
merge_config!(config = {}) click to toggle source

Merge url, opts, or db settings from a hash into our config

# File lib/checkpoint/db.rb, line 125
def merge_config!(config = {})
  self.config.url  = config[:url]  if config.key?(:url)
  self.config.opts = config[:opts] if config.key?(:opts)
  self.config.db   = config[:db]   if config.key?(:db)
end
migrate!() click to toggle source

Run any pending migrations. This will connect with the current config if not already connected.

# File lib/checkpoint/db.rb, line 91
def migrate!
  connect! unless connected?
  Sequel.extension :migration
  Sequel::Migrator.run(db, File.join(__dir__, '../../db/migrations'), table: schema_table)
end
model_files() click to toggle source
# File lib/checkpoint/db.rb, line 118
def model_files
  [
    'db/grant'
  ]
end
schema_file() click to toggle source
# File lib/checkpoint/db.rb, line 101
def schema_file
  'db/checkpoint.yml'
end
schema_table() click to toggle source
# File lib/checkpoint/db.rb, line 97
def schema_table
  :checkpoint_schema
end