Class: Flydata::Mysql::MysqlUtil

Inherits:
Object
  • Object
show all
Defined in:
lib/flydata/mysql/mysql_util.rb

Constant Summary collapse

DEFAULT_MYSQL_CMD_OPTION =
"--default-character-set=utf8 --protocol=tcp"

Class Method Summary collapse

Class Method Details

.each_mysql_tabledef(tables, option) ⇒ Object



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
# File 'lib/flydata/mysql/mysql_util.rb', line 79

def self.each_mysql_tabledef(tables, option)
  command = generate_mysql_ddl_dump_cmd(option.merge(tables: tables))

  create_opt = {}
  if option.has_key?(:skip_primary_key_check)
    create_opt[:skip_primary_key_check] = option[:skip_primary_key_check]
  end

  Open3.popen3(command) do |stdin, stdout, stderr|
    stdin.close
    stdout.set_encoding("utf-8", "utf-8") # mysqldump output must be in UTF-8
    create_flydata_ctl_table = true
    while !stdout.eof?
      begin
        mysql_tabledef = FlydataCore::TableDef::MysqlTableDef.create(stdout, create_opt)
        break if mysql_tabledef.nil?
        yield(mysql_tabledef, nil)
      rescue FlydataCore::TableDefError=> e
        yield(nil, e)
      end
    end
    errors = ""
    while !stderr.eof?
      line = stderr.gets.gsub('mysqldump: ', '')
      errors << line unless /Warning: Using a password on the command line interface can be insecure./ === line
    end
    raise errors unless errors.empty?
  end
end

.generate_mysql_cmd(option) ⇒ Object

Generate mysql/mysqldump command with options options must be hash

  • command # mysql(default) | mysqldump

  • host

  • port

  • username

  • password

  • database

  • tables # array

  • ssl_ca

  • custom_option # string

Raises:

  • (ArgumentError)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/flydata/mysql/mysql_util.rb', line 20

def self.generate_mysql_cmd(option)
  raise ArgumentError.new("option must be hash.") unless option.kind_of?(Hash)
  option = convert_keys_to_sym(option)
  command = option[:command] ? option[:command] : 'mysql'
  host = option[:host] ? "-h #{option[:host]}" : nil
  port = option[:port] ? "-P #{option[:port]}" : nil
  username = option[:username] ? "-u#{option[:username]}" : nil
  password = if !(option[:password].to_s.empty?)
               "-p\"#{option[:password].gsub('$','\\$').gsub('"','\\"').gsub('`', '\\\`')}\""
             else
               nil
             end
  database = option[:database]
  tables = option[:tables] ? option[:tables].join(' ') : nil
  ssl_ca = option[:ssl_ca] ? option[:ssl_ca] : nil

  default_option = option[:no_default_option] ? "" : DEFAULT_MYSQL_CMD_OPTION
  default_option += " --ssl-ca=#{ssl_ca}" if ssl_ca
  default_option = nil if default_option == ''

  custom_option = option[:custom_option]

  [command, host, port, username, password, default_option,
   custom_option, database, tables].compact.join(' ')
end

.generate_mysql_ddl_dump_cmd(option) ⇒ Object

DDL_DUMP_CMD_TEMPLATE = “MYSQL_PWD="%s" mysqldump –protocol=tcp -d -h %s -P %s -u %s %s %s”



47
48
49
50
51
52
# File 'lib/flydata/mysql/mysql_util.rb', line 47

def self.generate_mysql_ddl_dump_cmd(option)
  opt = option.dup
  opt[:command] = 'mysqldump'
  opt[:custom_option] = '-d'
  generate_mysql_cmd(opt)
end

.generate_mysql_show_grants_cmd(option) ⇒ Object



72
73
74
75
76
77
# File 'lib/flydata/mysql/mysql_util.rb', line 72

def self.generate_mysql_show_grants_cmd(option)
  opt = option.dup
  opt[:command] = 'mysql'
  opt[:custom_option] = '-e "SHOW GRANTS;"'
  generate_mysql_cmd(opt)
end

.generate_mysqldump_with_master_data_cmd(option) ⇒ Object

MYSQL_DUMP_CMD_TEMPLATE = “MYSQL_PWD="%s" mysqldump –default-character-set=utf8 –protocol=tcp -h %s -P %s -u%s –skip-lock-tables –single-transaction –hex-blob %s %s %s”



55
56
57
58
59
60
# File 'lib/flydata/mysql/mysql_util.rb', line 55

def self.generate_mysqldump_with_master_data_cmd(option)
  opt = option.dup
  opt[:command] = 'mysqldump'
  opt[:custom_option] = '--skip-lock-tables --single-transaction --hex-blob --flush-logs --master-data=2'
  generate_mysql_cmd(opt)
end

.generate_mysqldump_without_master_data_cmd(option) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/flydata/mysql/mysql_util.rb', line 62

def self.generate_mysqldump_without_master_data_cmd(option)
  opt = option.dup
  opt[:command] = 'mysqldump'
  opt[:custom_option] = '--skip-lock-tables --single-transaction --hex-blob'
  if opt[:result_file]
    opt[:custom_option] << " --result-file=#{opt[:result_file]}"
  end
  generate_mysql_cmd(opt)
end