ikuseiGmbH/Goldencobra

View on GitHub
lib/tasks/import.rake

Summary

Maintainability
Test Coverage
# encoding: utf-8

namespace :db do
  desc 'Dump production DB to backup.sql'
  task :dump => :environment do
    server_config = ActiveRecord::Base.configurations["production"]
    remote_db = server_config["database"]
    user_name = server_config["username"]
    password = server_config["password"]
    system("nice -n15 mysqldump --opt --add-drop-table -hlocalhost -u#{user_name} -p#{password} #{remote_db} > backup.sql")
  end


  desc 'Import remote production database to local database'
  task :import => :environment do
    puts "Your lokal database will be overwritten by server db! Are you sure? (yes)"
    input = STDIN.gets.strip
    if ["yes", "Yes", "Y", "y", "YES"].include?(input)
      local_config = ActiveRecord::Base.configurations["development"]
      if defined?(Capistrano) == "constant"
        puts "Loading remote configuration..."
        config = Capistrano::Configuration.new
        config.load("Capfile")
        config.logger.level = 1
        ssh_user = config[:user]
        ssh_server = config[:ip_address]
        deploy_to = config[:deploy_to]
        puts "Connecting to #{ssh_user}@#{ssh_server} and generating db dump..."
        system("cap invoke COMMAND='cd #{deploy_to}/current && RAILS_ENV=production bundle exec rake db:dump'")
        puts "MysqlDump created on server as 'backup.sql'. Transfering data..."
        local_db_password = ""
        if local_config['password'].present?
          local_db_password = "-p#{local_config['password']}"
        end
        system("ssh -C #{ssh_user}@#{ssh_server} less #{deploy_to}/current/backup.sql |mysql -u#{local_config['username']} #{local_db_password} #{local_config['database']}")
        puts "Dumpfile copied and transfered to local DB: #{local_config['username']}@#{local_config['database']}"
      else
        remote_db = ENV['REMOTE']
        user_name = ENV['USER']
        password = ENV['PASSWORD']
        server = ENV['SERVER']
        if server.present? &&
          system("ssh -C #{server} mysqldump --opt --add-drop-table -hlocalhost -u#{user_name} -p#{password} #{remote_db} |mysql -u#{local_config['username']} -p#{local_config['password']} #{local_config['database']}")
        else
          puts "Missing Attributes! e.g.:"
          puts "rake db:import SERVER=taurus REMOTE=db_qvnia USER=user_qvnia PASSWORD=yq1rx5qiHIz"
        end
      end
    else
      puts "Import-Task aborted"
    end
  end

  namespace :schema do
  
    desc 'Regenerates data in table schema_migrations from local files in multiple folders like db/migrate. Usage rake db... PATH=db/migrate,foo/baar,test/dummy/db/migrate'
    task :regnerate => :environment do
      migrations_path = ENV["PATH"] || ""
      raise "PATH=db/migrations missing" if migrations_path.blank? 

      file_list = []
      migrations_path.split(",").each do |mp|
        Dir.foreach(mp) do |file|
          # only files matching "20091231235959_some_name.rb" pattern
          if match_data = /(\d{14})_(.+)\.rb/.match(file)
            file_list << match_data[1]
          end
        end
      end

      #Temporäre classe SchemaMigration um die Dtaen bequemer in die DB zu bekommen
      class SchemaMigration < ActiveRecord::Base; self.primary_key = :version; attr_accessible :version; end
      SchemaMigration.destroy_all  
      file_list.sort.each do |fl|
        SchemaMigration.create(:version => fl)
      end
    end

  end


end