move Firebird ODBC override for RETURNING to a SQLAHacks class
Rafael Kitover [Sat, 6 Feb 2010 12:35:31 +0000 (12:35 +0000)]
Makefile.PL
lib/DBIx/Class/SQLAHacks/ODBC/Firebird.pm [new file with mode: 0644]
lib/DBIx/Class/Storage/DBI/InterBase.pm
lib/DBIx/Class/Storage/DBI/ODBC/Firebird.pm

index 0dcb502..1574146 100644 (file)
@@ -39,7 +39,7 @@ requires 'MRO::Compat'              => '0.09';
 requires 'Module::Find'             => '0.06';
 requires 'Path::Class'              => '0.16';
 requires 'Scope::Guard'             => '0.03';
-requires 'SQL::Abstract'            => '1.60';
+requires 'SQL::Abstract'            => '1.61';
 requires 'SQL::Abstract::Limit'     => '0.13';
 requires 'Sub::Name'                => '0.04';
 requires 'Data::Dumper::Concise'    => '1.000';
@@ -128,6 +128,11 @@ my %force_requires_if_author = (
       'DateTime::Format::Strptime' => 0,
     ) : ()
   ,
+  grep $_, @ENV{qw/DBICTEST_FIREBIRD_DSN DBICTEST_FIREBIRD_ODBC_DSN/}
+    ? (
+      'DateTime::Format::Strptime' => 0,
+    ) : ()
+  ,
 );
 #************************************************************************#
 # Make ABSOLUTELY SURE that nothing on the list above is a real require, #
diff --git a/lib/DBIx/Class/SQLAHacks/ODBC/Firebird.pm b/lib/DBIx/Class/SQLAHacks/ODBC/Firebird.pm
new file mode 100644 (file)
index 0000000..b6697e7
--- /dev/null
@@ -0,0 +1,24 @@
+package # Hide from PAUSE
+  DBIx::Class::SQLAHacks::ODBC::Firebird;
+
+use strict;
+use warnings;
+use base qw( DBIx::Class::SQLAHacks );
+use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/;
+
+sub insert {
+  my $self = shift;
+  my ($table, $vals, $opts) = @_;
+
+# Quoting RETURNING values breaks the Firebird ODBC driver, so we convert to
+# scalarref with unquoted values.
+  my $returning = $opts->{returning};
+
+  if ($returning && ref $returning eq 'ARRAY') {
+    $opts->{returning} = \join ', ' => @$returning;
+  }
+
+  return $self->next::method(@_);
+}
+
+1;
index 0d92cb3..f019ebb 100644 (file)
@@ -16,8 +16,6 @@ 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;
@@ -36,24 +34,14 @@ sub _prep_for_execute {
     } $ident->columns;
 
     if (@auto_inc_cols) {
-      my $auto_inc_cols =
-        join ', ',
-        map $self->_quote_column_for_returning($_), @auto_inc_cols;
-
-      $sql .= " RETURNING ($auto_inc_cols)";
+      $args->[1]{returning} = \@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 {
index d5f2335..b5eefa3 100644 (file)
@@ -17,10 +17,7 @@ that module for details.
 
 =cut
 
-# RETURNING ("foo") is broken in ODBC, but RETURNING (foo) works
-sub _quote_column_for_returning {
-  return $_[1];
-}
+__PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks::ODBC::Firebird');
 
 sub datetime_parser_type { __PACKAGE__ }