move Firebird ODBC override for RETURNING to a SQLAHacks class
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / InterBase.pm
index 5b9ead7..f019ebb 100644 (file)
@@ -9,45 +9,39 @@ use mro 'c3';
 use List::Util();
 
 __PACKAGE__->mk_group_accessors(simple => qw/
-  _fb_auto_incs
+  _auto_incs
 /);
 
 sub _prep_for_execute {
   my $self = shift;
   my ($op, $extra_bind, $ident, $args) = @_;
 
-  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;
 
     if (@auto_inc_cols) {
-      my $auto_inc_cols =
-        join ', ',
-        map $self->_quote_column_for_returning($_), @auto_inc_cols;
+      $args->[1]{returning} = \@auto_inc_cols;
 
-      $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;
     }
   }
 
-  return ($sql, $bind);
-}
-
-sub _quote_column_for_returning {
-  my ($self, $col) = @_;
-
-  return $self->sql_maker->_quote($col);
+  return $self->next::method(@_);
 }
 
 sub _execute {
@@ -56,13 +50,13 @@ sub _execute {
 
   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;
   }
 
@@ -74,8 +68,8 @@ sub last_insert_id {
   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;
 
@@ -94,4 +88,29 @@ sub _sql_maker_opts {
   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;