namespace :db do

desc "Creates a database migration for any newly created/modified/deleted triggers in the models"
task :generate_trigger_migration => :environment do
  if file_name = HairTrigger.generate_migration
    puts "Generated #{file_name}"
  else
    puts "Nothing to do"
  end
end

namespace :schema do
  desc "Create a db/schema.rb file that can be portably used against any DB supported by AR"
  task :dump => :environment do
    format = ActiveRecord.respond_to?(:schema_format) ? ActiveRecord.schema_format : ActiveRecord::Base.schema_format
    next unless format == :ruby

    require 'active_record/schema_dumper'

    databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml

    ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
      db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
      connection_pool = ActiveRecord::Base.establish_connection(db_config)

      filename = dump_filename(db_config.name)
      ActiveRecord::SchemaDumper.previous_schema = File.exist?(filename) ? File.read(filename) : nil

      File.open(filename, "w") do |file|
        ActiveRecord::SchemaDumper.dump(connection_pool.connection, file)
      end
    end

    Rake::Task["db:schema:dump"].reenable
  end

  def schema_file_type(format)
    case format
      when :ruby
        "schema.rb"
      when :sql
        "structure.sql"
    end
  end

  # code adopted from activerecord/lib/active_record/tasks/database_tasks.rb#L441
  def dump_filename(db_config_name)
    format = ActiveRecord.respond_to?(:schema_format) ? ActiveRecord.schema_format : ActiveRecord::Base.schema_format
    filename = if ActiveRecord::Base.configurations.primary?(db_config_name)
                 schema_file_type(format)
               else
                 "#{db_config_name}_#{schema_file_type(format)}"
               end

    ENV["SCHEMA"] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
  end
end

end