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)
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 {
}
# 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');
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;
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,
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") });
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;
}