added with_deferred_fk_checks functionality to storage
Luke Saunders [Wed, 6 Aug 2008 18:36:01 +0000 (18:36 +0000)]
Changes
lib/DBIx/Class/Storage/DBI.pm
lib/DBIx/Class/Storage/DBI/Pg.pm
lib/DBIx/Class/Storage/DBI/mysql.pm

diff --git a/Changes b/Changes
index 05e2fad..c7a1ae8 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,6 +1,7 @@
 Revision history for DBIx::Class
 
 0.08099_04 2008-07-24 01:00:00
+        - Functionality to storage to enable a sub to be run without FK checks
         - Fixed $schema->clone bug which caused clone and source to share 
           internal hash refs
         - Added register_extra_source methods for additional sources
index cf61846..24f177c 100644 (file)
@@ -709,6 +709,28 @@ sub disconnect {
   }
 }
 
+=head2 with_deferred_fk_checks
+
+=over 4
+
+=item Arguments: C<$coderef>
+
+=item Return Value: The return value of $coderef
+
+=back
+
+Storage specific method to run the code ref with FK checks deferred or
+in MySQL's case disabled entirely.
+
+=cut
+
+# Storage subclasses should override this
+sub with_deferred_fk_checks {
+  my ($self, $sub) = @_;
+
+  $sub->();
+}
+
 sub connected {
   my ($self) = @_;
 
index bd28e02..937edfb 100644 (file)
@@ -13,6 +13,13 @@ use base qw/DBIx::Class::Storage::DBI/;
 warn "DBD::Pg 1.49 is strongly recommended"
   if ($DBD::Pg::VERSION < 1.49);
 
+sub with_deferred_fk_checks {
+  my ($self, $sub) = @_;
+
+  $self->dbh->do('SET CONSTRAINTS ALL DEFERRED');
+  $sub->();
+}
+
 sub _dbh_last_insert_id {
   my ($self, $dbh, $seq) = @_;
   $dbh->last_insert_id(undef, undef, undef, undef, {sequence => $seq});
index dadcbf0..fa0419f 100644 (file)
@@ -7,6 +7,14 @@ use base qw/DBIx::Class::Storage::DBI/;
 
 # __PACKAGE__->load_components(qw/PK::Auto/);
 
+sub with_deferred_fk_checks {
+  my ($self, $sub) = @_;
+
+  $self->dbh->do('SET foreign_key_checks=0');
+  $sub->();
+  $self->dbh->do('SET foreign_key_checks=1');
+}
+
 sub _dbh_last_insert_id {
   my ($self, $dbh, $source, $col) = @_;
   $dbh->{mysql_insertid};