diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2008-09-04 12:17:56 +0200 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2008-09-04 12:17:56 +0200 |
commit | 045713ee240fff815edb5962b25d668512649478 (patch) | |
tree | f41146a3c1cc15f89946aca0e49fdf7d5bc84c54 | |
parent | 671bbd962e1a5430bd495329ef0d863dede01169 (diff) | |
download | rails-045713ee240fff815edb5962b25d668512649478.tar.gz rails-045713ee240fff815edb5962b25d668512649478.tar.bz2 rails-045713ee240fff815edb5962b25d668512649478.zip |
PostgreSQL: introduce transaction_active? rather than tracking activity ourselves
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 0c2532f21d..e95db1d9d8 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -518,6 +518,38 @@ module ActiveRecord execute "ROLLBACK" end + # ruby-pg defines Ruby constants for transaction status, + # ruby-postgres does not. + PQTRANS_IDLE = defined?(PGconn::PQTRANS_IDLE) ? PGconn::PQTRANS_IDLE : 0 + + # Check whether a transaction is active. + def transaction_active? + @connection.transaction_status != PQTRANS_IDLE + end + + # Wrap a block in a transaction. Returns result of block. + def transaction(start_db_transaction = true) + begin + if block_given? + begin_db_transaction if start_db_transaction + yield + end + rescue Exception => database_transaction_rollback + rollback_db_transaction if transaction_active? + raise unless database_transaction_rollback.is_a? ActiveRecord::Rollback + end + ensure + if transaction_active? + begin + commit_db_transaction + rescue Exception => database_transaction_rollback + rollback_db_transaction + raise + end + end + end + + # SCHEMA STATEMENTS ======================================== def recreate_database(name) #:nodoc: |