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