Module: Capistrano::Mysqldump

Defined in:
lib/capistrano/mysqldump.rb

Class Method Summary collapse

Class Method Details

.credential_options(username, password) ⇒ Object

returns credential options for a given username and password when given an empty or nil password, does not include p: in the returned hash



29
30
31
32
33
34
# File 'lib/capistrano/mysqldump.rb', line 29

def self.credential_options(username, password)
  {}.tap do |opts|
    opts[:u] = username
    opts[:p] = password if password == true || password && !password.empty?
  end
end

.load_into(configuration) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/capistrano/mysqldump.rb', line 36

def self.load_into(configuration)
  configuration.load do 
    namespace :mysqldump do
      task :default, :roles => :db do
        dump
        import
      end

      task :setup do
        @mysqldump_config = fetch :mysqldump_config, YAML.load_file("config/database.yml")[rails_env.to_s]
        unless @mysqldump_config
          raise "Cannot load database config for #{rails_env} environment"
        end

        host = @mysqldump_config["host"]

        # overwrite these if necessary
        @mysqldump_bin = fetch :mysqldump_bin, "`which mysqldump`"
        mysqldump_remote_tmp_dir = fetch :mysqldump_remote_tmp_dir, "/tmp"
        mysqldump_local_tmp_dir = fetch :mysqldump_local_tmp_dir, "/tmp"
        @mysqldump_location = fetch :mysqldump_location, host && !host.empty? && host != "localhost" ? :remote : :local
        @mysqldump_options = fetch :mysqldump_options, {}

        # for convenience
        mysqldump_filename = "%s-%s.sql" % [application, Time.now.to_i]
        mysqldump_filename_gz = "%s.gz" % mysqldump_filename
        @mysqldump_remote_filename = File.join( mysqldump_remote_tmp_dir, mysqldump_filename_gz )
        @mysqldump_local_filename = File.join( mysqldump_local_tmp_dir, mysqldump_filename )
        @mysqldump_local_filename_gz = File.join( mysqldump_local_tmp_dir, mysqldump_filename_gz )

        @mysqldump_ignore_tables = fetch :mysqldump_ignore_tables, []
        @mysqldump_tables = fetch :mysqldump_tables, []
      end

      def default_options
        setup
        username, password, host = @mysqldump_config.values_at *%w( username password host )
        {
          :h => host,
          :quick => true,
          "single-transaction" => true,
        }.tap do |options|

          password = true if @mysqldump_location == :remote

          if @mysqldump_ignore_tables.any?
            options['ignore-tables'] = [@mysqldump_ignore_tables].flatten.join ' '
          end

          options.merge! Mysqldump.credential_options(username, password)
        end
      end



      task :dump, :roles => :db do
        options = default_options
        options.merge! @mysqldump_options
        password, database = @mysqldump_config.values_at *%w( password database )
        mysqldump_cmd = "#{@mysqldump_bin} #{Mysqldump.options_string(options)} #{database} #{[@mysqldump_tables].flatten.compact.join ' '}"

        case @mysqldump_location
        when :remote
          mysqldump_cmd += " | gzip > %s" % @mysqldump_remote_filename

          run mysqldump_cmd do |ch, stream, out|
            ch.send_data "#{password}\n" if out =~ /^Enter password:/
          end

          download @mysqldump_remote_filename, @mysqldump_local_filename_gz, :via => :scp
          run "rm #{@mysqldump_remote_filename}"

          `gunzip #{@mysqldump_local_filename_gz}`
        when :local
          mysqldump_cmd += " > %s" % @mysqldump_local_filename

          `#{mysqldump_cmd}`
        end
      end

      task :import do
        config = YAML.load_file("config/database.yml")["development"]
        username, password, database = config.values_at *%w( username password database )

        credentials_string = Mysqldump.options_string Mysqldump.credential_options(username, password)
        
        mysql_cmd = "mysql #{credentials_string}"
        `#{mysql_cmd} -e "drop database #{database}; create database #{database}"`
        `#{mysql_cmd} #{database} < #{@mysqldump_local_filename}`
        `rm #{@mysqldump_local_filename}`
      end
    end
  end
end

.options_string(options = nil) ⇒ Object

converts a hash of options into a string. drops falsey-valued keys.

‘’foo’, ‘single-transaction’ => true, ignore-tables’ => ‘bar’, p: nil‘

> ‘-ufoo –ignore-tables=bar –single-transaction



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/capistrano/mysqldump.rb', line 12

def self.options_string(options = nil)
  options
  options.map do |k,v|
    next unless v
    used_value = v == true ? nil : v
    used_prefix, used_join = if k.length == 1
      ["-", '']
    else
      ["--", '=']
    end

    "#{used_prefix}#{[k, used_value].compact.join used_join}"
  end.compact.join ' '
end