Fix updating multiple CLOB/BLOB columns on Oracle
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / IdentityInsert.pm
CommitLineData
fabbd5cc 1package DBIx::Class::Storage::DBI::IdentityInsert;
2
3use strict;
4use warnings;
5use base 'DBIx::Class::Storage::DBI';
6use mro 'c3';
7
8use namespace::clean;
9
10=head1 NAME
11
12DBIx::Class::Storage::DBI::IdentityInsert - Storage Component for Sybase ASE and
13MSSQL for Identity Inserts / Updates
14
15=head1 DESCRIPTION
16
17This 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
20inserts of explicit values into C<IDENTITY> columns.
21
22This is done by wrapping C<INSERT> operations in a pair of table identity
23toggles 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
4a0eed52 32# $dbh->do the $sql and the wrapping set()s individually. Hence the
fabbd5cc 33# sql mangling. The newlines are important.
34sub _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);
47SET IDENTITY_$op $table ON
48$sql
49SET IDENTITY_$op $table OFF
50EOS
51
52}
53
a2bd3796 54=head1 FURTHER QUESTIONS?
fabbd5cc 55
a2bd3796 56Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
fabbd5cc 57
a2bd3796 58=head1 COPYRIGHT AND LICENSE
fabbd5cc 59
a2bd3796 60This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
61by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
62redistribute it and/or modify it under the same terms as the
63L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
fabbd5cc 64
65=cut
66
671;