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.



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

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



83
84
85
# File 'lib/bricolage/mysqldatasource.rb', line 83

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

#export_by_rubyObject



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

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



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

def export_by_sqldump
  cmds = [[sqldump_path.to_s, "--#{@format}", ds.host, ds.port.to_s, ds.username, ds.password, 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, "#{cmd} failed (status #{st.to_i})"
    end
  end
end

#format_pipeline(cmds) ⇒ Object



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

def format_pipeline(cmds)
  cmds = cmds.map {|args| args.dup }
  cmds.first[5] = '****'
  cmds.map {|args| %Q("#{args.join('" "')}") }.join(' | ')
end

#platform_nameObject



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

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

#runObject



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

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

#sourceObject



87
88
89
# File 'lib/bricolage/mysqldatasource.rb', line 87

def source
  @statement.stripped_source
end

#sqldump_available?Boolean

Returns:

  • (Boolean)


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

def sqldump_available?
  sqldump_real_path.executable?
end

#sqldump_pathObject



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

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

#sqldump_real_pathObject



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

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

#sqldump_usable?Boolean

Returns:

  • (Boolean)


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

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