47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# File 'lib/promiscuous/publisher/operation/active_record.rb', line 47
def connection
connection_without_promiscuous.tap do |connection|
unless defined?(connection.promiscuous_hook)
connection.class.class_eval do
attr_accessor :current_transaction_id
if self.name == "ActiveRecord::ConnectionAdapters::PostgreSQLAdapter"
include ActiveRecord::Base::PostgresSQL2PCExtensions
end
def promiscuous_hook; end
alias_method :begin_db_transaction_without_promiscuous, :begin_db_transaction
alias_method :create_savepoint_without_promiscuous, :create_savepoint
alias_method :rollback_db_transaction_without_promiscuous, :rollback_db_transaction
alias_method :rollback_to_savepoint_without_promiscuous, :rollback_to_savepoint
alias_method :commit_db_transaction_without_promiscuous, :commit_db_transaction
alias_method :release_savepoint_without_promiscuous, :release_savepoint
def with_promiscuous_transaction_context(&block)
block.call(Promiscuous::Publisher::Context.current.transaction_context_of(:active_record))
end
def begin_db_transaction
@current_transaction_id = SecureRandom.uuid
begin_db_transaction_without_promiscuous
with_promiscuous_transaction_context { |tx| tx.start }
end
def create_savepoint
create_savepoint_without_promiscuous
with_promiscuous_transaction_context { |tx| tx.start }
end
def rollback_db_transaction
with_promiscuous_transaction_context { |tx| tx.rollback }
rollback_db_transaction_without_promiscuous
@current_transaction_id = nil
end
def rollback_to_savepoint
with_promiscuous_transaction_context { |tx| tx.rollback }
rollback_to_savepoint_without_promiscuous
end
def commit_db_transaction
ops = with_promiscuous_transaction_context { |tx| tx.write_operations_to_commit }
PromiscuousTransaction.new(:connection => self,
:transaction_id => self.current_transaction_id,
:transaction_operations => ops).execute do
commit_db_transaction_without_promiscuous
end
with_promiscuous_transaction_context { |tx| tx.commit }
@current_transaction_id = nil
end
def release_savepoint
release_savepoint_without_promiscuous
with_promiscuous_transaction_context { |tx| tx.commit }
end
alias_method :insert_without_promiscuous, :insert
alias_method :update_without_promiscuous, :update
alias_method :delete_without_promiscuous, :delete
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
PromiscuousInsertOperation.new(arel, name, pk, id_value, sequence_name, binds, :connection => self).execute do
insert_without_promiscuous(arel, name, pk, id_value, sequence_name, binds)
end
end
def update(arel, name = nil, binds = [])
PromiscuousUpdateOperation.new(arel, name, binds, :connection => self).execute do
update_without_promiscuous(arel, name, binds)
end
end
def delete(arel, name = nil, binds = [])
PromiscuousDeleteOperation.new(arel, name, binds, :connection => self).execute do
delete_without_promiscuous(arel, name, binds)
end
end
end
end
end
end
|