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 )