class Rails::Log::Profiling::QueryLogSubscriber

Public Instance Methods

sql(event) click to toggle source
# File lib/rails/log/profiling/query_log_subscriber.rb, line 6
def sql(event)
  locations = get_locations
  return if locations.empty?
  payload = event.payload

  return if IGNORE_PAYLOAD_NAMES.include?(payload[:name])

  if ActiveRecord.version >= Gem::Version.new("5.0.0.beta")
    ar_ver_5(event, locations)
  else
    ar_ver_4(event, locations)
  end
end

Private Instance Methods

ar_ver_4(event, locations) click to toggle source
# File lib/rails/log/profiling/query_log_subscriber.rb, line 40
def ar_ver_4(event, locations)
  payload = event.payload
  name  = '%s (%.1fms)' % [payload[:name], event.duration]
  sql   = payload[:sql].squeeze(' ')
  binds = nil

  unless (payload[:binds] || []).empty?
    binds = "  " + payload[:binds].map { |col,v|
      if col
        [col.name, v]
      else
        [nil, v]
      end
    }.inspect
  end

  if odd?
    name = color(name, CYAN, true)
    sql  = color(sql, nil, true)
  else
    name = color(name, MAGENTA, true)
  end

  if !name.match(/.*ActiveRecord::SchemaMigration.*/) && name.match(/.*Load.\(.*ms\).*/)
    Rails::Log::Profiling.total_sql_time += event.duration.round(1)
    Rails::Log::Profiling.sqls << [ event.duration.round(1), " #{name}  #{sql}#{binds}\n #{locations}" ]
  end
end
ar_ver_5(event, locations) click to toggle source
# File lib/rails/log/profiling/query_log_subscriber.rb, line 21
def ar_ver_5(event, locations)
  payload = event.payload
  name  = "#{payload[:name]} (#{event.duration.round(1)}ms)"
  sql   = payload[:sql]
  binds = nil

  unless (payload[:binds] || []).empty?
    binds = "  " + payload[:binds].map { |attr| render_bind(attr) }.inspect
  end

  name = colorize_payload_name(name, payload[:name])
  sql  = color(sql, sql_color(sql), true)

  if !name.match(/.*ActiveRecord::SchemaMigration.*/) && name.match(/.*Load.\(.*ms\).*/)
    Rails::Log::Profiling.total_sql_time += event.duration.round(1)
    Rails::Log::Profiling.sqls << [ event.duration.round(1), " #{name}  #{sql}#{binds}\n#{locations}"]
  end
end
get_locations() click to toggle source

クエリの実行箇所を表示

# File lib/rails/log/profiling/query_log_subscriber.rb, line 70
def get_locations
  ans = ""
  temp = true
  caller.each do |val|
    if val.match(Rails::Log::Profiling.current_path)
      if Rails::Log::Profiling.continue_to_query_caller
        if temp
          ans += "  \033[36mIdentify Query Location:\033[0m\n"
          temp = false
        end
        ans += "    " + val + "\n"
      else
        ans += "  \033[36mIdentify Query Location:\033[0m\n"
        ans += "    " + val
        break
      end
    end
  end
  ans
end