Class: Ridgepole::ExternalSqlExecuter
- Inherits:
-
Object
- Object
- Ridgepole::ExternalSqlExecuter
- Defined in:
- lib/ridgepole/external_sql_executer.rb
Instance Method Summary collapse
- #execute(sql) ⇒ Object
-
#initialize(script, logger) ⇒ ExternalSqlExecuter
constructor
A new instance of ExternalSqlExecuter.
Constructor Details
#initialize(script, logger) ⇒ ExternalSqlExecuter
Returns a new instance of ExternalSqlExecuter.
3 4 5 6 |
# File 'lib/ridgepole/external_sql_executer.rb', line 3 def initialize(script, logger) @script = script @logger = logger end |
Instance Method Details
#execute(sql) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 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 45 46 |
# File 'lib/ridgepole/external_sql_executer.rb', line 8 def execute(sql) cmd = Shellwords.join([@script, sql, JSON.dump(ActiveRecord::Base.connection_config)]) @logger.info("Execute #{@script}") script_basename = File.basename(@script) Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr| stdin.close_write files = [stdout, stderr] begin until files.empty? ready = IO.select(files) next unless ready readable = ready[0] readable.each do |f| begin data = f.read_nonblock(1024) next if data.nil? data.chomp! if f == stderr @logger.warn("[WARNING] #{script_basename}: #{data}") else @logger.info("#{script_basename}: #{data}") end rescue EOFError files.delete f end end end rescue EOFError # rubocop:disable Lint/HandleExceptions # nothing to do end raise "`#{@script}` execution failed" unless wait_thr.value.success? end end |