aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2008-09-04 12:17:56 +0200
committerJeremy Kemper <jeremy@bitsweat.net>2008-09-04 12:17:56 +0200
commit045713ee240fff815edb5962b25d668512649478 (patch)
treef41146a3c1cc15f89946aca0e49fdf7d5bc84c54 /activerecord/lib
parent671bbd962e1a5430bd495329ef0d863dede01169 (diff)
downloadrails-045713ee240fff815edb5962b25d668512649478.tar.gz
rails-045713ee240fff815edb5962b25d668512649478.tar.bz2
rails-045713ee240fff815edb5962b25d668512649478.zip
PostgreSQL: introduce transaction_active? rather than tracking activity ourselves
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb32
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: