use List::Util();
__PACKAGE__->mk_group_accessors(simple => qw/
- _fb_auto_incs
+ _auto_incs
/);
sub _prep_for_execute {
my ($sql, $bind) = $self->next::method (@_);
if ($op eq 'insert') {
+ my @pk = $ident->primary_columns;
+ my %pk;
+ @pk{@pk} = ();
+
my @auto_inc_cols = grep {
my $inserting = $args->[0]{$_};
- $ident->column_info($_)->{is_auto_increment} && (
+ ($ident->column_info($_)->{is_auto_increment}
+ || exists $pk{$_})
+ && (
(not defined $inserting)
||
- (ref $inserting eq 'SCALAR' && $$inserting eq 'NULL')
+ (ref $inserting eq 'SCALAR' && $$inserting =~ /^null\z/i)
)
} $ident->columns;
$sql .= " RETURNING ($auto_inc_cols)";
- $self->_fb_auto_incs([]);
- $self->_fb_auto_incs->[0] = \@auto_inc_cols;
+ $self->_auto_incs([]);
+ $self->_auto_incs->[0] = \@auto_inc_cols;
}
}
my ($rv, $sth, @bind) = $self->dbh_do($self->can('_dbh_execute'), @_);
- if ($op eq 'insert') {
+ if ($op eq 'insert' && $self->_auto_incs) {
local $@;
my (@auto_incs) = eval {
local $SIG{__WARN__} = sub {};
$sth->fetchrow_array
};
- $self->_fb_auto_incs->[1] = \@auto_incs;
+ $self->_auto_incs->[1] = \@auto_incs;
$sth->finish;
}
my @result;
my %auto_incs;
- @auto_incs{ @{ $self->_fb_auto_incs->[0] } } =
- @{ $self->_fb_auto_incs->[1] };
+ @auto_incs{ @{ $self->_auto_incs->[0] } } =
+ @{ $self->_auto_incs->[1] };
push @result, $auto_incs{$_} for @cols;
return { limit_dialect => 'FirstSkip', %{$self->{_sql_maker_opts}||{}} };
}
+sub datetime_parser_type { __PACKAGE__ }
+
+my ($datetime_parser, $datetime_formatter);
+
+sub parse_datetime {
+ shift;
+ require DateTime::Format::Strptime;
+ $datetime_parser ||= DateTime::Format::Strptime->new(
+ pattern => '%a %d %b %Y %r',
+# there should be a %Z (TZ) on the end, but it's ambiguous and not parsed
+ on_error => 'croak',
+ );
+ $datetime_parser->parse_datetime(shift);
+}
+
+sub format_datetime {
+ shift;
+ require DateTime::Format::Strptime;
+ $datetime_formatter ||= DateTime::Format::Strptime->new(
+ pattern => '%F %H:%M:%S.%4N',
+ on_error => 'croak',
+ );
+ $datetime_formatter->format_datetime(shift);
+}
+
1;