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
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
# File lib/checkpoint/db.rb, line 144 def config @config ||= OpenStruct.new( url: ENV['CHECKPOINT_DATABASE_URL'] || ENV['DATABASE_URL'] ) end
# 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 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:
-
An already-connected {Sequel::Database} object
-
A connection string
-
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
# File lib/checkpoint/db.rb, line 150 def connected? !@db.nil? end
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
# 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 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
# 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 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
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
# File lib/checkpoint/db.rb, line 118 def model_files [ 'db/grant' ] end
# File lib/checkpoint/db.rb, line 101 def schema_file 'db/checkpoint.yml' end
# File lib/checkpoint/db.rb, line 97 def schema_table :checkpoint_schema end