module QueryReviewer::MysqlAdapterExtensions

Public Class Methods

included(base) click to toggle source
# File lib/query_reviewer/mysql_adapter_extensions.rb, line 3
def self.included(base)
  base.alias_method_chain :select, :review
  base.alias_method_chain :update, :review
  base.alias_method_chain :insert, :review
  base.alias_method_chain :delete, :review
end

Public Instance Methods

create_or_add_query_to_query_reviewer!(sql, cols, run_time, profile, command = "SELECT", affected_rows = 1) click to toggle source
# File lib/query_reviewer/mysql_adapter_extensions.rb, line 90
def create_or_add_query_to_query_reviewer!(sql, cols, run_time, profile, command = "SELECT", affected_rows = 1)
  if query_reviewer_enabled?
    t1 = Time.now
    Thread.current["queries"].find_or_create_sql_query(sql, cols, run_time, profile, command, affected_rows)
    t2 = Time.now
    Thread.current["queries"].overhead_time += t2 - t1
  end
end
delete_with_review(sql, *args) click to toggle source
# File lib/query_reviewer/mysql_adapter_extensions.rb, line 37
def delete_with_review(sql, *args)
  t1 = Time.now
  result = delete_without_review(sql, *args)
  t2 = Time.now

  create_or_add_query_to_query_reviewer!(sql, nil, t2 - t1, nil, "DELETE", result)

  result
end
insert_with_review(arg1, *otherargs) click to toggle source
# File lib/query_reviewer/mysql_adapter_extensions.rb, line 20
def insert_with_review(arg1, *otherargs)
  # arg1 is sql for rails 3.0 & 3.1, arel for newer versions

  rails30 = Rails::VERSION::MAJOR == 3 && [0,1].include?(Rails::VERSION::MINOR)
  sql = arg1 if rails30
  bind_params = otherargs[4] || [] unless rails30

  t1 = Time.now
  result = insert_without_review(arg1, *otherargs)
  t2 = Time.now

  sql = to_sql(arg1, bind_params) unless rails30
  create_or_add_query_to_query_reviewer!(sql, nil, t2 - t1, nil, "INSERT")

  result
end
query_reviewer_enabled?() click to toggle source
# File lib/query_reviewer/mysql_adapter_extensions.rb, line 86
def query_reviewer_enabled?
  Thread.current["queries"] && Thread.current["queries"].respond_to?(:find_or_create_sql_query) && Thread.current["query_reviewer_enabled"]
end
select_with_review(sql, *args) click to toggle source
# File lib/query_reviewer/mysql_adapter_extensions.rb, line 47
def select_with_review(sql, *args)
  return select_without_review(sql, *args) unless query_reviewer_enabled?

  sql.gsub!(/^SELECT /i, "SELECT SQL_NO_CACHE ") if QueryReviewer::CONFIGURATION["disable_sql_cache"]
  QueryReviewer.safe_log { execute("SET PROFILING=1") } if QueryReviewer::CONFIGURATION["profiling"]
  t1 = Time.now
  query_results = select_without_review(sql, *args)
  t2 = Time.now

  if @logger && query_reviewer_enabled? && sql =~ /^select/i
    use_profiling = QueryReviewer::CONFIGURATION["profiling"]
    use_profiling &&= (t2 - t1) >= QueryReviewer::CONFIGURATION["warn_duration_threshold"].to_f / 2.0 if QueryReviewer::CONFIGURATION["production_data"]

    if use_profiling
      t5 = Time.now
      QueryReviewer.safe_log { execute("SET PROFILING=1") }
      t3 = Time.now
      select_without_review(sql, *args)
      t4 = Time.now
      profile = QueryReviewer.safe_log { select_without_review("SHOW PROFILE ALL", *args) }
      QueryReviewer.safe_log { execute("SET PROFILING=0") }
      t6 = Time.now
      Thread.current["queries"].overhead_time += t6 - t5
    else
      profile = nil
    end

    cols = QueryReviewer.safe_log do
      select_without_review("explain #{sql}", *args)
    end

    duration = t3 ? [t2 - t1, t4 - t3].min : t2 - t1
    create_or_add_query_to_query_reviewer!(sql, cols, duration, profile)

    #@logger.debug(format_log_entry("Analyzing #{name}\n", query.to_table)) if @logger.level <= Logger::INFO
  end
  query_results
end
update_with_review(sql, *args) click to toggle source
# File lib/query_reviewer/mysql_adapter_extensions.rb, line 10
def update_with_review(sql, *args)
  t1 = Time.now
  result = update_without_review(sql, *args)
  t2 = Time.now

  create_or_add_query_to_query_reviewer!(sql, nil, t2 - t1, nil, "UPDATE", result)

  result
end