Commit | Line | Data |
fabbd5cc |
1 | package DBIx::Class::Storage::DBI::IdentityInsert; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | use base 'DBIx::Class::Storage::DBI'; |
6 | use mro 'c3'; |
7 | |
8 | use namespace::clean; |
9 | |
10 | =head1 NAME |
11 | |
12 | DBIx::Class::Storage::DBI::IdentityInsert - Storage Component for Sybase ASE and |
13 | MSSQL for Identity Inserts / Updates |
14 | |
15 | =head1 DESCRIPTION |
16 | |
17 | This is a storage component for Sybase ASE |
18 | (L<DBIx::Class::Storage::DBI::Sybase::ASE>) and Microsoft SQL Server |
19 | (L<DBIx::Class::Storage::DBI::MSSQL>) to support identity inserts, that is |
20 | inserts of explicit values into C<IDENTITY> columns. |
21 | |
22 | This is done by wrapping C<INSERT> operations in a pair of table identity |
23 | toggles like: |
24 | |
25 | SET IDENTITY_INSERT $table ON |
26 | $sql |
27 | SET IDENTITY_INSERT $table OFF |
28 | |
29 | =cut |
30 | |
31 | # SET IDENTITY_X only works as part of a statement scope. We can not |
32 | # $dbh->do the $sql and the wrapping set()s individualy. Hence the |
33 | # sql mangling. The newlines are important. |
34 | sub _prep_for_execute { |
35 | my $self = shift; |
36 | |
37 | return $self->next::method(@_) unless $self->_autoinc_supplied_for_op; |
38 | |
39 | my ($op, $ident) = @_; |
40 | |
41 | my $table = $self->sql_maker->_quote($ident->name); |
42 | $op = uc $op; |
43 | |
44 | my ($sql, $bind) = $self->next::method(@_); |
45 | |
46 | return (<<EOS, $bind); |
47 | SET IDENTITY_$op $table ON |
48 | $sql |
49 | SET IDENTITY_$op $table OFF |
50 | EOS |
51 | |
52 | } |
53 | |
54 | =head1 AUTHOR |
55 | |
56 | See L<DBIx::Class/AUTHOR> and L<DBIx::Class/CONTRIBUTORS>. |
57 | |
58 | =head1 LICENSE |
59 | |
60 | You may distribute this code under the same terms as Perl itself. |
61 | |
62 | =cut |
63 | |
64 | 1; |