lib/isolator/orm_adapters/active_support_subscriber.rb



# frozen_string_literal: true

module Isolator
  # ActiveSupport notifications listener
  # Used for ActiveRecord and ROM::SQL (when instrumentation is available)
  module ActiveSupportSubscriber
    START_PATTERN = %r{(\ABEGIN|\ASAVEPOINT)}xi
    FINISH_PATTERN = %r{(\ACOMMIT|\AROLLBACK|\ARELEASE|\AEND TRANSACTION)}xi

    def self.subscribe!(event)
      ::ActiveSupport::Notifications.subscribe(event) do |_name, _start, _finish, _id, query|
        Isolator.incr_transactions! if query[:sql] =~ START_PATTERN
        Isolator.decr_transactions! if query[:sql] =~ FINISH_PATTERN
      end
    end
  end
end