From: Peter Rabbitson Date: Sun, 21 Sep 2008 22:37:45 +0000 (+0000) Subject: SQLite is rather peculiar on disconnection as described at http://www.perlmonks.org... X-Git-Tag: v0.08240~332^2~3 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5b8cee5c4a675888bc531aee20326cc2100721b6;p=dbsrgits%2FDBIx-Class.git SQLite is rather peculiar on disconnection as described at perlmonks.org/?node_id=666210. Add an ugly workaround to Storage::DBI, and add a TODO test to detect if the problem is resolved --- diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 806cef8..3f05c3e 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -703,7 +703,10 @@ sub disconnect { $self->_do_connection_actions($connection_do) if ref($connection_do); $self->_dbh->rollback unless $self->_dbh_autocommit; - $self->_dbh->disconnect; + + # SQLite is evil/brainded and must be DESTROYed without disconnecting: http://www.perlmonks.org/?node_id=666210 + $self->_dbh->disconnect if $self->_dbh->get_info(17) ne 'SQLite'; + $self->_dbh(undef); $self->{_dbh_gen}++; } diff --git a/t/33storage_reconnect.t b/t/33storage_reconnect.t index 8dcaeec..e95f187 100644 --- a/t/33storage_reconnect.t +++ b/t/33storage_reconnect.t @@ -7,7 +7,7 @@ use Test::More; 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 @@ my @art = $schema->resultset("Artist")->search({ }, { order_by => 'name DESC'}); 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::disconnect()'; + 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 @@ close DBFILE; 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 (disabling PrintError entirely is unwise) + 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);