Switch sql_maker_class and datetime_parser_type to component_class accessors
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Oracle / Generic.pm
index b255e53..d049d6c 100644 (file)
@@ -8,6 +8,7 @@ use Try::Tiny;
 use namespace::clean;
 
 __PACKAGE__->sql_limit_dialect ('RowNum');
+__PACKAGE__->sql_quote_char ('"');
 
 =head1 NAME
 
@@ -79,6 +80,21 @@ use base qw/DBIx::Class::Storage::DBI/;
 use mro 'c3';
 
 __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker::Oracle');
+__PACKAGE__->datetime_parser_type('DateTime::Format::Oracle');
+
+sub _determine_supports_insert_returning {
+  my $self = shift;
+
+# TODO find out which version supports the RETURNING syntax
+# 8i has it and earlier docs are a 404 on oracle.com
+
+  return 1
+    if $self->_server_info->{normalized_dbms_version} >= 8.001;
+
+  return 0;
+}
+
+__PACKAGE__->_use_insert_returning_bound (1);
 
 sub deployment_statements {
   my $self = shift;;
@@ -136,9 +152,12 @@ sub _dbh_get_autoinc_seq {
   # disable default bindtype
   local $sql_maker->{bindtype} = 'normal';
 
-
   # look up the correct sequence automatically
   my ( $schema, $table ) = $source_name =~ /( (?:${ql})? \w+ (?:${qr})? ) \. ( (?:${ql})? \w+ (?:${qr})? )/x;
+
+  # if no explicit schema was requested - use the default schema (which in the case of Oracle is the db user)
+  $schema ||= uc( ($self->_dbi_connect_info||[])->[1] || '');
+
   my ($sql, @bind) = $sql_maker->select (
     'ALL_TRIGGERS',
     [qw/TRIGGER_BODY TABLE_OWNER TRIGGER_NAME/],
@@ -257,16 +276,16 @@ sub _dbh_execute {
   my ($dbh, $op, $extra_bind, $ident, $bind_attributes, @args) = @_;
 
   my (@res, $tried);
-  my $wantarray = wantarray();
+  my $want = wantarray;
   my $next = $self->next::can;
   do {
     try {
       my $exec = sub { $self->$next($dbh, $op, $extra_bind, $ident, $bind_attributes, @args) };
 
-      if (!defined $wantarray) {
+      if (!defined $want) {
         $exec->();
       }
-      elsif (! $wantarray) {
+      elsif (! $want) {
         $res[0] = $exec->();
       }
       else {
@@ -288,7 +307,16 @@ sub _dbh_execute {
     };
   } while (! $tried++);
 
-  return $wantarray ? @res : $res[0];
+  return wantarray ? @res : $res[0];
+}
+
+sub _dbh_execute_array {
+  #my ($self, $sth, $tuple_status, @extra) = @_;
+
+  # DBD::Oracle warns loudly on partial execute_array failures
+  local $_[1]->{PrintWarn} = 0;
+
+  shift->next::method(@_);
 }
 
 =head2 get_autoinc_seq
@@ -308,10 +336,6 @@ sub get_autoinc_seq {
 This sets the proper DateTime::Format module for use with
 L<DBIx::Class::InflateColumn::DateTime>.
 
-=cut
-
-sub datetime_parser_type { return "DateTime::Format::Oracle"; }
-
 =head2 connect_call_datetime_setup
 
 Used as:
@@ -383,15 +407,14 @@ sub source_bind_attributes
   my $self = shift;
   my($source) = @_;
 
-  my %bind_attributes;
+  my %bind_attributes = %{ $self->next::method(@_) };
 
   foreach my $column ($source->columns) {
-    my $data_type = $source->column_info($column)->{data_type}
-      or next;
+    my %column_bind_attrs = %{ $bind_attributes{$column} || {} };
 
-    my %column_bind_attrs = $self->bind_attribute_by_data_type($data_type);
+    my $data_type = $source->column_info($column)->{data_type};
 
-    if ($data_type =~ /^[BC]LOB$/i) {
+    if ($self->_is_lob_type($data_type)) {
       if ($DBD::Oracle::VERSION eq '1.23') {
         $self->throw_exception(
 "BLOB/CLOB support in DBD::Oracle == 1.23 is broken, use an earlier or later ".
@@ -399,7 +422,7 @@ sub source_bind_attributes
         );
       }
 
-      $column_bind_attrs{'ora_type'} = uc($data_type) eq 'CLOB'
+      $column_bind_attrs{'ora_type'} = $self->_is_text_lob_type($data_type)
         ? DBD::Oracle::ORA_CLOB()
         : DBD::Oracle::ORA_BLOB()
       ;