larsklevan-after_commit 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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