Class: Isolator::ActiveSupportTransactionSubscriber::Subscriber

Inherits:
Isolator::ActiveSupportSubscriber::Subscriber show all
Defined in:
lib/isolator/orm_adapters/active_support_transaction_subscriber.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSubscriber

Returns a new instance of Subscriber.



9
10
11
# File 'lib/isolator/orm_adapters/active_support_transaction_subscriber.rb', line 9

def initialize
  @stacks = Hash.new { |h, k| h[k] = [] }
end

Instance Attribute Details

#stacksObject (readonly)

Returns the value of attribute stacks.



7
8
9
# File 'lib/isolator/orm_adapters/active_support_transaction_subscriber.rb', line 7

def stacks
  @stacks
end

Instance Method Details

#finish(event, id, payload) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/isolator/orm_adapters/active_support_transaction_subscriber.rb', line 31

def finish(event, id, payload)
  if event.start_with?("sql.")
    if start_event?(payload[:sql])
      connection_id = extract_connection_id(payload)

      stacks[connection_id] << :raw

      Isolator.incr_transactions!(connection_id)
    end

    if finish_event?(payload[:sql])
      connection_id = extract_connection_id(payload)

      # Decrement only if the transaction was started in the raw mode,
      # otherwise we should wait for the "transaction" event
      if stacks[connection_id].last == :raw
        stacks[connection_id].pop
        Isolator.decr_transactions!(connection_id)
      end
    end
  end

  if event.start_with?("transaction.")
    connection_id = extract_transaction_connection_id(payload)
    stacks[connection_id].pop

    Isolator.decr_transactions!(connection_id)
  end
end

#start(event, id, payload) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/isolator/orm_adapters/active_support_transaction_subscriber.rb', line 13

def start(event, id, payload)
  if event.start_with?("transaction.")
    connection_id = extract_transaction_connection_id(payload)

    # transaction.active_record can be issued without a query (when we restart the transaction),
    # so we should add a new one on the stack.
    # Example: https://github.com/rails/rails/blob/ce49fa9b31cd4a21d43db39d0cea364bce28b51d/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L337
    if stacks[connection_id].last == :raw
      # Update the type of the last transaction event
      stacks[connection_id].pop
      stacks[connection_id] << :transaction
    else
      stacks[connection_id] << :transaction
      Isolator.incr_transactions!(connection_id)
    end
  end
end