=begin

= mysqlcmds.rb

*Copyright*::    (C) 2013 by Novu, LLC
*Author(s)*::    Tamara Temple <tamara.temple@novu.com>
*Since*::        2013-05-01
*License*::      MIT
*Version*::      0.0.1

== Description

Class to wrap mysql command line applications mysqldump, mysqladmin, and mysql.

=end

require 'methadone'
require 'RunIt'

module NewBackup

  class MySqlCmds

    include Methadone::CLILogging

    attr_accessor :hostname, :username, :password, :database, :obfuscate_script


    def initialize(hostname, username, password, database, obfuscate)
      self.hostname=hostname.dup.to_s
      self.username=username.dup.to_s
      self.password=password.dup.to_s
      self.database=database.dup.to_s
      self.obfuscate_script=obfuscate.dup.to_s

      @commands =
        {:mysqldump  	=> get_command('mysqldump'),
        :mysql      	=> get_command('mysql'),
        :gzip		=> get_command('gzip')
      }

      debug "#{self.class}##{__method__}:#{__LINE__}: @commands: #{@commands}"

    end

    def dump(save_file)
      cmd = []
      cmd << @commands[:mysqldump]
      cmd << "--host #{self.hostname}"
      cmd << "--user=#{self.username}"
      cmd << "--password=#{self.password}" unless self.password.nil? or self.password.empty?
      cmd << self.database
      cmd << "|"
      cmd << @commands[:gzip]
      cmd << ">"
      cmd << save_file
 
      debug "#{self.class}##{__method__}:#{__LINE__}: cmd = #{cmd.join(" ")}"

      saver = RunIt.new cmd.join(" ")
      saver.run
      raise "#{self.class}#save error: #{saver.result.exitstatus}: #{saver.error.inspect}" unless saver.result.success?
      debug "#{self.class}##{__method__}:#{__LINE__}: saver.output: #{saver.output}"
    end

    def obfuscate

      cmd = []
      cmd << @commands[:mysql]
      cmd << "--host #{self.hostname}"
      cmd << "--user #{self.username}"
      cmd << "--password=#{self.password}" unless self.password.nil? or self.password.empty?
      cmd << self.database
      cmd << "<"
      cmd << self.obfuscate_script

      debug "#{self.class}##{__method__}:#{__LINE__}: cmd= #{cmd.join(" ")}"
      obfuscator = RunIt.new cmd.join(" ")
      obfuscator.run
      raise "#{self.class}##{__method__}:#{__LINE__}: error: #{obfuscator.result.exitstatus}: #{obfuscator.error.inspect}" unless obfuscator.result.success?
      debug "#{self.class}##{__method__}:#{__LINE__}: obfuscator.output: #{obfuscator.output}"
    end


    private

    def get_command(command)
      command_path = `which #{command}`.chomp
      raise "#{command} not found!" if command_path.empty? || command_path.nil?
      command_path
    end

  end

end