From 0355962c277e8fe696f5568037b5804d014cb1fe Mon Sep 17 00:00:00 2001
From: wangjohn <wangjohn@mit.edu>
Date: Sun, 20 Jan 2013 12:40:36 -0500
Subject: Created state for a transaction and added tests.

---
 .../connection_adapters/abstract/transaction.rb    | 12 +++++++++++
 activerecord/lib/active_record/core.rb             | 24 ++++++++++++----------
 activerecord/test/cases/transactions_test.rb       | 20 ++++++++++++++++++
 3 files changed, 45 insertions(+), 11 deletions(-)

(limited to 'activerecord')

diff --git a/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb b/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb
index 4cca94e40b..2b8026dbf9 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb
@@ -5,7 +5,17 @@ module ActiveRecord
 
       def initialize(connection)
         @connection = connection
+        @state = nil
       end
+
+      def committed?
+        @state == :commit
+      end
+
+      def rolledback?
+        @state == :rollback
+      end
+
     end
 
     class ClosedTransaction < Transaction #:nodoc:
@@ -91,6 +101,7 @@ module ActiveRecord
       end
 
       def rollback_records
+        @state = :rollback
         records.uniq.each do |record|
           begin
             record.rolledback!(parent.closed?)
@@ -101,6 +112,7 @@ module ActiveRecord
       end
 
       def commit_records
+        @state = :commit
         records.uniq.each do |record|
           begin
             record.committed!
diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb
index 94c6684700..8a54cebfcf 100644
--- a/activerecord/lib/active_record/core.rb
+++ b/activerecord/lib/active_record/core.rb
@@ -365,17 +365,19 @@ module ActiveRecord
       pk = self.class.primary_key
       @attributes[pk] = nil unless @attributes.key?(pk)
 
-      @aggregation_cache       = {}
-      @association_cache       = {}
-      @attributes_cache        = {}
-      @previously_changed      = {}
-      @changed_attributes      = {}
-      @readonly                = false
-      @destroyed               = false
-      @marked_for_destruction  = false
-      @new_record              = true
-      @txn                     = nil
-      @_start_transaction_state = {}
+      @aggregation_cache          = {}
+      @association_cache          = {}
+      @attributes_cache           = {}
+      @previously_changed         = {}
+      @changed_attributes         = {}
+      @readonly                   = false
+      @destroyed                  = false
+      @marked_for_destruction     = false
+      @new_record                 = true
+      @txn                        = nil
+      @_start_transaction_state   = {}
+      @transaction                = nil
+      @reflects_transaction_state = false
     end
   end
 end
diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb
index bcbc48b38a..9d278480ef 100644
--- a/activerecord/test/cases/transactions_test.rb
+++ b/activerecord/test/cases/transactions_test.rb
@@ -451,6 +451,26 @@ class TransactionTest < ActiveRecord::TestCase
     end
   end
 
+  def test_transactions_state_from_rollback
+    connection = Topic.connection
+    transaction = ActiveRecord::ConnectionAdapters::ClosedTransaction.new(connection).begin
+
+    assert transaction.open?
+    transaction.perform_rollback
+    
+    assert transaction.rolledback?
+  end
+
+  def test_transactions_state_from_commit
+    connection = Topic.connection
+    transaction = ActiveRecord::ConnectionAdapters::ClosedTransaction.new(connection).begin
+
+    assert transaction.open?
+    transaction.perform_commit
+    
+    assert transaction.committed?
+  end
+
   private
 
   %w(validation save destroy).each do |filter|
-- 
cgit v1.2.3