class RailsSemanticLogger::ActiveRecord::LogSubscriber

Constants

IGNORE_PAYLOAD_NAMES

Attributes

logger[R]

Public Class Methods

reset_runtime() click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 18
def self.reset_runtime
  rt           = runtime
  self.runtime = 0
  rt
end
runtime() click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 14
def self.runtime
  ::ActiveRecord::RuntimeRegistry.sql_runtime ||= 0
end
runtime=(value) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 10
def self.runtime=(value)
  ::ActiveRecord::RuntimeRegistry.sql_runtime = value
end

Public Instance Methods

sql(event) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 24
def sql(event)
  self.class.runtime += event.duration
  return unless logger.debug?

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

  log_payload         = {sql: payload[:sql]}
  log_payload[:binds] = bind_values(payload) unless (payload[:binds] || []).empty?
  log_payload[:allocations] = event.allocations if event.respond_to?(:allocations)
  log_payload[:cached] = event.payload[:cached]

  log = {
    message:  name,
    payload:  log_payload,
    duration: event.duration
  }

  # Log the location of the query itself.
  if logger.send(:level_index) >= SemanticLogger.backtrace_level_index
    log[:backtrace] = SemanticLogger::Utils.strip_backtrace(caller)
  end

  logger.debug(log)
end

Private Instance Methods

add_bind_value(binds, key, value) click to toggle source

When multiple values are received for a single bound field, it is converted into an array

# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 56
def add_bind_value(binds, key, value)
  key        = key.downcase.to_sym unless key.nil?
  value      = (Array(binds[key]) << value) if binds.key?(key)
  binds[key] = value
end
bind_values(payload)
Alias for: bind_values_v5_0_0
bind_values_v3(payload) click to toggle source

Rails 3,4,5 hell trying to get the bind values

# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 70
def bind_values_v3(payload)
  binds = {}
  payload[:binds].each do |col, v|
    if col
      add_bind_value(binds, col.name, v)
    else
      binds[nil] = v
    end
  end
  binds
end
Also aliased as: bind_values
bind_values_v4(payload) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 82
def bind_values_v4(payload)
  binds = {}
  payload[:binds].each do |col, v|
    attr_name, value = render_bind(col, v)
    add_bind_value(binds, attr_name, value)
  end
  binds
end
Also aliased as: bind_values
bind_values_v5_0_0(payload) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 91
def bind_values_v5_0_0(payload)
  binds = {}
  payload[:binds].each do |attr|
    attr_name, value = render_bind(attr)
    add_bind_value(binds, attr_name, value)
  end
  binds
end
Also aliased as: bind_values
bind_values_v5_0_3(payload) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 100
def bind_values_v5_0_3(payload)
  binds         = {}
  casted_params = type_casted_binds(payload[:binds], payload[:type_casted_binds])
  payload[:binds].zip(casted_params).map do |attr, value|
    attr_name, value = render_bind(attr, value)
    add_bind_value(binds, attr_name, value)
  end
  binds
end
Also aliased as: bind_values
bind_values_v5_1_5(payload) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 110
def bind_values_v5_1_5(payload)
  binds         = {}
  casted_params = type_casted_binds(payload[:type_casted_binds])
  payload[:binds].zip(casted_params).map do |attr, value|
    attr_name, value = render_bind(attr, value)
    add_bind_value(binds, attr_name, value)
  end
  binds
end
Also aliased as: bind_values
bind_values_v6_1(payload) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 120
def bind_values_v6_1(payload)
  binds         = {}
  casted_params = type_casted_binds(payload[:type_casted_binds])
  payload[:binds].each_with_index do |attr, i|
    attr_name, value = render_bind(attr, casted_params[i])
    add_bind_value(binds, attr_name, value)
  end
  binds
end
Also aliased as: bind_values
logger() click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 62
def logger
  self.class.logger
end
render_bind(attribute)
Alias for: render_bind_v5_0_0
render_bind_v4_2(column, value) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 130
def render_bind_v4_2(column, value)
  if column
    if column.binary?
      # This specifically deals with the PG adapter that casts bytea columns into a Hash.
      value = value[:value] if value.is_a?(Hash)
      value = value ? "<#{value.bytesize} bytes of binary data>" : "<NULL binary data>"
    end

    [column.name, value]
  else
    [nil, value]
  end
end
Also aliased as: render_bind
render_bind_v5_0_0(attribute) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 144
def render_bind_v5_0_0(attribute)
  value =
    if attribute.type.binary? && attribute.value
      if attribute.value.is_a?(Hash)
        "<#{attribute.value_for_database.to_s.bytesize} bytes of binary data>"
      else
        "<#{attribute.value.bytesize} bytes of binary data>"
      end
    else
      attribute.value_for_database
    end

  [attribute.name, value]
end
Also aliased as: render_bind
render_bind_v5_0_3(attr, value) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 159
def render_bind_v5_0_3(attr, value)
  if attr.is_a?(Array)
    attr = attr.first
  elsif attr.type.binary? && attr.value
    value = "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
  end

  [attr&.name, value]
end
Also aliased as: render_bind, render_bind
render_bind_v6_1(attr, value) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 169
def render_bind_v6_1(attr, value)
  case attr
  when ActiveModel::Attribute
    value = "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>" if attr.type.binary? && attr.value
  when Array
    attr = attr.first
  else
    attr = nil
  end

  [attr&.name || :nil, value]
end
Also aliased as: render_bind
type_casted_binds(binds, casted_binds)
type_casted_binds_v5_0_3(binds, casted_binds) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 182
def type_casted_binds_v5_0_3(binds, casted_binds)
  casted_binds || ::ActiveRecord::Base.connection.type_casted_binds(binds)
end
Also aliased as: type_casted_binds
type_casted_binds_v5_1_5(casted_binds) click to toggle source
# File lib/rails_semantic_logger/active_record/log_subscriber.rb, line 186
def type_casted_binds_v5_1_5(casted_binds)
  casted_binds.respond_to?(:call) ? casted_binds.call : casted_binds
end
Also aliased as: type_casted_binds, type_casted_binds