Module: Databases::Utilities

Included in:
Sequel::Postgres::Bootstrap
Defined in:
lib/story_teller/database.rb

Overview

The Utilities module

Defined Under Namespace

Classes: DatabaseConfig

Constant Summary collapse

DefaultSchema =
if JavaPattern.match?(RUBY_PLATFORM)
  'jdbc:postgresql'
else
  'postgresql'
end.freeze
DatabaseURITemplate =
'%<schema>s://%<host>s%<port>s/%<database_name>s'.freeze
PortTemplate =
':%<port>s'.freeze
URITemplate =
'%<uri>s?%<query_string>s'.freeze
EmptyString =
''.freeze

Instance Method Summary collapse

Instance Method Details

#connection_configObject

rubocop: disable Metrics/AbcSize rubocop: disable Metrics/CyclomaticComplexity



371
372
373
374
375
376
377
378
379
380
381
382
383
# File 'lib/story_teller/database.rb', line 371

def connection_config
  opts = Sequel::Model.db.opts

  DatabaseConfig.new(
    schema: opts[:adapter] && opts[:adapter].to_s || DEFAULT_SCHEMA,
    host: opts[:host] || "localhost",
    port: opts[:port],
    database: opts[:database] || database,
    user: opts[:user] || database,
    password: opts[:password] || opts[:user] || database,
    logger_level: "OFF"
  ).to_h
end

#create_user(username = database) ⇒ Object

rubocop: disable Metrics/MethodLength



388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
# File 'lib/story_teller/database.rb', line 388

def create_user(username = database)
  return false if user_exist?(username)
  begin
    log.debug "Creating user: #{username}"
    run "create user #{username}"
    run "alter role #{username} with password '#{username}'"
    return true
  rescue Sequel::DatabaseError => e
    log.error e.inspect
    return false
  rescue StandardError => e
    log.error e.inspect
    return false
  end
end

#database_url(overrides = {}, exclude: []) ⇒ Object

Build a JDBC URL string from config + overrides.

overrides: hash of config keys (schema, host, port, database, user, password, logger_level) exclude: array of query param keys as external names, e.g. [:loggerLevel] rubocop: disable Metrics/AbcSize rubocop: disable Metrics/MethodLength



346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
# File 'lib/story_teller/database.rb', line 346

def database_url(overrides = {}, exclude: [])
  config = connection_config.merge(overrides)
  base_url = format(
    DatabaseURITemplate,
    schema: config[:schema] || DefaultSchema,
    host: config[:host],
    port: config[:port] ? format(PortTemplate, port: config[:port]) : EmptyString,
    database_name: config[:database]
  )

  query = {}
  query[:user] = config[:user]
  query[:password] = config[:password]
  query[:loggerLevel] = config[:loggerLevel]
  query.reject! { |k, v| v.nil? || exclude.include?(k) }

  return base_url if query.empty?
  query_string = URI.encode_www_form(query.transform_keys(&:to_s))
  format(URITemplate, uri: base_url, query_string: query_string)
end

#delete_user(username = database) ⇒ Object

rubocop: disable Metrics/MethodLength



406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'lib/story_teller/database.rb', line 406

def delete_user(username = database)
  return false unless user_exist?(username)
  begin
    log.debug "Dropping user: #{username}"
    run "reassign owned by #{username} to postgres"
    run "drop user #{username}"
  rescue Sequel::DatabaseError => e
    log.error e.inspect
    return false
  rescue StandardError => e
    log.error e.inspect
    return false
  end
end

#switch_database(database_name = database) ⇒ Object



329
330
331
332
# File 'lib/story_teller/database.rb', line 329

def switch_database(database_name = database)
  reconnect_database(database_url({database_name: database_name}))
  true
end

#switch_user(username = database, database_name = nil) ⇒ Object



334
335
336
337
338
# File 'lib/story_teller/database.rb', line 334

def switch_user(username = database, database_name = nil)
  url = database_url({username: username, database_name: database_name})
  reconnect_database(url)
  true
end