# Regexp used to find the databases list. REGEX_MATCH_FILES_BY_NAME = /config/multiple_dbs/(+[0-9]*|+[a-zA-Z]*)_database.yml/
# @dbs Store all the databases names @dbs = []
# Search in the config/multiple_dbs directory and scan each filename looking for each database name Dir.each do |file|
@dbs << file.scan(REGEX_MATCH_FILES_BY_NAME)
end @dbs.flatten!
# MultipleDbs
namespace namespace :mdbs do
# Looping all the databases @dbs.each do |db| desc "databases managment #{db} tasks" # A namespace per database namespace db.to_sym do |database| desc "#{db} drop" task :drop do Rake::Task["db:drop"].invoke end desc "#{db} create" task :create do Rake::Task["db:create"].invoke end desc "#{db} setup" task :setup do Rake::Task["db:setup"].invoke end desc "#{db} migrate" task :migrate do Rake::Task["db:migrate"].invoke end desc "#{db} rollback" task :rollback do Rake::Task["db:rollback"].invoke end desc "#{db} seed" task :seed do Rake::Task["db:seed"].invoke end desc "#{db} version" task :version do Rake::Task["db:version"].invoke end namespace :schema do desc "#{db} schema load" task :load do Rake::Task["db:schema:load"].invoke end desc "#{db} schema dump" task :dump do Rake::Task["db:schema:dump"].invoke end end database.tasks.each do |task| task.enhance ["mdbs:#{db}:set_custom_config"] do Rake::Task["mdbs:#{db}:revert_to_original_config"].invoke end end desc "#{db} set custom config" task "set_custom_config".to_sym do # save current vars @original_config = { env_schema: ENV['SCHEMA'], config: Rails.application.config.dup } # set config variables for custom database ENV['SCHEMA'] = "db/#{db}/schema.rb" Rails.application.config.paths['db'] = ["db/#{db}"] Rails.application.config.paths['db/migrate'] = ["db/#{db}/migrate"] Rails.application.config.paths['db/seeds.rb'] = ["db/#{db}/seeds.rb"] Rails.application.config.paths['config/database'] = ["config/multiple_dbs/#{db}_database.yml"] end desc "#{db} revert custom config" task "revert_to_original_config".to_sym do # reset config variables to original values ENV['SCHEMA'] = @original_config[:env_schema] Rails.application.config = @original_config[:config] end end #db tasks end # looping dbes desc "drop all dbs and delete their schema file" task :hard_drop do @dbs.each do |db| puts "hard dropping #{db}" puts system(" rake mdbs:#{db}:drop") ? "#{db} dropped" : "Error while dropping #{db}" puts system(" rm -rf db/#{db}/schema.rb ") ? "schema from #{db} removed" : "Error while erasing the schema from #{db}" end end desc "drop, delete the schema files, create, migrate and seed for all dbs" task :hard_reset do @dbs.each do |db| puts "hard reset #{db}" puts system(" rake mdbs:#{db}:drop") ? "#{db} dropped" : "Error while dropping #{db}" puts system(" rm -rf db/#{db}/schema.rb ") ? "schema from #{db} removed" : "Error while erasing the schema from #{db}" puts system(" rake mdbs:#{db}:create") ? "#{db} created" : "Error while creating #{db}" puts system(" rake mdbs:#{db}:migrate") ? "#{db} migrated" : "Error while migrating #{db}" puts system(" rake mdbs:#{db}:seed") ? "#{db} seeded" : "Error while seeding #{db}" end end desc "copy the seeds from the db/seed.rb file to each dbs seed file." task :copy_seeds do @dbs.each do |db| puts "Copy seed to #{db}. #{system('cp db/seeds.rb db/#{db}/seeds.rb')}" end end desc "copy the specified migration to each dbs migrations folder. Parameters: full_path.rb, database_name" task :copy_migration, [:file_name, :db_name] do |t, args| @dbs.each do |db| puts "Copy migration from db/#{args[:db_name].downcase}/migrate/#{args[:file_name]} to db/#{db}/migrate/#{args[:file_name]}." puts system("cp db/#{args[:db_name].downcase}/migrate/#{args[:file_name]} db/#{db}/migrate/#{args[:file_name]} ") end end desc "copy the specified migration to the specified db migrations folder. Parameters: full_path.rb, from_database_name, to_database_name" task :copy_migration_into, [:file_name, :from_database_name, :to_database_name] do |t, args| puts "Copy migration from db/#{args[:from_database_name].downcase}/migrate/#{args[:file_name]} to db/#{args[:to_database_name]}/migrate/#{args[:file_name]}." puts system("cp db/#{args[:from_database_name].downcase}/migrate/#{args[:file_name]} db/#{args[:to_database_name]}/migrate/#{args[:file_name]} ") end desc "copy the specified migration from the default migrations folder db/migrate to each dbs migrations folder. Parameters: full_path.rb" task :copy_migration_from_default, [:file_name] do |t, args| @dbs.each do |db| puts "Copy migration from db/migrate/#{args[:file_name]} to db/#{db}/migrate/#{args[:file_name]}." system(" mkdir db/#{db}") system(" mkdir db/#{db}/migrate") puts system("cp db/migrate/#{args[:file_name]} db/#{db}/migrate/#{args[:file_name]} ") end end desc "copy the db/migration folder into each of your databases" task :replicate_default_database do @dbs.each do |db| puts "Copy folder db/migrate to db/#{db}" system(" mkdir db/#{db}") puts system("cp -r db/migrate db/#{db}") end end desc "copy the db/migration folder into the specified database" task :replicate_default_database_into,[:db_name] do |t, args| puts "Copy folder db/migrate to db/#{args[:db_name]}/migrate" system(" mkdir db/#{args[:db_name]}") puts system("cp -r db/migrate db/#{args[:db_name]}/migrate") end desc "copy the specified migration from the default migrations folder db/migrate, to the specified db migrations folder. Parameters: full_path.rb, to_database_name" task :copy_migration_from_default_into, [:file_name, :to_database_name] do |t, args| puts "Copy migration from db/migrate/#{args[:file_name]} to db/#{args[:to_database_name]}/migrate/#{args[:file_name]}." system(" mkdir db/#{args[:to_database_name]}") system(" mkdir db/#{args[:to_database_name]}/migrate") puts system("cp db/migrate/#{args[:file_name]} db/#{args[:to_database_name]}/migrate/#{args[:file_name]} ") end desc "drop all dbs" task :drop do puts "Droping #{@dbs.join(',')}." @dbs.each do |db| Rake::Task["mdbs:#{db}:drop"].invoke Rake::Task["db:drop"].reenable Rake::Task["db:load_config"].reenable Rake::Task["db:drop:_unsafe"].reenable puts "#{db} dropped" end end desc "create all dbs" task :create do @dbs.each do |db| puts system(" rake mdbs:#{db}:create") ? "#{db} created" : "Error while creating #{db}" end end desc "setup all dbs" task :setup do @dbs.each do |db| puts system(" rake mdbs:#{db}:setup") ? "#{db} setup completed" : "Error while setting up #{db}" end end desc "migrate all dbs" task :migrate do @dbs.each do |db| puts system( "rake mdbs:#{db}:migrate" ) ? "#{db} migrated" : "Error while migrating #{db}" end end desc "rollback all dbs" task :rollback do @dbs.each do |db| puts system( "rake mdbs:#{db}:migrate" ) ? "#{db} rollback completed" : "Error while executing rollback on #{db}" end end desc "seed all dbs" task :seed do @dbs.each do |db| puts system( "rake mdbs:#{db}:seed" ) ? "#{db} seeded" : "Error while seeding #{db}" end end desc "version all dbs" task :version do puts "Please use specific task for each database. Ex mdbs:my_db:version" end namespace :schema do desc "schema load all dbs" task :load do @dbs.each do |db| puts system(" rake mdbs:#{db}:schema:load ") ? "#{db} schema loaded" : "Error while loading schema for #{db}" end end desc "schema dump all dbs" task :dump do @dbs.each do |db| puts system(" rake mdbs:#{db}:schema:dump ") ? "#{db} schema dumped" : "Error while dumping schema for #{db}" end end end
end