transactions for MSSQL over DBD::Sybase
Rafael Kitover [Fri, 6 Nov 2009 15:01:30 +0000 (15:01 +0000)]
lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm
t/74mssql.t

index 3d83020..7605080 100644 (file)
@@ -29,6 +29,24 @@ sub _init {
   $self->set_textsize;
 }
 
+sub _dbh_begin_work {
+  my $self = shift;
+
+  $self->_get_dbh->do('BEGIN TRAN');
+}
+
+sub _dbh_commit {
+  my $self = shift;
+
+  $self->_dbh->do('COMMIT');
+}
+
+sub _dbh_rollback {
+  my $self = shift;
+
+  $self->_dbh->do('ROLLBACK');
+}
+
 1;
 
 =head1 NAME
index 172c78d..007b9d3 100644 (file)
@@ -18,7 +18,7 @@ my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_${_}" } qw/DSN USER PASS/};
 plan skip_all => 'Set $ENV{DBICTEST_MSSQL_DSN}, _USER and _PASS to run this test'
   unless ($dsn);
 
-my $TESTS = 15;
+my $TESTS = 18;
 
 plan tests => $TESTS * 2;
 
@@ -145,15 +145,30 @@ SQL
     $rs->reset;
   } 'multiple active statements';
 
-  # test multiple active statements in a transaction
-  TODO: {
-    local $TODO = 'needs similar FreeTDS fixes to the ones in Sybase.pm';
-    lives_ok {
-      $schema->txn_do(sub {
-        $rs->create({ amount => 400 });
-      });
-    } 'simple transaction';
-  }
+  $rs->delete;
+
+  # test simple transaction with commit
+  lives_ok {
+    $schema->txn_do(sub {
+      $rs->create({ amount => 400 });
+    });
+  } 'simple transaction';
+
+  cmp_ok $rs->first->amount, '==', 400, 'committed';
+  $rs->reset;
+
+  $rs->delete;
+
+  # test rollback
+  throws_ok {
+    $schema->txn_do(sub {
+      $rs->create({ amount => 400 });
+      die 'mtfnpy';
+    });
+  } qr/mtfnpy/, 'simple failed txn';
+
+  is $rs->first, undef, 'rolled back';
+  $rs->reset;
 }
 
 # clean up our mess