From: Arthur Axel "fREW" Schmidt Date: Tue, 8 Sep 2009 18:13:29 +0000 (+0000) Subject: Turn IDENTITY_INSERT back off after inserts X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=aac1a358a8aef0d5f735fd4752a7e8a9cbb6a4b5;p=dbsrgits%2FDBIx-Class-Historic.git Turn IDENTITY_INSERT back off after inserts --- 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; }