Sha256: dcf2195d7c94c1ded621b6a942333d9764190e0f4af794e06be4279412d2a20f

Contents?: true

Size: 1.3 KB

Versions: 2

Compression:

Stored size: 1.3 KB

Contents

# frozen_string_literal: true

require "active_support/subscriber"

# Subscriber that is attached to ActiveRecord and will handle writing
# migration SQL to the output stream.
module CaptureMigrationSql
  class SqlSubscriber < ::ActiveSupport::Subscriber
    IGNORE_PAYLOAD_NAMES = ["SCHEMA", "EXPLAIN"]

    SHOW_STATEMENT = /\ASHOW\b/i
    EXPLAIN_STATEMENT = /\AEXPLAIN\b/i
    SELECT_SCHEMA_MIGRATIONS = /\ASELECT.*FROM.*schema_migrations/i
    SELECT_INFORMATION_SCHEMA = /\ASELECT.*information_schema/im
    SQLLITE_VERSION = /\ASELECT sqlite_version\(/i
    IGNORE_STATEMENTS = Regexp.union(SHOW_STATEMENT, EXPLAIN_STATEMENT, SELECT_SCHEMA_MIGRATIONS, SELECT_INFORMATION_SCHEMA, SQLLITE_VERSION)

    class << self
      def attach_if_necessary
        unless defined?(@attached) && @attached
          attach_to(:active_record)
          @attached = true
        end
      end
    end

    def sql(event)
      stream = CaptureMigrationSql.capture_stream
      return unless stream && CaptureMigrationSql.capture_enabled?

      payload = event.payload
      return if IGNORE_PAYLOAD_NAMES.include?(payload[:name])
      sql = payload[:sql]
      return if sql.nil? || IGNORE_STATEMENTS.match(sql)

      sql = sql.strip
      sql = "#{sql};" unless sql.end_with?(";")
      stream.write("#{sql}\n\n")
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
capture_migration_sql-1.0.4 lib/capture_migration_sql/sql_subscriber.rb
capture_migration_sql-1.0.3 lib/capture_migration_sql/sql_subscriber.rb