1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
|
use strict;
use warnings;
use lib "t/lib";
use SQLiteTest;
use Test::More;
use if -d ".git", "Test::FailWarnings";
my $dbh = connect_ok(
AutoCommit => 1,
RaiseError => 1,
PrintError => 0,
);
$dbh->do('create table foo (id)');
my @funcs = (
sub { shift->rollback },
sub { shift->commit },
sub { shift->do('rollback') },
sub { shift->do('commit') },
);
foreach my $func (@funcs) {
# scenario 1: AutoCommit => 1 and no begin_work
eval { $dbh->{AutoCommit} = 1 }; # initialize
ok $dbh->{AutoCommit}, "AutoCommit is on";
ok !$dbh->{BegunWork}, "BegunWork is off";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'a statement works';
diag $@ if $@;
# eval { $func->($dbh) };
# ok !$@, "commit/rollback ignored";
# diag $@ if $@;
ok $dbh->{AutoCommit}, "AutoCommit is still on";
ok !$dbh->{BegunWork}, "BegunWork is still off";
# scenario 2: AutoCommit => 1 and begin_work and implicit BEGIN
eval { $dbh->begin_work };
ok !$@, "begin_work works";
ok !$dbh->{AutoCommit}, "AutoCommit is turned off";
ok $dbh->{BegunWork}, "BegunWork is turned on";
eval { $dbh->begin_work };
like $@ => qr/Already in a transaction/, "but second begin_work should fail";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, "other statement should work";
diag $@ if $@;
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok $dbh->{AutoCommit}, "AutoCommit is turned on";
ok !$dbh->{BegunWork}, "BegunWork is turned off";
# scenario 3: AutoCommit => 1 and begin_work and explicit and immediate BEGIN
eval { $dbh->begin_work };
ok !$@, "begin_work works";
ok !$dbh->{AutoCommit}, "AutoCommit is turned off";
ok $dbh->{BegunWork}, "BegunWork is turned on";
eval { $dbh->do('BEGIN EXCLUSIVE TRANSACTION') };
ok !$@, "first BEGIN should be passed through";
diag $@ if $@;
eval { $dbh->do('BEGIN TRANSACTION') };
like $@ => qr/cannot start a transaction/, "second BEGIN should fail";
eval { $dbh->begin_work };
like $@ => qr/Already in a transaction/, "and second begin_work also should fail";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'other statement should work';
diag $@ if $@;
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok $dbh->{AutoCommit}, "AutoCommit is turned on now";
ok !$dbh->{BegunWork}, "BegunWork is turned off";
# scenario 4: AutoCommit => 1 and begin_work and explicit but not immediate BEGIN
eval { $dbh->begin_work };
ok !$@, "begin_work works";
ok !$dbh->{AutoCommit}, "AutoCommit is turned off";
ok $dbh->{BegunWork}, "BegunWork is turned on";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'statement should work';
diag $@ if $@;
eval { $dbh->do('BEGIN TRANSACTION') };
like $@ => qr/cannot start a transaction/, "BEGIN after other statements should fail";
eval { $dbh->begin_work };
like $@ => qr/Already in a transaction/, "and second begin_work also should fail";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'other statement should work';
diag $@ if $@;
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok $dbh->{AutoCommit}, "AutoCommit is turned on now";
ok !$dbh->{BegunWork}, "BegunWork is turned off";
# scenario 5: AutoCommit => 1 and explicit BEGIN and no begin_work
ok $dbh->{AutoCommit}, "AutoCommit is on";
ok !$dbh->{BegunWork}, "BegunWork is off";
eval { $dbh->do('BEGIN TRANSACTION'); };
ok !$@, 'BEGIN should work';
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is turned off";
ok $dbh->{BegunWork}, "BegunWork is turned on";
eval { $dbh->do('BEGIN TRANSACTION') };
like $@ => qr/cannot start a transaction/, "second BEGIN should fail";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'other statement should work';
diag $@ if $@;
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok $dbh->{AutoCommit}, "AutoCommit is turned on now";
ok !$dbh->{BegunWork}, "BegunWork is turned off";
# scenario 6: AutoCommit => 1 and explicit BEGIN and begin_work
ok $dbh->{AutoCommit}, "AutoCommit is on";
ok !$dbh->{BegunWork}, "BegunWork is off";
eval { $dbh->do('BEGIN TRANSACTION'); };
ok !$@, 'BEGIN should work';
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is turned off";
ok $dbh->{BegunWork}, "BegunWork is turned on";
eval { $dbh->do('BEGIN TRANSACTION') };
like $@ => qr/cannot start a transaction/, "second BEGIN should fail";
eval { $dbh->begin_work };
like $@ => qr/Already in a transaction/, "and second begin_work also should fail";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'other statement should work';
diag $@ if $@;
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok $dbh->{AutoCommit}, "AutoCommit is turned on now";
ok !$dbh->{BegunWork}, "BegunWork is turned off";
# scenario 7: AutoCommit => 0 and explicit BEGIN
eval { $dbh->{AutoCommit} = 1 }; # to initialize
ok $dbh->{AutoCommit}, "AutoCommit is on";
ok !$dbh->{BegunWork}, "BegunWork is off";
eval { $dbh->{AutoCommit} = 0 };
ok !$@, "AutoCommit is turned off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
eval { $dbh->do('BEGIN TRANSACTION'); };
ok !$@, 'BEGIN should work';
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is turned off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
eval { $dbh->do('BEGIN TRANSACTION') };
like $@ => qr/cannot start a transaction/, "second BEGIN should fail";
eval { $dbh->begin_work };
like $@ => qr/Already in a transaction/, "and begin_work also should fail";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'other statement should work';
diag $@ if $@;
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is still off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
# scenario 8: AutoCommit => 0 and begin_work
eval { $dbh->{AutoCommit} = 1 }; # to initialize
ok $dbh->{AutoCommit}, "AutoCommit is on";
ok !$dbh->{BegunWork}, "BegunWork is off";
eval { $dbh->{AutoCommit} = 0 };
ok !$@, "AutoCommit is turned off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
eval { $dbh->begin_work; };
like $@ => qr/Already in a transaction/, "begin_work should fail";
ok !$dbh->{AutoCommit}, "AutoCommit is still off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
eval { $dbh->do('BEGIN TRANSACTION') };
ok !$@, "BEGIN should work";
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is still off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
eval { $dbh->begin_work };
like $@ => qr/Already in a transaction/, "and second begin_work also should fail";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'other statement should work';
diag $@ if $@;
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is still off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
# scenario 9: AutoCommit => 0 and implicit BEGIN
eval { $dbh->{AutoCommit} = 1 }; # to initialize
ok $dbh->{AutoCommit}, "AutoCommit is on";
ok !$dbh->{BegunWork}, "BegunWork is off";
eval { $dbh->{AutoCommit} = 0 };
ok !$@, "AutoCommit is turned off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
eval { $dbh->do('insert into foo (id) values (1)'); };
ok !$@, 'other statement should work';
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is still off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
eval { $func->($dbh) };
ok !$@, 'rolled back/committed';
diag $@ if $@;
ok !$dbh->{AutoCommit}, "AutoCommit is still off";
ok !$dbh->{BegunWork}, "BegunWork is still off";
}
eval { $dbh->{AutoCommit} = 1 }; # to end transaction
$dbh->disconnect;
done_testing;
|