Module: Foobara::NestedTransactionable
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Concern
foobara_class_methods_module_for, foobara_concern?, included
Class Method Details
.relevant_entity_classes_for_type(type) ⇒ Object
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 6
def relevant_entity_classes_for_type(type)
entity_classes = []
entity_classes += Entity.construct_associations(type).values.map(&:target_class)
if type.extends?(BuiltinTypes[:entity])
entity_classes << type.target_class
end
entity_classes.uniq.each do |entity_class|
entity_classes += entity_class.deep_associations.values.map(&:target_class)
end
entity_classes.uniq
end
|
Instance Method Details
#auto_detect_current_transactions ⇒ Object
40
41
42
43
44
45
46
47
48
49
50
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 40
def auto_detect_current_transactions
classes = relevant_entity_classes
return if classes.nil? || classes.empty?
bases = classes.map(&:entity_base).uniq
bases.each do |base|
tx = base.current_transaction
transactions << tx if tx
end
end
|
#commit_transaction ⇒ Object
79
80
81
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 79
def commit_transaction
opened_transactions.reverse.each(&:commit!)
end
|
#commit_transaction_if_open ⇒ Object
83
84
85
86
87
88
89
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 83
def commit_transaction_if_open
opened_transactions.reverse.each do |tx|
if tx.currently_open?
tx.commit!
end
end
end
|
#open_transaction ⇒ Object
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 52
def open_transaction
auto_detect_current_transactions
bases_not_needing_transaction = transactions.map(&:entity_base)
bases_needing_transaction = relevant_entity_classes.map(&:entity_base).uniq - bases_not_needing_transaction
bases_needing_transaction.each do |entity_base|
transaction = entity_base.transaction
transaction.open!
opened_transactions << transaction
transactions << transaction
end
end
|
#opened_transactions ⇒ Object
36
37
38
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 36
def opened_transactions
@opened_transactions ||= []
end
|
#relevant_entity_classes ⇒ Object
26
27
28
29
30
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 26
def relevant_entity_classes
raise "subclass responsibility"
end
|
#relevant_entity_classes_for_type(type) ⇒ Object
#rollback_transaction ⇒ Object
67
68
69
70
71
72
73
74
75
76
77
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 67
def rollback_transaction
opened_transactions.reverse.each do |transaction|
if transaction.currently_open?
transaction.rollback!
end
end
end
|
#transactions ⇒ Object
32
33
34
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 32
def transactions
@transactions ||= []
end
|
#use_transaction ⇒ Object
91
92
93
|
# File 'foobara-0.0.125/projects/nested_transactionable/lib/foobara/nested_transactionable.rb', line 91
def use_transaction(&)
Persistence::EntityBase.using_transactions(transactions, &)
end
|