X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FMSSQL.pm;h=3189a3cd579ee1a082f6395cbbb4b5f9e56ef9b8;hb=c68af2f3df3eb51ddddbd4a516590491f3223401;hp=d528b2209c49298ea00650a4ee6cdaa87df003ac;hpb=c84189e13c678016a72cf3163730b7705b97a959;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 d528b22..3189a3c 100644 --- a/lib/DBIx/Class/Storage/DBI/MSSQL.pm +++ b/lib/DBIx/Class/Storage/DBI/MSSQL.pm @@ -32,18 +32,38 @@ sub _set_identity_insert { } } +sub _unset_identity_insert { + my ($self, $table) = @_; + + my $sql = sprintf ( + 'SET IDENTITY_INSERT %s OFF', + $self->sql_maker->_quote ($table), + ); + + my $dbh = $self->_get_dbh; + $dbh->do ($sql); +} + sub insert_bulk { my $self = shift; my ($source, $cols, $data) = @_; - if (List::Util::first + my $is_identity_insert = (List::Util::first { $source->column_info ($_)->{is_auto_increment} } (@{$cols}) - ) { - $self->_set_identity_insert ($source->name); + ) + ? 1 + : 0; + + if ($is_identity_insert) { + $self->_set_identity_insert ($source->name); } $self->next::method(@_); + + if ($is_identity_insert) { + $self->_unset_identity_insert ($source->name); + } } # support MSSQL GUID column types @@ -83,12 +103,21 @@ sub insert { $updated_cols->{$guid_col} = $to_insert->{$guid_col} = $new_guid; } - if (List::Util::first { $_->{is_auto_increment} } (values %$supplied_col_info) ) { - $self->_set_identity_insert ($source->name); + my $is_identity_insert = (List::Util::first { $_->{is_auto_increment} } (values %$supplied_col_info) ) + ? 1 + : 0; + + if ($is_identity_insert) { + $self->_set_identity_insert ($source->name); } $updated_cols = { %$updated_cols, %{ $self->next::method(@_) } }; + if ($is_identity_insert) { + $self->_unset_identity_insert ($source->name); + } + + return $updated_cols; }