X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FMSSQL.pm;h=b0da553b425e993b98fda0eb16dbe7939cce6d3c;hb=67e894d2d14f9c10f363646c567cd465cb4b1f6f;hp=37733f686f82d0c555542ca254a5f80495d0bed3;hpb=ca791b95e618ab76bddbaf58441e3d6873336850;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Storage/DBI/MSSQL.pm b/lib/DBIx/Class/Storage/DBI/MSSQL.pm index 37733f6..b0da553 100644 --- a/lib/DBIx/Class/Storage/DBI/MSSQL.pm +++ b/lib/DBIx/Class/Storage/DBI/MSSQL.pm @@ -30,17 +30,19 @@ sub insert_bulk { if ($identity_insert) { my $table = $source->from; - $self->dbh->do("SET IDENTITY_INSERT $table ON"); + $self->_get_dbh->do("SET IDENTITY_INSERT $table ON"); } $self->next::method(@_); if ($identity_insert) { my $table = $source->from; - $self->dbh->do("SET IDENTITY_INSERT $table OFF"); + $self->_get_dbh->do("SET IDENTITY_INSERT $table OFF"); } } +# support MSSQL GUID column types + sub insert { my $self = shift; my ($source, $to_insert) = @_; @@ -66,7 +68,7 @@ sub insert { grep { not exists $to_insert->{$_} } (@pk_guids, @auto_guids); for my $guid_col (@get_guids_for) { - my ($new_guid) = $self->dbh->selectrow_array('SELECT NEWID()'); + my ($new_guid) = $self->_get_dbh->selectrow_array('SELECT NEWID()'); $updated_cols->{$guid_col} = $to_insert->{$guid_col} = $new_guid; } @@ -82,10 +84,10 @@ sub _prep_for_execute { # cast MONEY values properly if ($op eq 'insert' || $op eq 'update') { my $fields = $args->[0]; - my $col_info = $self->_resolve_column_info($ident, [keys %$fields]); for my $col (keys %$fields) { - if ($col_info->{$col}{data_type} =~ /^money\z/i) { + # $ident is a result source object with INSERT/UPDATE ops + if ($ident->column_info ($col)->{data_type} =~ /^money\z/i) { my $val = $fields->{$col}; $fields->{$col} = \['CAST(? AS MONEY)', [ $col => $val ]]; } @@ -115,24 +117,25 @@ sub _execute { my ($op) = @_; my ($rv, $sth, @bind) = $self->dbh_do($self->can('_dbh_execute'), @_); + if ($op eq 'insert') { - $self->_identity($self->_fetch_identity($sth)); - } - return wantarray ? ($rv, $sth, @bind) : $rv; -} + # this should bring back the result of SELECT SCOPE_IDENTITY() we tacked + # on in _prep_for_execute above + my ($identity) = $sth->fetchrow_array; -sub _fetch_identity { - my ($self, $sth) = @_; - my ($identity) = $sth->fetchrow_array; - $sth->finish; + # SCOPE_IDENTITY failed, but we can do something else + if ( (! $identity) && $self->_identity_method) { + ($identity) = $self->_dbh->selectrow_array( + 'select ' . $self->_identity_method + ); + } - if ((not defined $identity) && $self->_identity_method && - $self->_identity_method eq '@@identity') { - ($identity) = $self->_dbh->selectrow_array('select @@identity'); + $self->_identity($identity); + $sth->finish; } - return $identity; + return wantarray ? ($rv, $sth, @bind) : $rv; } sub last_insert_id { shift->_identity } @@ -142,7 +145,7 @@ sub last_insert_id { shift->_identity } sub _svp_begin { my ($self, $name) = @_; - $self->dbh->do("SAVE TRANSACTION $name"); + $self->_get_dbh->do("SAVE TRANSACTION $name"); } # A new SAVE TRANSACTION with the same name releases the previous one. @@ -151,7 +154,7 @@ sub _svp_release { 1 } sub _svp_rollback { my ($self, $name) = @_; - $self->dbh->do("ROLLBACK TRANSACTION $name"); + $self->_get_dbh->do("ROLLBACK TRANSACTION $name"); } sub build_datetime_parser {