larsklevan-after_commit 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -35,7 +35,7 @@ module AfterCommit
35
35
  def self.included(base)
36
36
  base.class_eval do
37
37
  def release_savepoint_with_callback
38
- increment_transaction_pointer
38
+ increment_transaction_nesting_level
39
39
  committed = false
40
40
  begin
41
41
  trigger_before_commit_callbacks
@@ -51,10 +51,14 @@ module AfterCommit
51
51
  trigger_after_commit_on_update_callbacks
52
52
  trigger_after_commit_on_destroy_callbacks
53
53
  rescue
54
- rollback_to_savepoint unless committed
54
+ unless committed
55
+ decrement_transaction_nesting_level
56
+ rollback_to_savepoint
57
+ increment_transaction_nesting_level
58
+ end
55
59
  ensure
56
60
  AfterCommit.cleanup(self)
57
- decrement_transaction_pointer
61
+ decrement_transaction_nesting_level
58
62
  end
59
63
  end
60
64
  alias_method_chain :release_savepoint, :callback
@@ -63,6 +67,7 @@ module AfterCommit
63
67
  # should recieve the after_commit callback, but do fire the after_rollback
64
68
  # callback for each record that failed to be committed.
65
69
  def rollback_to_savepoint_with_callback
70
+ increment_transaction_nesting_level
66
71
  begin
67
72
  trigger_before_rollback_callbacks
68
73
  rollback_to_savepoint_without_callback
@@ -70,6 +75,7 @@ module AfterCommit
70
75
  ensure
71
76
  AfterCommit.cleanup(self)
72
77
  end
78
+ decrement_transaction_nesting_level
73
79
  end
74
80
  alias_method_chain :rollback_to_savepoint, :callback
75
81
  end
@@ -8,7 +8,7 @@ module AfterCommit
8
8
  # or destroyed within this transaction now get their after_commit
9
9
  # callback fired.
10
10
  def commit_db_transaction_with_callback
11
- increment_transaction_pointer
11
+ increment_transaction_nesting_level
12
12
  committed = false
13
13
  result = nil
14
14
  begin
@@ -26,10 +26,18 @@ module AfterCommit
26
26
  trigger_after_commit_on_destroy_callbacks
27
27
  result
28
28
  rescue
29
- committed ? result : rollback_db_transaction
29
+ if committed
30
+ result
31
+ else
32
+ # Need to decrement the transaction nesting level before calling
33
+ # rollback... to ensure it is not incremented twice
34
+ decrement_transaction_nesting_level
35
+ rollback_db_transaction
36
+ increment_transaction_nesting_level
37
+ end
30
38
  ensure
31
39
  AfterCommit.cleanup(self)
32
- decrement_transaction_pointer
40
+ decrement_transaction_nesting_level
33
41
  end
34
42
  end
35
43
  alias_method_chain :commit_db_transaction, :callback
@@ -38,6 +46,7 @@ module AfterCommit
38
46
  # should recieve the after_commit callback, but do fire the after_rollback
39
47
  # callback for each record that failed to be committed.
40
48
  def rollback_db_transaction_with_callback
49
+ increment_transaction_nesting_level
41
50
  begin
42
51
  result = nil
43
52
  trigger_before_rollback_callbacks
@@ -47,15 +56,16 @@ module AfterCommit
47
56
  ensure
48
57
  AfterCommit.cleanup(self)
49
58
  end
59
+ decrement_transaction_nesting_level
50
60
  end
51
61
  alias_method_chain :rollback_db_transaction, :callback
52
-
53
- def unique_transaction_key
54
- [object_id, transaction_pointer]
62
+
63
+ def current_transaction_key
64
+ [object_id, transaction_nesting_level]
55
65
  end
56
-
57
- def old_transaction_key
58
- [object_id, transaction_pointer - 1]
66
+
67
+ def previous_transaction_key
68
+ [object_id, transaction_nesting_level - 1]
59
69
  end
60
70
 
61
71
  protected
@@ -153,18 +163,19 @@ module AfterCommit
153
163
  end
154
164
  end
155
165
 
156
- def transaction_pointer
157
- Thread.current[:after_commit_pointer] ||= 0
166
+
167
+ def transaction_nesting_level
168
+ Thread.current[:after_commit_transaction_nesting_level] ||= 0
158
169
  end
159
-
160
- def increment_transaction_pointer
161
- Thread.current[:after_commit_pointer] ||= 0
162
- Thread.current[:after_commit_pointer] += 1
170
+
171
+ def increment_transaction_nesting_level
172
+ Thread.current[:after_commit_transaction_nesting_level] ||= 0
173
+ Thread.current[:after_commit_transaction_nesting_level] += 1
163
174
  end
164
-
165
- def decrement_transaction_pointer
166
- Thread.current[:after_commit_pointer] ||= 0
167
- Thread.current[:after_commit_pointer] -= 1
175
+
176
+ def decrement_transaction_nesting_level
177
+ Thread.current[:after_commit_transaction_nesting_level] ||= 0
178
+ Thread.current[:after_commit_transaction_nesting_level] -= 1
168
179
  end
169
180
  end
170
181
  end
data/lib/after_commit.rb CHANGED
@@ -18,7 +18,7 @@ module AfterCommit
18
18
  prepare_collection :committed_records_on_destroy, connection
19
19
  add_to_collection :committed_records_on_destroy, connection, record
20
20
  end
21
-
21
+
22
22
  def self.records(connection)
23
23
  collection :committed_records, connection
24
24
  end
@@ -42,23 +42,23 @@ module AfterCommit
42
42
  :committed_records_on_update,
43
43
  :committed_records_on_destroy
44
44
  ].each do |collection|
45
- Thread.current[collection] ||= {}
46
- Thread.current[collection][connection.old_transaction_key] = []
45
+ Thread.current[collection] ||= {}
46
+ Thread.current[collection][connection.previous_transaction_key] = []
47
47
  end
48
48
  end
49
-
49
+
50
50
  def self.prepare_collection(collection, connection)
51
51
  Thread.current[collection] ||= {}
52
- Thread.current[collection][connection.unique_transaction_key] ||= []
52
+ Thread.current[collection][connection.current_transaction_key] ||= []
53
53
  end
54
-
54
+
55
55
  def self.add_to_collection(collection, connection, record)
56
- Thread.current[collection][connection.unique_transaction_key] << record
56
+ Thread.current[collection][connection.current_transaction_key] << record
57
57
  end
58
-
58
+
59
59
  def self.collection(collection, connection)
60
60
  Thread.current[collection] ||= {}
61
- Thread.current[collection][connection.old_transaction_key] ||= []
61
+ Thread.current[collection][connection.previous_transaction_key] ||= []
62
62
  end
63
63
  end
64
64
 
@@ -69,7 +69,7 @@ require 'after_commit/after_savepoint'
69
69
  ActiveRecord::Base.send(:include, AfterCommit::ActiveRecord)
70
70
  ActiveRecord::Base.include_after_commit_extensions
71
71
 
72
- if defined?(RAILS_ENV) && RAILS_ENV == 'test'
72
+ if defined?(RAILS_ENV) && %w(test cucumber).include?(RAILS_ENV)
73
73
  ActiveRecord::Base.send(:include, AfterCommit::AfterSavepoint)
74
74
  ActiveRecord::Base.include_after_savepoint_extensions
75
75
  end
@@ -60,7 +60,7 @@ class Bar < ActiveRecord::Base
60
60
  end
61
61
 
62
62
  class UnsavableRecord < ActiveRecord::Base
63
- attr_accessor :after_commit_called
63
+ attr_accessor :after_commit_called, :after_rollback_called
64
64
 
65
65
  set_table_name 'mock_records'
66
66
 
@@ -75,10 +75,14 @@ class UnsavableRecord < ActiveRecord::Base
75
75
  end
76
76
 
77
77
  after_commit :after_commit
78
-
79
78
  def after_commit
80
79
  self.after_commit_called = true
81
80
  end
81
+
82
+ after_rollback :after_rollback
83
+ def after_rollback
84
+ self.after_rollback_called = true
85
+ end
82
86
  end
83
87
 
84
88
  class AfterCommitTest < Test::Unit::TestCase
@@ -113,10 +117,22 @@ class AfterCommitTest < Test::Unit::TestCase
113
117
  def test_after_commit_does_not_trigger_when_transaction_rolls_back
114
118
  record = UnsavableRecord.new
115
119
  begin; record.save; rescue; end
116
-
120
+
121
+ # Ensure that commit of another transaction doesn't then trigger the
122
+ # after_commit hook on previously rolled back record
123
+ another_record = MockRecord.create!
124
+ another_record.save
125
+
117
126
  assert_equal false, record.after_commit_called
118
127
  end
119
-
128
+
129
+ def test_after_rollback_triggered_when_transaction_rolls_back
130
+ record = UnsavableRecord.new
131
+ begin; record.save; rescue; end
132
+
133
+ assert record.after_rollback_called
134
+ end
135
+
120
136
  def test_two_transactions_are_separate
121
137
  Bar.delete_all
122
138
  foo = Foo.create
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: larsklevan-after_commit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Muerdter
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2010-01-15 00:00:00 -06:00
15
+ date: 2010-01-19 00:00:00 -06:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency