class NoMySQLBin < StandardError;
end
class NoRailsDbConf < StandardError;
end

@conf = {
  :dump_data_dir      => 'db/dump_data',
  :db_conf            => 'config/database.yml',
  :file_ext           => ".sql"
}

namespace :db do
  task :env do
    require 'yaml'

    MYSQLBIN = `which mysql`.chomp

    fail NoMySQLBin, "ERROR: unable to find mysql binary" unless File.exist?(MYSQLBIN)

    fail NoRailsDbConf, "ERROR: unable to find Rails database configuration file" unless File.exist?(@conf[:db_conf])
    db_conf = YAML.load_file(@conf[:db_conf])

    rails_env = ENV["RAILS_ENV"] || 'development'

    @conf[:db] = {
      :name     => db_conf[rails_env]['database'],
      :user     => db_conf[rails_env]['username'],
      :password => db_conf[rails_env]['password'],
      :host     => db_conf[rails_env]['host'],
      :port     => db_conf[rails_env]['port']
    }
    make_load_cmd
  end

  desc "Load the dump data from sql files in '#{@conf[:dump_data_dir]}'"
  task :load_dump_data => :env do
    files = Dir.glob(File.join(Rails.root, @conf[:dump_data_dir], "*#{@conf[:file_ext]}"))

    files.each do |file|
      puts "+++ Loading dump data: #{File.basename(file)}"
      system "#{@conf[:db][:cmd]} #{@conf[:db][:name]} < #{file}"
    end
  end

end # namespace :db

# -- Methods

def make_load_cmd
  @conf[:db][:cmd] = "#{MYSQLBIN} -u#{@conf[:db][:user]}"
  @conf[:db][:cmd] << " -p#{@conf[:db][:password]}" unless @conf[:db][:password].blank?
  @conf[:db][:cmd] << " -h#{@conf[:db][:host]}" unless @conf[:db][:host].blank?
  @conf[:db][:cmd] << " -P#{@conf[:db][:port]}" unless @conf[:db][:port].blank?
  @conf[:db][:cmd] << " --default-character-set=utf8"
end
