[Bast-commits] r4903 - in DBIx-Class/0.08/trunk: lib/DBIx/Class/Storage/DBI t

ribasushi at dev.catalyst.perl.org ribasushi at dev.catalyst.perl.org
Tue Oct 7 15:15:03 BST 2008


Author: ribasushi
Date: 2008-10-07 15:15:03 +0100 (Tue, 07 Oct 2008)
New Revision: 4903

Modified:
   DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI/SQLite.pm
   DBIx-Class/0.08/trunk/t/33storage_reconnect.t
Log:
Silence SQLite ->disconnect warnings

Modified: DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI/SQLite.pm
===================================================================
--- DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI/SQLite.pm	2008-10-07 14:02:04 UTC (rev 4902)
+++ DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI/SQLite.pm	2008-10-07 14:15:03 UTC (rev 4903)
@@ -45,7 +45,21 @@
   return $backupfile;
 }
 
+sub disconnect {
 
+  # As described in this node http://www.perlmonks.org/?node_id=666210
+  # there seems to be no sane way to ->disconnect a SQLite database with
+  # cached statement handles. As per mst we just zap the cache and 
+  # proceed as normal.
+
+  my $self = shift;
+  if ($self->connected) {
+    $self->_dbh->{CachedKids} = {};
+    $self->next::method (@_);
+  }
+}
+
+
 1;
 
 =head1 NAME

Modified: DBIx-Class/0.08/trunk/t/33storage_reconnect.t
===================================================================
--- DBIx-Class/0.08/trunk/t/33storage_reconnect.t	2008-10-07 14:02:04 UTC (rev 4902)
+++ DBIx-Class/0.08/trunk/t/33storage_reconnect.t	2008-10-07 14:15:03 UTC (rev 4903)
@@ -7,7 +7,7 @@
 use lib qw(t/lib);
 use DBICTest;
 
-plan tests => 5;
+plan tests => 6;
 
 my $db_orig = "$FindBin::Bin/var/DBIxClass.db";
 my $db_tmp  = "$db_orig.tmp";
@@ -20,7 +20,14 @@
 cmp_ok(@art, '==', 3, "Three artists returned");
 
 # Disconnect the dbh, and be sneaky about it
-$schema->storage->_dbh->disconnect;
+# Also test if DBD::SQLite finaly knows how to ->disconnect properly
+TODO: {
+    local $TODO = 'SQLite is evil/braindead. Once this test starts passing, remove the related atrocity from DBIx::Class::Storage::DBI::SQLite';
+    my $w;
+    local $SIG{__WARN__} = sub { $w = shift };
+    $schema->storage->_dbh->disconnect;
+    ok ($w !~ /active statement handles/, 'SQLite can disconnect properly \o/');
+}
 
 # Try the operation again - What should happen here is:
 #   1. S::DBI blindly attempts the SELECT, which throws an exception
@@ -40,10 +47,14 @@
 chmod 0000, $db_orig;
 
 ### Try the operation again... it should fail, since there's no db
-eval {
-    my @art_three = $schema->resultset("Artist")->search( {}, { order_by => 'name DESC' } );
-};
-ok( $@, 'The operation failed' );
+{
+    # Catch the DBI connection error
+    local $SIG{__WARN__} = sub {};
+    eval {
+        my @art_three = $schema->resultset("Artist")->search( {}, { order_by => 'name DESC' } );
+    };
+    ok( $@, 'The operation failed' );
+}
 
 ### Now, move the db file back to the correct name
 unlink($db_orig);




More information about the Bast-commits mailing list