EV-MariaDB
view release on metacpan or search on metacpan
t/14_new_features.t view on Meta::CPAN
$m->set_charset("definitely_not_a_charset_xyz", sub {
my ($ok, $err) = @_;
ok($err, 'set_charset error: bad charset returns error');
EV::break;
});
});
# autocommit toggle: 0 then 1 round-trip
with_mariadb(cb => sub {
$m->autocommit(0, sub {
my (undef, $err1) = @_;
ok(!$err1, 'autocommit(0): no error');
$m->autocommit(1, sub {
my (undef, $err2) = @_;
ok(!$err2, 'autocommit(1): no error (re-enable)');
EV::break;
});
});
});
# close_stmt fast-path callback receives (1, undef) after reset invalidation
with_mariadb(cb => sub {
$m->prepare("select 1", sub {
my ($stmt, $err) = @_;
die $err if $err;
$m->on_connect(sub {
$m->close_stmt($stmt, sub {
my ($ok, $cerr) = @_;
ok($ok, 'close_stmt fast-path: ok==1 after reset');
ok(!defined $cerr, 'close_stmt fast-path: undef err after reset');
EV::break;
});
});
$m->reset;
});
});
# close_stmt with a NULL/zero handle croaks instead of crashing
with_mariadb(cb => sub {
eval { $m->close_stmt(0, sub {}) };
like($@, qr/invalid statement handle/, 'close_stmt: NULL handle croaks');
EV::break;
});
# reset_connection invalidates server-side prepared statements: subsequent
# execute on a stmt prepared before reset_connection must croak (closed=1)
with_mariadb(cb => sub {
$m->prepare("select 1", sub {
my ($stmt, $err) = @_;
die $err if $err;
$m->reset_connection(sub {
my (undef, $rerr) = @_;
ok(!$rerr, 'reset_connection invalidate: reset ok');
eval { $m->execute($stmt, [], sub {}) };
like($@, qr/no longer valid/, 'reset_connection invalidate: stmt marked closed');
$m->close_stmt($stmt, sub { EV::break });
});
});
});
# Failed change_user must NOT corrupt cached credentials â reset() should
# reconnect with the original user, not the failed one. If the rollback
# is broken, reset() fires on_error with auth failure; we trap that
# explicitly so the regression surfaces as a named failing test, not as
# a TAP plan-count mismatch.
with_mariadb(
cb => sub {
my $orig_user = $TestMariaDB::user;
$m->change_user("__definitely_not_a_real_user_$$", "wrong", undef, sub {
my (undef, $err) = @_;
ok($err, 'change_user rollback: bad creds rejected');
$m->on_connect(sub {
$m->q("select current_user()", sub {
my ($r, $qerr) = @_;
ok(!$qerr, 'change_user rollback: query after reset ok');
like($r->[0][0], qr/^\Q$orig_user\E\@/,
'change_user rollback: reset reconnected as original user');
EV::break;
});
});
$m->reset;
});
},
on_error => sub {
fail("change_user rollback: reset reconnect failed ($_[0]) â credential cache likely not rolled back");
fail("change_user rollback: query after reset never ran");
fail("change_user rollback: user check never ran");
EV::break;
},
);
( run in 0.474 second using v1.01-cache-2.11-cpan-140bd7fdf52 )