Module: Thredded::DbTools

Defined in:
lib/thredded/db_tools.rb

Constant Summary collapse

MIGRATION_SPEC_SOURCE_VERSION =
'v0.8'

Class Method Summary collapse

Class Method Details

.adapterObject



83
84
85
# File 'lib/thredded/db_tools.rb', line 83

def adapter
  config['adapter']
end

.configObject



79
80
81
# File 'lib/thredded/db_tools.rb', line 79

def config
  @config ||= Rails.configuration.database_configuration[Rails.env]
end

.databaseObject



87
88
89
# File 'lib/thredded/db_tools.rb', line 87

def database
  config['database']
end

.dump(to = dump_file) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/thredded/db_tools.rb', line 33

def dump(to = dump_file)
  case adapter
  when /sqlite/i
    system ['sqlite3', Rails.root.join(database), '.dump', '>', to].join(' ')
  when /postgres/i
    cmd = "pg_dump --dbname=postgresql://#{username}:#{password}@#{host}:5432/#{database}" \
      "--verbose --clean --no-owner --no-acl --format=c > #{to}"
    system cmd
  when /mysql/i
    system("mysqldump --user #{username} -p#{password} #{database} > #{to}")
  end
end

.dump_fileObject



29
30
31
# File 'lib/thredded/db_tools.rb', line 29

def dump_file
  File.expand_path("../../../spec/migration/#{MIGRATION_SPEC_SOURCE_VERSION}.#{adapter}.dump", __FILE__)
end

.hostObject



99
100
101
# File 'lib/thredded/db_tools.rb', line 99

def host
  config['host']
end

.migrate(paths:, quiet:, &filter) ⇒ Object

Runs the migrations in the given paths.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/thredded/db_tools.rb', line 9

def migrate(paths:, quiet:, &filter)
  verbose_was = ActiveRecord::Migration.verbose
  ActiveRecord::Migration.verbose = !quiet
  migrate =
    if Rails.gem_version >= Gem::Version.new('6.0.0.rc2')
      -> { ActiveRecord::MigrationContext.new(paths, ActiveRecord::SchemaMigration).migrate(nil, &filter) }
    elsif Rails::VERSION::STRING >= '5.2'
      -> { ActiveRecord::MigrationContext.new(paths).migrate(nil, &filter) }
    else
      -> { ActiveRecord::Migrator.migrate(paths, &filter) }
    end
  if quiet
    silence_active_record(&migrate)
  else
    migrate.call
  end
ensure
  ActiveRecord::Migration.verbose = verbose_was
end

.passwordObject



95
96
97
# File 'lib/thredded/db_tools.rb', line 95

def password
  config['password']
end

.restore(from = dump_file) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/thredded/db_tools.rb', line 46

def restore(from = dump_file)
  case adapter
  when /postgres/i
    cmd = [
      'pg_restore --verbose --clean --no-owner --no-acl',
      "--dbname=postgresql://#{username}:#{password}@#{host}:5432/#{database}",
      from,
      '>',
      Rails.root.join('log', 'restore.log')
    ].join(' ')
    system cmd
  when /mysql/i, /sqlite/i
    connection = ActiveRecord::Base.connection
    statements = File.read(from).split(/;$/)
    statements.pop
    silence_active_record do
      ActiveRecord::Base.transaction do
        statements.each do |statement|
          connection.execute(statement) unless statement =~ /(BEGIN TRANSACTION|COMMIT)/
        end
      end
    end
  end
end

.silence_active_recordObject



71
72
73
74
75
76
77
# File 'lib/thredded/db_tools.rb', line 71

def silence_active_record
  was = ActiveRecord::Base.logger.level
  ActiveRecord::Base.logger.level = Logger::WARN
  yield
ensure
  ActiveRecord::Base.logger.level = was
end

.usernameObject



91
92
93
# File 'lib/thredded/db_tools.rb', line 91

def username
  config['username']
end