class Arproxy::Plugin::MysqlCasualLog

Constants

REGEXPS

Public Class Methods

new(*args) click to toggle source
# File lib/arproxy/plugin/mysql_casual_log.rb, line 32
def initialize(*args)
  @options = args.first || {}
  @out = @options[:out] || $stdout
  @raw_connection = @options[:raw_connection] || proc {|conn, sql| conn.raw_connection }
end

Public Instance Methods

execute(sql, name=nil) click to toggle source
Calls superclass method
# File lib/arproxy/plugin/mysql_casual_log.rb, line 38
def execute(sql, name=nil)
  if sql =~ /\ASELECT\b/i
    proxy(sql)
  end

  super(sql, name)
end

Private Instance Methods

colored(str) click to toggle source
# File lib/arproxy/plugin/mysql_casual_log.rb, line 100
def colored(str)
  Term::ANSIColor.red(Term::ANSIColor.bold(str))
end
colorize_explain(explain_result) click to toggle source
# File lib/arproxy/plugin/mysql_casual_log.rb, line 84
def colorize_explain(explain_result)
  badquery = false

  REGEXPS.each do |key, regexp|
    value = explain_result[key] ||= 'NULL'
    value = value.to_s

    value.gsub!(regexp) do |m|
      badquery = true
      colored(m)
    end
  end

  badquery
end
explain(conn, sql) click to toggle source
# File lib/arproxy/plugin/mysql_casual_log.rb, line 60
    def explain(conn, sql)
      badquery = false
      explains = []

      conn.query("EXPLAIN #{sql}", :as => :hash).each_with_index do |result, i|
        colorize_explain(result).tap {|bq| badquery ||= bq }
        explains << format_explain(result, i + 1)
      end

      if badquery
        query_options = conn.query_options.dup
        query_options.delete(:password)

        @out << <<-EOS
# Time: #{Time.now.strftime("%Y-%m-%d %H:%M:%S")}
# Query options: #{query_options.inspect}
# Query: #{sql}
#{explains.join("\n")}
        EOS
      end
    rescue => e
      $stderr.puts colored([e.message, e.backtrace.first].join("\n"))
    end
format_explain(explain, i) click to toggle source
# File lib/arproxy/plugin/mysql_casual_log.rb, line 104
def format_explain(explain, i)
  message = "*************************** #{i}. row ***************************\n"
  max_key_length = explain.keys.map(&:length).max

  explain.each do |key, value|
    message << "%*s: %s\n" % [max_key_length, key, value]
  end

  message.chomp
end
proxy(sql) click to toggle source
# File lib/arproxy/plugin/mysql_casual_log.rb, line 48
def proxy(sql)
  if @raw_connection.respond_to?(:call)
    conn = @raw_connection.call(proxy_chain.connection, sql)
  else
    conn = @raw_connection
  end

  if conn
    explain(conn, sql)
  end
end