Class: Bricolage::MySQLTask::Export

Inherits:
Action
  • Object
show all
Defined in:
lib/bricolage/mysqldatasource.rb

Instance Method Summary collapse

Constructor Details

#initialize(stmt, path: nil, format: nil, override: false, gzip: false, sqldump: false) ⇒ Export

Returns a new instance of Export.



76
77
78
79
80
81
82
83
# File 'lib/bricolage/mysqldatasource.rb', line 76

def initialize(stmt, path: nil, format: nil, override: false, gzip: false, sqldump: false)
  @statement = stmt
  @path = path
  @format = format
  @override = override
  @gzip = gzip
  @sqldump = sqldump
end

Instance Method Details

#bind(*args) ⇒ Object



85
86
87
# File 'lib/bricolage/mysqldatasource.rb', line 85

def bind(*args)
  @statement.bind(*args)
end

#export_by_rubyObject



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/bricolage/mysqldatasource.rb', line 141

def export_by_ruby
  ds.logger.info "exporting table into #{@path} ..."
  count = 0
  open_target_file(@path) {|f|
    writer_class = WRITER_CLASSES[@format] or raise ArgumentError, "unknown export format: #{@format.inspect}"
    writer = writer_class.new(f)
    rs = ds.query(@statement.stripped_source, as: writer_class.record_format, stream: true, cache_rows: false)
    ds.logger.info "got result set, writing..."
    rs.each do |values|
      writer.write_record values
      count += 1
      ds.logger.info "#{count} records exported..." if count % 10_0000 == 0
    end
  }
  ds.logger.info "#{count} records exported; export finished"
end

#export_by_sqldumpObject



102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/bricolage/mysqldatasource.rb', line 102

def export_by_sqldump
  cmds = [[{"SQLDUMP_PASSWORD" => ds.password}, sqldump_path.to_s, "--#{@format}", ds.host, ds.port.to_s, ds.username, ds.database, @statement.stripped_source]]
  cmds.push [GZIP_COMMAND] if @gzip
  cmds.last.push({out: @path.to_s})
  ds.logger.info '[CMD] ' + format_pipeline(cmds)
  statuses = Open3.pipeline(*cmds)
  statuses.each_with_index do |st, idx|
    unless st.success?
      cmd = cmds[idx].first
      raise JobFailure, "sqldump failed (status #{st.to_i})"
    end
  end
end

#format_pipeline(cmds) ⇒ Object



116
117
118
119
# File 'lib/bricolage/mysqldatasource.rb', line 116

def format_pipeline(cmds)
  cmds = cmds.map {|args| args[0].kind_of?(Hash) ? args[1..-1] : args.dup }   # do not show env
  cmds.map {|args| %Q("#{args.join('" "')}") }.join(' | ')
end

#platform_nameObject



133
134
135
# File 'lib/bricolage/mysqldatasource.rb', line 133

def platform_name
  @platform_name ||= `uname -s`.strip
end

#runObject



93
94
95
96
97
98
99
100
# File 'lib/bricolage/mysqldatasource.rb', line 93

def run
  if @sqldump and sqldump_available? and sqldump_usable?
    export_by_sqldump
  else
    export_by_ruby
  end
  JobResult.success
end

#sourceObject



89
90
91
# File 'lib/bricolage/mysqldatasource.rb', line 89

def source
  @statement.stripped_source
end

#sqldump_available?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/bricolage/mysqldatasource.rb', line 121

def sqldump_available?
  sqldump_real_path.executable?
end

#sqldump_pathObject



125
126
127
# File 'lib/bricolage/mysqldatasource.rb', line 125

def sqldump_path
  Pathname(__dir__).parent.parent + "libexec/sqldump"
end

#sqldump_real_pathObject



129
130
131
# File 'lib/bricolage/mysqldatasource.rb', line 129

def sqldump_real_path
  Pathname("#{sqldump_path}.#{platform_name}")
end

#sqldump_usable?Boolean

Returns:

  • (Boolean)


137
138
139
# File 'lib/bricolage/mysqldatasource.rb', line 137

def sqldump_usable?
  %w[json tsv].include?(@format)
end