From: Peter Rabbitson Date: Wed, 30 Mar 2016 18:24:49 +0000 (+0200) Subject: Really fix SQLite savepoints unlike the shortsighted 398215b1 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=66c817df10d62ecc3d49df5839b1048e3454b2cf;p=dbsrgits%2FDBIx-Class-Historic.git Really fix SQLite savepoints unlike the shortsighted 398215b1 --- diff --git a/Changes b/Changes index e6dc25f..accc48c 100644 --- a/Changes +++ b/Changes @@ -50,6 +50,8 @@ Revision history for DBIx::Class immediately before the commit is attempted (RT#107159) - Work around unreliable $sth->finish() on INSERT ... RETURNING within DBD::Firebird on some compiler/driver combinations (RT#110979) + - Really fix savepoint rollbacks on older DBD::SQLite (fix in 0.082800 + was not sufficient to cover up RT#67843) - Fix several corner cases with Many2Many over custom relationships - Fix the Sybase ASE storage incorrectly attempting to retrieve an autoinc value when inserting rows containing blobs (GH#82) diff --git a/lib/DBIx/Class/Storage/DBI/SQLite.pm b/lib/DBIx/Class/Storage/DBI/SQLite.pm index 28e9a08..dcebce7 100644 --- a/lib/DBIx/Class/Storage/DBI/SQLite.pm +++ b/lib/DBIx/Class/Storage/DBI/SQLite.pm @@ -123,22 +123,17 @@ sub _exec_svp_rollback { my ($self, $name) = @_; $self->_dbh->do("ROLLBACK TO SAVEPOINT $name"); -} - -# older SQLite has issues here too - both of these are in fact -# completely benign warnings (or at least so say the tests) -sub _exec_txn_rollback { - local $SIG{__WARN__} = sigwarn_silencer( qr/rollback ineffective/ ) - unless $DBD::SQLite::__DBIC_TXN_SYNC_SANE__; - - shift->next::method(@_); -} - -sub _exec_txn_commit { - local $SIG{__WARN__} = sigwarn_silencer( qr/commit ineffective/ ) - unless $DBD::SQLite::__DBIC_TXN_SYNC_SANE__; - shift->next::method(@_); + # resync state for older DBD::SQLite (RT#67843) + # https://github.com/DBD-SQLite/DBD-SQLite/commit/9b3cdbf + if ( + ! modver_gt_or_eq('DBD::SQLite', '1.33') + and + $self->_dbh->FETCH('AutoCommit') + ) { + $self->_dbh->STORE('AutoCommit', 0); + $self->_dbh->STORE('BegunWork', 1); + } } sub _ping { diff --git a/t/752sqlite.t b/t/752sqlite.t index fe076d1..c069554 100644 --- a/t/752sqlite.t +++ b/t/752sqlite.t @@ -96,6 +96,11 @@ DDL } # test blank begin/svp/commit/begin cycle +# +# need to prime this for exotic testing scenarios +# before testing for lack of warnings +modver_gt_or_eq('DBD::SQLite', '1.33'); + warnings_are { my $schema = DBICTest->init_schema( no_populate => 1 ); my $rs = $schema->resultset('Artist'); diff --git a/t/storage/savepoints.t b/t/storage/savepoints.t index 66b7d71..b125d6e 100644 --- a/t/storage/savepoints.t +++ b/t/storage/savepoints.t @@ -6,8 +6,7 @@ use warnings; use Test::More; use Test::Exception; use DBIx::Class::Optional::Dependencies; -use DBIx::Class::_Util qw(modver_gt_or_eq sigwarn_silencer scope_guard); - +use DBIx::Class::_Util qw(sigwarn_silencer scope_guard); use DBICTest; @@ -228,15 +227,6 @@ for ('', keys %$env2optdep) { SKIP: { is_deeply( $schema->storage->savepoints, [], 'All savepoints forgotten' ); -SKIP: { - skip "FIXME: Reading inexplicably fails on very old replicated DBD::SQLite<1.33", 1 if ( - $ENV{DBICTEST_VIA_REPLICATED} - and - $prefix eq 'SQLite Internal DB' - and - ! modver_gt_or_eq('DBD::SQLite', '1.33') - ); - ok($ars->search({ name => 'in_outer_transaction' })->first, 'commit from outer transaction'); ok($ars->search({ name => 'in_outer_transaction2' })->first, @@ -246,7 +236,9 @@ SKIP: { is $ars->search({ name => 'in_inner_transaction_rolling_back' })->first, undef, 'rollback from inner transaction'; -} + + # make sure a fresh txn will work after above + $schema->storage->txn_do(sub { ok "noop" } ); ### cleanupz $schema->storage->dbh_do(sub { $_[1]->do("DROP TABLE artist") }); @@ -255,8 +247,6 @@ SKIP: { done_testing; END { - local $SIG{__WARN__} = sigwarn_silencer( qr/Internal transaction state of handle/ ) - unless modver_gt_or_eq('DBD::SQLite', '1.33'); eval { $schema->storage->dbh_do(sub { $_[1]->do("DROP TABLE artist") }) } if defined $schema; undef $schema; }