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.
- data/lib/after_commit/after_savepoint.rb +9 -3
- data/lib/after_commit/connection_adapters.rb +30 -19
- data/lib/after_commit.rb +10 -10
- data/test/after_commit_test.rb +20 -4
- metadata +2 -2
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
54
|
-
[object_id,
|
62
|
+
|
63
|
+
def current_transaction_key
|
64
|
+
[object_id, transaction_nesting_level]
|
55
65
|
end
|
56
|
-
|
57
|
-
def
|
58
|
-
[object_id,
|
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
|
-
|
157
|
-
|
166
|
+
|
167
|
+
def transaction_nesting_level
|
168
|
+
Thread.current[:after_commit_transaction_nesting_level] ||= 0
|
158
169
|
end
|
159
|
-
|
160
|
-
def
|
161
|
-
Thread.current[:
|
162
|
-
Thread.current[:
|
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
|
166
|
-
Thread.current[:
|
167
|
-
Thread.current[:
|
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.
|
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.
|
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.
|
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.
|
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
|
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
|
data/test/after_commit_test.rb
CHANGED
@@ -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.
|
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
|
+
date: 2010-01-19 00:00:00 -06:00
|
16
16
|
default_executable:
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|