Factor SQL-standard deferred FK checks into a component
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Oracle / Generic.pm
index 84799f1..a73b61f 100644 (file)
@@ -2,11 +2,9 @@ package DBIx::Class::Storage::DBI::Oracle::Generic;
 
 use strict;
 use warnings;
-use base qw/DBIx::Class::Storage::DBI/;
+use base qw/DBIx::Class::Storage::DBI::SetConstraintsDeferred/;
 use mro 'c3';
 use DBIx::Class::Carp;
-use Scope::Guard ();
-use Context::Preserve 'preserve_context';
 use Try::Tiny;
 use List::Util 'first';
 use namespace::clean;
@@ -115,6 +113,21 @@ sub deployment_statements {
   $self->next::method($schema, $type, $version, $dir, $sqltargs, @rest);
 }
 
+sub insert {
+  my ($self, $source, $to_insert) = @_;
+
+  # Oracle does not understand INSERT INTO ... DEFAULT VALUES syntax
+  # Furthermore it does not have any way to insert without specifying any columns
+  # We can't fix this in SQLMaker::Oracle because it doesn't know which column to add to the statement
+  unless (%$to_insert)
+  {
+    my ($col) = $source->columns;
+    $to_insert = { $col => \'DEFAULT' };
+  }
+
+  return $self->next::method($source, $to_insert);
+}
+
 sub _dbh_last_insert_id {
   my ($self, $dbh, $source, @columns) = @_;
   my @ids = ();
@@ -635,7 +648,7 @@ Unfortunately, Oracle doesn't support identifiers over 30 chars in length, so
 the L<DBIx::Class::Relationship> name is shortened and appended with half of an
 MD5 hash.
 
-See L<DBIx::Class::Storage/"relname_to_table_alias">.
+See L<DBIx::Class::Storage::DBI/relname_to_table_alias>.
 
 =cut
 
@@ -650,35 +663,6 @@ sub relname_to_table_alias {
   return $self->sql_maker->_shorten_identifier($alias);
 }
 
-=head2 with_deferred_fk_checks
-
-Runs a coderef between:
-
-  alter session set constraints = deferred
-  ...
-  alter session set constraints = immediate
-
-to defer foreign key checks.
-
-Constraints must be declared C<DEFERRABLE> for this to work.
-
-=cut
-
-sub with_deferred_fk_checks {
-  my ($self, $sub) = @_;
-
-  my $txn_scope_guard = $self->txn_scope_guard;
-
-  $self->_do_query('alter session set constraints = deferred');
-
-  my $sg = Scope::Guard->new(sub {
-    $self->_do_query('alter session set constraints = immediate');
-  });
-
-  return
-    preserve_context { $sub->() } after => sub { $txn_scope_guard->commit };
-}
-
 =head1 ATTRIBUTES
 
 Following additional attributes can be used in resultsets.
@@ -763,13 +747,16 @@ It uses the same syntax as L<DBIx::Class::ResultSet/order_by>
   # ORDER SIBLINGS BY
   #     firstname ASC
 
-=head1 AUTHOR
+=head1 FURTHER QUESTIONS?
 
-See L<DBIx::Class/AUTHOR> and L<DBIx::Class/CONTRIBUTORS>.
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
 
-=head1 LICENSE
+=head1 COPYRIGHT AND LICENSE
 
-You may distribute this code under the same terms as Perl itself.
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
 
 =cut