Module: Databases::Management

Includes:
DatabaseConnectionHelpers
Included in:
Sequel::Postgres::Bootstrap
Defined in:
lib/runtime/database.rb

Overview

The Databases::Management module

Constant Summary collapse

CannotDropOpenDatabaseErrorPattern =

rubocop: enable Metrics/AbcSize rubocop: enable Metrics/MethodLength

/ERROR: cannot drop the currently open database/.freeze

Constants included from DatabaseConnectionHelpers

DatabaseConnectionHelpers::AmpersandString, DatabaseConnectionHelpers::ColonString, DatabaseConnectionHelpers::ConnectionAttempts, DatabaseConnectionHelpers::DatabaseOrRoleDoesNotExistPattern, DatabaseConnectionHelpers::DefaultConnectionOptions, DatabaseConnectionHelpers::DefaultConnectionPoolSize, DatabaseConnectionHelpers::DefaultConnectionValidationTimeoutSeconds, DatabaseConnectionHelpers::EmptyString, DatabaseConnectionHelpers::ForwardSlashString, DatabaseConnectionHelpers::JavaPattern, DatabaseConnectionHelpers::KeyValueTemplate, DatabaseConnectionHelpers::QuestionMarkString, DatabaseConnectionHelpers::URLTemplate

Instance Method Summary collapse

Methods included from DatabaseConnectionHelpers

#assemble_url, #connect, #sanitize_url

Instance Method Details

#create_database(database_name = database, username = database) ⇒ Object

rubocop: disable Metrics/AbcSize rubocop: disable Metrics/MethodLength



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/runtime/database.rb', line 243

def create_database(database_name = database, username = database)
  return false if database_exist?(database_name)
  begin
    log.info "Creating database: #{database_name}"
    create_user username unless user_exist?(username)
    run "create database #{database_name} owner #{username}"
  rescue StandardError => e
    database_already_exists_error_pattern = /ERROR: database "#{database_name}" already exists/
    if database_already_exists_error_pattern.match?(e.to_s)
      unless defined? tried_once_already
        drop_database database_name
        tried_once_already = true # rubocop: disable Lint/UselessAssignment
        retry
      end
    end
    log.error "Unexpected error creating database: #{e.inspect}"
    e.backtrace.each { |t| log.error t }
    return false
  end
end

#drop_database(database_name = database) ⇒ Object

rubocop: disable Metrics/AbcSize rubocop: disable Metrics/MethodLength



270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# File 'lib/runtime/database.rb', line 270

def drop_database(database_name = database)
  return false unless database_exist?(database_name)
  begin
    log.info "Dropping database: #{database_name}"
    run "drop database #{database_name}"
  rescue Sequel::DatabaseError => e
    log.error "Unexpected error creating database: #{e.inspect}"
    e.backtrace.each { |t| log.error t }
    return false
  rescue StandardError => e
    if CannotDropOpenDatabaseErrorPattern.match?(e.to_s)
      results = execute "select procpid from pg_stat_activity where datname = '#{database_name}'"
      results.each do |row|
        log.debug "You must first kill process with pid #{row['procpid']}"
        command = format('sudo kill -9 %<procpid>s', procpid: row['procpid'])
        log.debug "Execute: #{command}"
        # `#{command}`
      end
    end
    log.error "Unexpected error creating database: #{e.inspect}"
    e.backtrace.each { |t| log.error t }
    return false
  end
end

#reconnect_database(url) ⇒ Object

rubocop: disable Metrics/AbcSize rubocop: disable Metrics/MethodLength



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/runtime/database.rb', line 221

def reconnect_database(url)
  log.debug "Reconnecting to database #{sanitize_url(url)}"
  begin
    Sequel::Model.db&.disconnect
  rescue StandardError => e
    log.warn "Encountered unexpected error disconnecting from database: #{e.message}"
  end
  Sequel::Model.db = Sequel.connect(url)
  Sequel::Model.descendants.each do |model|
    model_dataset = begin
      model.dataset
    rescue Sequel::Error => e
      nil
    end
    model.db = Sequel::Model.db if model_dataset.nil?
  end
end