Class: Ridgepole::ExternalSqlExecuter

Inherits:
Object
  • Object
show all
Defined in:
lib/ridgepole/external_sql_executer.rb

Instance Method Summary collapse

Constructor Details

#initialize(script, logger) ⇒ ExternalSqlExecuter

Returns a new instance of ExternalSqlExecuter.



2
3
4
5
# File 'lib/ridgepole/external_sql_executer.rb', line 2

def initialize(script, logger)
  @script = script
  @logger = logger
end

Instance Method Details

#execute(sql) ⇒ Object



7
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
47
# File 'lib/ridgepole/external_sql_executer.rb', line 7

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)

        if 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
      end
    rescue EOFError
    end

    unless wait_thr.value.success?
      raise "`#{@script}` execution failed"
    end
  end
end