Class: Bricolage::MySQLTask::Export
- Inherits:
-
Action
- Object
- Action
- Bricolage::MySQLTask::Export
- Defined in:
- lib/bricolage/mysqldatasource.rb
Instance Method Summary collapse
- #bind(*args) ⇒ Object
- #export_by_ruby ⇒ Object
- #export_by_sqldump ⇒ Object
- #format_pipeline(cmds) ⇒ Object
-
#initialize(stmt, path: nil, format: nil, override: false, gzip: false, sqldump: false) ⇒ Export
constructor
A new instance of Export.
- #platform_name ⇒ Object
- #run ⇒ Object
- #source ⇒ Object
- #sqldump_available? ⇒ Boolean
- #sqldump_path ⇒ Object
- #sqldump_real_path ⇒ Object
- #sqldump_usable? ⇒ Boolean
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_ruby ⇒ Object
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_sqldump ⇒ Object
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_name ⇒ Object
133 134 135 |
# File 'lib/bricolage/mysqldatasource.rb', line 133 def platform_name @platform_name ||= `uname -s`.strip end |
#run ⇒ Object
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 |
#source ⇒ Object
89 90 91 |
# File 'lib/bricolage/mysqldatasource.rb', line 89 def source @statement.stripped_source end |
#sqldump_available? ⇒ Boolean
121 122 123 |
# File 'lib/bricolage/mysqldatasource.rb', line 121 def sqldump_available? sqldump_real_path.executable? end |
#sqldump_path ⇒ Object
125 126 127 |
# File 'lib/bricolage/mysqldatasource.rb', line 125 def sqldump_path Pathname(__dir__).parent.parent + "libexec/sqldump" end |
#sqldump_real_path ⇒ Object
129 130 131 |
# File 'lib/bricolage/mysqldatasource.rb', line 129 def sqldump_real_path Pathname("#{sqldump_path}.#{platform_name}") end |
#sqldump_usable? ⇒ Boolean
137 138 139 |
# File 'lib/bricolage/mysqldatasource.rb', line 137 def sqldump_usable? %w[json tsv].include?(@format) end |