class SqlTrace::Logger

Public Class Methods

start() click to toggle source
# File lib/sql_trace/logger.rb, line 4
def start
  if (sql_trace = ENV['SQL_TRACE'].to_i) > 0
    stack_size = sql_trace > 1 ? sql_trace : 5
    stack_root = Rails.root.to_s
    min_duration = ENV['SQL_TRACE_MIN_DURATION'].to_i

    match = if (raw_match = ENV['SQL_TRACE_MATCH']).present?
      raw_match.match(/^\/.*\/$/) ? Regexp.compile(raw_match[1..-2]) : Regexp.quote(raw_match)
    end

    if color = ENV['SQL_TRACE_COLOR']
      require 'colorize'
    end

    ActiveSupport::Notifications.subscribe("sql.active_record") do |n, s, e, i, payload|
      name = payload[:name]
      sql = payload[:sql]
      duration = ActiveSupport::Notifications::Event.new(n, s, e, i, payload).duration

      unless name.in?(%w{CACHE SCHEMA}) ||
          (min_duration > 0 && duration < min_duration) ||
          (match && !sql.match(match))
        stack = caller.select do |line|
          line.start_with?(stack_root)
        end[0..stack_size - 1].map do |line|
          line.sub("#{stack_root}/", '')
        end

        if stack.present?
          stack.each do |line|
            line = "  #{line}"
            line = line.send(color) if color

            puts line
          end && puts
        end
      end
    end
  end
end