support autoinc PKs without is_auto_increment set
[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/
2680ffe5 12 _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') {
6e8d182b 22 my @pk = $ident->primary_columns;
23 my %pk;
24 @pk{@pk} = ();
25
1ae0a36c 26 my @auto_inc_cols = grep {
27 my $inserting = $args->[0]{$_};
145b2a3d 28
6e8d182b 29 ($ident->column_info($_)->{is_auto_increment}
30 || exists $pk{$_})
31 && (
1ae0a36c 32 (not defined $inserting)
33 ||
2680ffe5 34 (ref $inserting eq 'SCALAR' && $$inserting =~ /^null\z/i)
1ae0a36c 35 )
36 } $ident->columns;
88a8d0fa 37
145b2a3d 38 if (@auto_inc_cols) {
39 my $auto_inc_cols =
40 join ', ',
1ae0a36c 41 map $self->_quote_column_for_returning($_), @auto_inc_cols;
145b2a3d 42
43 $sql .= " RETURNING ($auto_inc_cols)";
44
2680ffe5 45 $self->_auto_incs([]);
46 $self->_auto_incs->[0] = \@auto_inc_cols;
145b2a3d 47 }
88a8d0fa 48 }
49
50 return ($sql, $bind);
51}
52
1ae0a36c 53sub _quote_column_for_returning {
54 my ($self, $col) = @_;
55
56 return $self->sql_maker->_quote($col);
57}
58
88a8d0fa 59sub _execute {
60 my $self = shift;
61 my ($op) = @_;
62
63 my ($rv, $sth, @bind) = $self->dbh_do($self->can('_dbh_execute'), @_);
64
2680ffe5 65 if ($op eq 'insert' && $self->_auto_incs) {
88a8d0fa 66 local $@;
145b2a3d 67 my (@auto_incs) = eval {
68 local $SIG{__WARN__} = sub {};
69 $sth->fetchrow_array
70 };
2680ffe5 71 $self->_auto_incs->[1] = \@auto_incs;
88a8d0fa 72 $sth->finish;
73 }
74
75 return wantarray ? ($rv, $sth, @bind) : $rv;
76}
77
145b2a3d 78sub last_insert_id {
79 my ($self, $source, @cols) = @_;
80 my @result;
88a8d0fa 81
145b2a3d 82 my %auto_incs;
2680ffe5 83 @auto_incs{ @{ $self->_auto_incs->[0] } } =
84 @{ $self->_auto_incs->[1] };
145b2a3d 85
86 push @result, $auto_incs{$_} for @cols;
87
88 return @result;
89}
90
91# this sub stolen from DB2
88a8d0fa 92
145b2a3d 93sub _sql_maker_opts {
94 my ( $self, $opts ) = @_;
95
96 if ( $opts ) {
97 $self->{_sql_maker_opts} = { %$opts };
98 }
99
100 return { limit_dialect => 'FirstSkip', %{$self->{_sql_maker_opts}||{}} };
101}
102
9cd0b325 103sub datetime_parser_type { __PACKAGE__ }
104
323148de 105my ($datetime_parser, $datetime_formatter);
9cd0b325 106
107sub parse_datetime {
108 shift;
109 require DateTime::Format::Strptime;
323148de 110 $datetime_parser ||= DateTime::Format::Strptime->new(
9cd0b325 111 pattern => '%a %d %b %Y %r',
112# there should be a %Z (TZ) on the end, but it's ambiguous and not parsed
113 on_error => 'croak',
114 );
323148de 115 $datetime_parser->parse_datetime(shift);
9cd0b325 116}
117
118sub format_datetime {
119 shift;
120 require DateTime::Format::Strptime;
323148de 121 $datetime_formatter ||= DateTime::Format::Strptime->new(
9cd0b325 122 pattern => '%F %H:%M:%S.%4N',
123 on_error => 'croak',
124 );
323148de 125 $datetime_formatter->format_datetime(shift);
9cd0b325 126}
127
145b2a3d 1281;