override quoting columns for RETURNING in Firebird ODBC (where it doesn't work) and...
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / InterBase.pm
CommitLineData
88a8d0fa 1package DBIx::Class::Storage::DBI::InterBase;
2
145b2a3d 3# partly stolen from DBIx::Class::Storage::DBI::MSSQL
88a8d0fa 4
5use strict;
6use warnings;
637d2fae 7use base qw/DBIx::Class::Storage::DBI/;
88a8d0fa 8use mro 'c3';
88a8d0fa 9use List::Util();
10
11__PACKAGE__->mk_group_accessors(simple => qw/
145b2a3d 12 _fb_auto_incs
88a8d0fa 13/);
14
88a8d0fa 15sub _prep_for_execute {
16 my $self = shift;
17 my ($op, $extra_bind, $ident, $args) = @_;
18
19 my ($sql, $bind) = $self->next::method (@_);
20
21 if ($op eq 'insert') {
1ae0a36c 22 my @auto_inc_cols = grep {
23 my $inserting = $args->[0]{$_};
145b2a3d 24
1ae0a36c 25 $ident->column_info($_)->{is_auto_increment} && (
26 (not defined $inserting)
27 ||
28 (ref $inserting eq 'SCALAR' && $$inserting eq 'NULL')
29 )
30 } $ident->columns;
88a8d0fa 31
145b2a3d 32 if (@auto_inc_cols) {
33 my $auto_inc_cols =
34 join ', ',
1ae0a36c 35 map $self->_quote_column_for_returning($_), @auto_inc_cols;
145b2a3d 36
37 $sql .= " RETURNING ($auto_inc_cols)";
38
39 $self->_fb_auto_incs([]);
40 $self->_fb_auto_incs->[0] = \@auto_inc_cols;
41 }
88a8d0fa 42 }
43
44 return ($sql, $bind);
45}
46
1ae0a36c 47sub _quote_column_for_returning {
48 my ($self, $col) = @_;
49
50 return $self->sql_maker->_quote($col);
51}
52
88a8d0fa 53sub _execute {
54 my $self = shift;
55 my ($op) = @_;
56
57 my ($rv, $sth, @bind) = $self->dbh_do($self->can('_dbh_execute'), @_);
58
59 if ($op eq 'insert') {
88a8d0fa 60 local $@;
145b2a3d 61 my (@auto_incs) = eval {
62 local $SIG{__WARN__} = sub {};
63 $sth->fetchrow_array
64 };
65 $self->_fb_auto_incs->[1] = \@auto_incs;
88a8d0fa 66 $sth->finish;
67 }
68
69 return wantarray ? ($rv, $sth, @bind) : $rv;
70}
71
145b2a3d 72sub last_insert_id {
73 my ($self, $source, @cols) = @_;
74 my @result;
88a8d0fa 75
145b2a3d 76 my %auto_incs;
77 @auto_incs{ @{ $self->_fb_auto_incs->[0] } } =
78 @{ $self->_fb_auto_incs->[1] };
79
80 push @result, $auto_incs{$_} for @cols;
81
82 return @result;
83}
84
85# this sub stolen from DB2
88a8d0fa 86
145b2a3d 87sub _sql_maker_opts {
88 my ( $self, $opts ) = @_;
89
90 if ( $opts ) {
91 $self->{_sql_maker_opts} = { %$opts };
92 }
93
94 return { limit_dialect => 'FirstSkip', %{$self->{_sql_maker_opts}||{}} };
95}
96
971;