Sha256: b73cd92725af904ea5bebbe034dc44775a5f8b936561ef752a90a117a34b45f4

Contents?: true

Size: 1.6 KB

Versions: 18

Compression:

Stored size: 1.6 KB

Contents

require "sql_lexer"
require "json"

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

      CAT = "db.sql.query".freeze

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

        binds = payload[:binds]

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

        extracted_title, sql, binds, error = extract_binds(payload, binds)
        title = extracted_title if extracted_title

        if sql
          annotations = {
            sql:   sql,
            binds: binds,
          }
        else
          annotations = {
            skylight_error: error
          }
        end

        [ name, title, sql, annotations ]
      end

    private
      def extract_binds(payload, precalculated)
        title, sql, binds = SqlLexer::Lexer.bindify(payload[:sql], precalculated)
        [ title, sql, binds, nil ]
      rescue
        error = ["sql_parse", encode(payload[:sql]), encode(payload: payload, precalculated: precalculated)]
        [ nil, nil, nil, error ]
      end

      def encode(body)
        if body.is_a?(Hash)
          body.each{|k,v| body[k] = encode(v) }
        elsif body.is_a?(Array)
          body.each_with_index{|v,i| body[i] = encode(v) }
        elsif body.respond_to?(:encoding) && (body.encoding == Encoding::BINARY || !body.valid_encoding?)
          Base64.encode64(body)
        else
          body
        end
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
skylight-0.3.11 lib/skylight/normalizers/sql.rb
skylight-0.3.10 lib/skylight/normalizers/sql.rb
skylight-0.3.8 lib/skylight/normalizers/sql.rb
skylight-0.3.7 lib/skylight/normalizers/sql.rb
skylight-0.3.6 lib/skylight/normalizers/sql.rb
skylight-0.3.3 lib/skylight/normalizers/sql.rb
skylight-0.3.2 lib/skylight/normalizers/sql.rb
skylight-0.3.1 lib/skylight/normalizers/sql.rb
skylight-0.3.0 lib/skylight/normalizers/sql.rb
skylight-0.2.7 lib/skylight/normalizers/sql.rb
skylight-0.2.6 lib/skylight/normalizers/sql.rb
skylight-0.3.0.rc.6 lib/skylight/normalizers/sql.rb
skylight-0.2.5 lib/skylight/normalizers/sql.rb
skylight-0.2.4 lib/skylight/normalizers/sql.rb
skylight-0.3.0.rc.5 lib/skylight/normalizers/sql.rb
skylight-0.3.0.rc.4 lib/skylight/normalizers/sql.rb
skylight-0.3.0.rc.3 lib/skylight/normalizers/sql.rb
skylight-0.2.3 lib/skylight/normalizers/sql.rb