Class: Rack::PactBroker::DatabaseTransaction
- Inherits:
-
Object
- Object
- Rack::PactBroker::DatabaseTransaction
- Defined in:
- lib/rack/pact_broker/database_transaction.rb
Constant Summary collapse
- REQUEST_METHOD =
"REQUEST_METHOD".freeze
- TRANS_METHODS =
%w{POST PUT PATCH DELETE}.freeze
Instance Method Summary collapse
- #call(env) ⇒ Object
- #call_with_transaction(env) ⇒ Object
- #call_without_transaction(env) ⇒ Object
- #clear_database_connector ⇒ Object
- #do_not_rollback?(response) ⇒ Boolean
-
#initialize(app, database_connection) ⇒ DatabaseTransaction
constructor
A new instance of DatabaseTransaction.
- #set_database_connector ⇒ Object
- #use_transaction?(env) ⇒ Boolean
Constructor Details
#initialize(app, database_connection) ⇒ DatabaseTransaction
Returns a new instance of DatabaseTransaction.
12 13 14 15 16 17 18 19 20 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 12 def initialize app, database_connection @app = app @database_connection = database_connection @default_database_connector = ->(&block) { database_connection.synchronize do block.call end } end |
Instance Method Details
#call(env) ⇒ Object
22 23 24 25 26 27 28 29 30 31 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 22 def call env set_database_connector if use_transaction? env call_with_transaction env else call_without_transaction env end ensure clear_database_connector end |
#call_with_transaction(env) ⇒ Object
41 42 43 44 45 46 47 48 49 50 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 41 def call_with_transaction env response = nil @database_connection.transaction do response = @app.call(env) if response.first == 500 raise Sequel::Rollback unless do_not_rollback?(response) end end response end |
#call_without_transaction(env) ⇒ Object
37 38 39 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 37 def call_without_transaction env @app.call(env) end |
#clear_database_connector ⇒ Object
61 62 63 64 65 66 67 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 61 def clear_database_connector if thread_data = Thread.current[:pact_broker_thread_data] if thread_data.database_connector == @default_database_connector thread_data.database_connector = nil end end end |
#do_not_rollback?(response) ⇒ Boolean
52 53 54 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 52 def do_not_rollback? response response[1].delete(::PactBroker::DO_NOT_ROLLBACK) end |
#set_database_connector ⇒ Object
56 57 58 59 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 56 def set_database_connector Thread.current[:pact_broker_thread_data] ||= OpenStruct.new Thread.current[:pact_broker_thread_data].database_connector ||= @default_database_connector end |
#use_transaction?(env) ⇒ Boolean
33 34 35 |
# File 'lib/rack/pact_broker/database_transaction.rb', line 33 def use_transaction? env TRANS_METHODS.include? env[REQUEST_METHOD] end |