2015-02-14 09:51:52 -06:00
|
|
|
# we should set the locale before the migration
|
|
|
|
task 'set_locale' do
|
2017-11-16 09:58:09 -06:00
|
|
|
begin
|
|
|
|
I18n.locale = (SiteSetting.default_locale || :en) rescue :en
|
|
|
|
rescue I18n::InvalidLocale
|
|
|
|
I18n.locale = :en
|
|
|
|
end
|
2015-02-14 09:51:52 -06:00
|
|
|
end
|
|
|
|
|
2019-03-20 20:50:16 -05:00
|
|
|
module MultisiteTestHelpers
|
|
|
|
def self.load_multisite?
|
|
|
|
Rails.env.test? && !ENV["RAILS_DB"] && !ENV["SKIP_MULTISITE"]
|
2017-08-30 23:06:56 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-20 20:50:16 -05:00
|
|
|
task 'db:environment:set' => [:load_config] do |_, args|
|
|
|
|
if MultisiteTestHelpers.load_multisite?
|
|
|
|
system("RAILS_ENV=test RAILS_DB=discourse_test_multisite rake db:environment:set")
|
2017-08-07 08:05:13 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-20 20:50:16 -05:00
|
|
|
task 'db:create' => [:load_config] do |_, args|
|
|
|
|
if MultisiteTestHelpers.load_multisite?
|
|
|
|
system("RAILS_DB=discourse_test_multisite rake db:create")
|
2017-08-07 08:05:13 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-03-20 20:50:16 -05:00
|
|
|
task 'db:drop' => [:load_config] do |_, args|
|
|
|
|
if MultisiteTestHelpers.load_multisite?
|
|
|
|
system("RAILS_DB=discourse_test_multisite rake db:drop")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# we need to run seed_fu every time we run rake db:migrate
|
|
|
|
task 'db:migrate' => ['environment', 'set_locale'] do |_, args|
|
2017-11-16 13:42:38 -06:00
|
|
|
SeedFu.seed(DiscoursePluginRegistry.seed_paths)
|
2017-08-07 08:05:13 -05:00
|
|
|
|
2019-03-20 20:50:16 -05:00
|
|
|
if MultisiteTestHelpers.load_multisite?
|
|
|
|
system("rake db:schema:dump")
|
|
|
|
system("RAILS_DB=discourse_test_multisite rake db:schema:load")
|
|
|
|
system("RAILS_DB=discourse_test_multisite rake db:migrate")
|
2017-08-07 08:05:13 -05:00
|
|
|
end
|
2013-04-07 18:56:42 -05:00
|
|
|
end
|
2013-10-24 18:31:33 -05:00
|
|
|
|
|
|
|
task 'test:prepare' => 'environment' do
|
2014-07-28 11:40:00 -05:00
|
|
|
I18n.locale = SiteSetting.default_locale rescue :en
|
2017-11-16 13:42:38 -06:00
|
|
|
SeedFu.seed(DiscoursePluginRegistry.seed_paths)
|
2013-10-24 18:31:33 -05:00
|
|
|
end
|
2014-01-31 13:16:15 -06:00
|
|
|
|
2014-09-10 21:53:21 -05:00
|
|
|
task 'db:api_test_seed' => 'environment' do
|
|
|
|
puts "Loading test data for discourse_api"
|
|
|
|
load Rails.root + 'db/api_test_seeds.rb'
|
|
|
|
end
|
|
|
|
|
2017-08-25 09:29:04 -05:00
|
|
|
def print_table(array)
|
|
|
|
width = array[0].keys.map { |k| k.to_s.length }
|
|
|
|
cols = array[0].keys.length
|
|
|
|
|
|
|
|
array.each do |row|
|
|
|
|
row.each_with_index do |(_, val), i|
|
|
|
|
width[i] = [width[i].to_i, val.to_s.length].max
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
array[0].keys.each_with_index do |col, i|
|
|
|
|
print col.to_s.ljust(width[i], ' ')
|
|
|
|
if i == cols - 1
|
|
|
|
puts
|
|
|
|
else
|
|
|
|
print ' | '
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
puts "-" * (width.sum + width.length)
|
|
|
|
|
|
|
|
array.each do |row|
|
|
|
|
row.each_with_index do |(_, val), i|
|
|
|
|
print val.to_s.ljust(width[i], ' ')
|
|
|
|
if i == cols - 1
|
|
|
|
puts
|
|
|
|
else
|
|
|
|
print ' | '
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Statistics about database'
|
|
|
|
task 'db:stats' => 'environment' do
|
|
|
|
|
|
|
|
sql = <<~SQL
|
|
|
|
select table_name,
|
|
|
|
(
|
|
|
|
select reltuples::bigint
|
|
|
|
from pg_class
|
|
|
|
where oid = ('public.' || table_name)::regclass
|
|
|
|
) AS row_estimate,
|
|
|
|
pg_size_pretty(pg_relation_size(quote_ident(table_name))) size
|
|
|
|
from information_schema.tables
|
|
|
|
where table_schema = 'public'
|
|
|
|
order by pg_relation_size(quote_ident(table_name)) DESC
|
|
|
|
SQL
|
|
|
|
|
|
|
|
puts
|
2018-06-19 01:13:14 -05:00
|
|
|
print_table(DB.query_hash(sql))
|
2017-08-25 09:29:04 -05:00
|
|
|
end
|
|
|
|
|
2014-01-31 13:16:15 -06:00
|
|
|
desc 'Rebuild indexes'
|
|
|
|
task 'db:rebuild_indexes' => 'environment' do
|
|
|
|
if Import::backup_tables_count > 0
|
|
|
|
raise "Backup from a previous import exists. Drop them before running this job with rake import:remove_backup, or move them to another schema."
|
|
|
|
end
|
|
|
|
|
2014-02-12 22:38:28 -06:00
|
|
|
Discourse.enable_readonly_mode
|
|
|
|
|
2014-01-31 13:16:15 -06:00
|
|
|
backup_schema = Jobs::Importer::BACKUP_SCHEMA
|
2018-06-19 01:13:14 -05:00
|
|
|
table_names = DB.query_single("select table_name from information_schema.tables where table_schema = 'public'")
|
2014-01-31 13:16:15 -06:00
|
|
|
|
|
|
|
begin
|
|
|
|
# Move all tables to the backup schema:
|
2018-06-19 01:13:14 -05:00
|
|
|
DB.exec("DROP SCHEMA IF EXISTS #{backup_schema} CASCADE")
|
|
|
|
DB.exec("CREATE SCHEMA #{backup_schema}")
|
2014-01-31 13:16:15 -06:00
|
|
|
table_names.each do |table_name|
|
2018-06-19 01:13:14 -05:00
|
|
|
DB.exec("ALTER TABLE public.#{table_name} SET SCHEMA #{backup_schema}")
|
2014-01-31 13:16:15 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
# Create a new empty db
|
|
|
|
Rake::Task["db:migrate"].invoke
|
|
|
|
|
|
|
|
# Fetch index definitions from the new db
|
|
|
|
index_definitions = {}
|
|
|
|
table_names.each do |table_name|
|
2018-06-19 01:13:14 -05:00
|
|
|
index_definitions[table_name] = DB.query_single("SELECT indexdef FROM pg_indexes WHERE tablename = '#{table_name}' and schemaname = 'public';")
|
2014-01-31 13:16:15 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
# Drop the new tables
|
|
|
|
table_names.each do |table_name|
|
2018-06-19 01:13:14 -05:00
|
|
|
DB.exec("DROP TABLE public.#{table_name}")
|
2014-01-31 13:16:15 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
# Move the old tables back to the public schema
|
|
|
|
table_names.each do |table_name|
|
2018-06-19 01:13:14 -05:00
|
|
|
DB.exec("ALTER TABLE #{backup_schema}.#{table_name} SET SCHEMA public")
|
2014-01-31 13:16:15 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
# Drop their indexes
|
2018-06-19 01:13:14 -05:00
|
|
|
index_names = DB.query_single("SELECT indexname FROM pg_indexes WHERE schemaname = 'public' AND tablename IN ('#{table_names.join("', '")}')")
|
2014-01-31 13:16:15 -06:00
|
|
|
index_names.each do |index_name|
|
|
|
|
begin
|
|
|
|
puts index_name
|
2018-06-19 01:13:14 -05:00
|
|
|
DB.exec("DROP INDEX public.#{index_name}")
|
2016-04-07 13:32:31 -05:00
|
|
|
rescue ActiveRecord::StatementInvalid
|
2014-01-31 13:16:15 -06:00
|
|
|
# It's this:
|
|
|
|
# PG::Error: ERROR: cannot drop index category_users_pkey because constraint category_users_pkey on table category_users requires it
|
|
|
|
# HINT: You can drop constraint category_users_pkey on table category_users instead.
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Create the indexes
|
|
|
|
table_names.each do |table_name|
|
|
|
|
index_definitions[table_name].each do |index_def|
|
|
|
|
begin
|
2018-06-19 01:13:14 -05:00
|
|
|
DB.exec(index_def)
|
2016-04-07 13:32:31 -05:00
|
|
|
rescue ActiveRecord::StatementInvalid
|
2014-01-31 13:16:15 -06:00
|
|
|
# Trying to recreate a primary key
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
# Can we roll this back?
|
|
|
|
raise
|
|
|
|
ensure
|
2014-02-12 22:38:28 -06:00
|
|
|
Discourse.disable_readonly_mode
|
2014-01-31 13:16:15 -06:00
|
|
|
end
|
2014-02-12 22:38:28 -06:00
|
|
|
end
|