Sha256: 53840cae6eabded508ce8cacf961a536954f9a7716f3edc54f3daaac83e5e704

Contents?: true

Size: 1.73 KB

Versions: 8

Compression:

Stored size: 1.73 KB

Contents

require "sql_lexer"
require "json"

module Skylight
  module Normalizers
    module ActiveRecord
      class SQL < Normalizer
        register "sql.active_record"
        register "sql.sequel"
        register "sql.data_mapper"

        CAT = "db.sql.query".freeze

        def normalize(trace, name, payload)
          case payload[:name]
          when "SCHEMA".freeze, "CACHE".freeze
            return :skip
          else
            name  = CAT
            title = payload[:name] || "SQL".freeze
          end

          binds = payload[:binds]

          if binds && !binds.empty?
            binds = binds.map { |col, val| val.inspect }
          end

          begin
            extracted_title, sql = extract_binds(payload, binds)
            [ name, extracted_title || title, sql ]
          rescue => e
            # FIXME: Rust errors get written to STDERR and don't come through here
            if config[:log_sql_parse_errors]
              config.logger.warn "failed to extract binds in SQL; sql=#{payload[:sql].inspect}; exception=#{e.inspect}"
            end
            [ name, title, nil ]
          end
        end

        private

        def extract_binds(payload, precalculated)
          case config[:sql_mode]
          when 'rust'.freeze
            extract_rust(payload)
          when 'ruby'.freeze
            extract_ruby(payload, precalculated)
          else
            raise "Unrecognized sql_mode: #{config.sql_mode}"
          end
        end

        def extract_rust(payload)
          Skylight.lex_sql(payload[:sql])
        end

        def extract_ruby(payload, precalculated)
          name, title, _ = SqlLexer::Lexer.bindify(payload[:sql], precalculated, true)
          [ name, title ]
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
skylight-0.10.6 lib/skylight/normalizers/active_record/sql.rb
skylight-0.10.5 lib/skylight/normalizers/active_record/sql.rb
skylight-0.10.4 lib/skylight/normalizers/active_record/sql.rb
skylight-1.0.0.beta4 lib/skylight/normalizers/active_record/sql.rb
skylight-1.0.0.beta3 lib/skylight/normalizers/active_record/sql.rb
skylight-0.10.3 lib/skylight/normalizers/active_record/sql.rb
skylight-0.10.2 lib/skylight/normalizers/active_record/sql.rb
skylight-1.0.0.beta2 lib/skylight/normalizers/active_record/sql.rb