ODBC fixes: superfluous connection in rebless; undef PK on first insert in MSSQL
Marc Mims [Tue, 12 Aug 2008 17:36:14 +0000 (17:36 +0000)]
Changes
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/ODBC.pm
lib/DBIx/Class/Storage/DBI/ODBC/Microsoft_SQL_Server.pm
t/746mssql.t

diff --git a/Changes b/Changes
index c7a1ae8..d00c6ed 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,4 +1,6 @@
 Revision history for DBIx::Class
+        - Fixed superfluous connection in ODBC::_rebless
+        - Fixed undef PK for first insert in ODBC::Microsoft_SQL_Server
 
 0.08099_04 2008-07-24 01:00:00
         - Functionality to storage to enable a sub to be run without FK checks
index 24f177c..806cef8 100644 (file)
@@ -1151,12 +1151,12 @@ sub insert {
   my $ident = $source->from; 
   my $bind_attributes = $self->source_bind_attributes($source);
 
+  $self->ensure_connected;
   foreach my $col ( $source->columns ) {
     if ( !defined $to_insert->{$col} ) {
       my $col_info = $source->column_info($col);
 
       if ( $col_info->{auto_nextval} ) {
-        $self->ensure_connected; 
         $to_insert->{$col} = $self->_sequence_fetch( 'nextval', $col_info->{sequence} || $self->_dbh_get_autoinc_seq($self->dbh, $source) );
       }
     }
index d7b4509..16e198e 100644 (file)
@@ -7,8 +7,7 @@ use base qw/DBIx::Class::Storage::DBI/;
 sub _rebless {
     my ($self) = @_;
 
-    my $dbh = $self->dbh;
-    my $dbtype = eval { $dbh->get_info(17) };
+    my $dbtype = eval { $self->_dbh->get_info(17) };
     unless ( $@ ) {
         # Translate the backend name into a perl identifier
         $dbtype =~ s/\W/_/gi;
index 1b0c5d8..3c18a3c 100644 (file)
@@ -14,14 +14,14 @@ sub _prep_for_execute {
     return ($sql, $bind);
 }
 
-sub insert {
-    my ($self, $source, $to_insert) = @_;
+sub _execute {
+    my $self = shift;
+    my ($op) = @_;
 
-    my $bind_attributes = $self->source_bind_attributes($source);
-    my (undef, $sth) = $self->_execute( 'insert' => [], $source, $bind_attributes, $to_insert);
-    $self->{_scope_identity} = $sth->fetchrow_array;
+    my ($rv, $sth, @bind) = $self->dbh_do($self->can('_dbh_execute'), @_);
+    $self->{_scope_identity} = $sth->fetchrow_array if $op eq 'insert';
 
-    return $to_insert;
+    return wantarray ? ($rv, $sth, @bind) : $rv;
 }
 
 sub last_insert_id { shift->{_scope_identity} }
@@ -74,8 +74,6 @@ onto each INSERT to accommodate that requirement.
 
 =head1 METHODS
 
-=head2 insert
-
 =head2 last_insert_id
 
 =head2 sqlt_type
index 52b5357..9d46eea 100644 (file)
@@ -17,7 +17,7 @@ my $schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
 $schema->storage->ensure_connected;
 isa_ok( $schema->storage, 'DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server' );
 
-my $dbh = $schema->storage->dbh;
+my $dbh = $schema->storage->_dbh;
 
 eval { $dbh->do("DROP TABLE artist") };
 
@@ -25,12 +25,15 @@ eval { $dbh->do("DROP TABLE artist") };
 CREATE TABLE artist (
    artistid INT IDENTITY NOT NULL,
    name VARCHAR(255),
-   charfield CHAR(10),
+   charfield CHAR(10) NULL,
    primary key(artistid)
 )
 
 my %seen_id;
 
+# fresh $schema so we start unconnected
+$schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
+
 # test primary key handling
 my $new = $schema->resultset('Artist')->create({ name => 'foo' });
 ok($new->artistid > 0, "Auto-PK worked");
@@ -58,6 +61,7 @@ is( $it->next, undef, "next past end of resultset ok" );
 
 # clean up our mess
 END {
+    $dbh = eval { $schema->storage->_dbh };
     $dbh->do('DROP TABLE artist') if $dbh;
 }