Class: ActiveRecord::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/promiscuous/publisher/operation/active_record.rb

Defined Under Namespace

Modules: PostgresSQL2PCExtensions Classes: PromiscousOperation, PromiscuousDeleteOperation, PromiscuousInsertOperation, PromiscuousTransaction, PromiscuousUpdateOperation

Class Method Summary collapse

Class Method Details

.connectionObject



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

.connection_without_promiscuousObject



45
# File 'lib/promiscuous/publisher/operation/active_record.rb', line 45

alias_method :connection_without_promiscuous, :connection