EV-MariaDB
view release on metacpan or search on metacpan
t/14_new_features.t view on Meta::CPAN
});
});
});
# stmt wrappers freed on reset (no close_stmt needed)
with_mariadb(cb => sub {
$m->prepare("select 1", sub {
my ($stmt, $err) = @_;
ok(!$err, 'stmt cleanup on reset: prepare ok');
$m->execute($stmt, undef, sub {
my ($r, $e) = @_;
ok(!$e && $r->[0][0] == 1, 'stmt cleanup on reset: execute ok');
# reset without close_stmt â stmt wrapper should be freed internally
$m->reset;
});
});
# after reset, on_connect fires again
$m->on_connect(sub {
$m->q("select 42", sub {
my ($r, $e) = @_;
ok(!$e && $r->[0][0] == 42, 'stmt cleanup on reset: works after reset');
EV::break;
});
});
});
# stale stmt handle after reset: croaks instead of crashing
with_mariadb(cb => sub {
$m->prepare("select 1", sub {
my ($stmt, $err) = @_;
ok(!$err, 'stale stmt: prepare ok');
$m->reset;
});
$m->on_connect(sub {
# now $stmt from the old connection is invalidated
# close_stmt should succeed (no-op) on an already-closed handle
# but execute should croak
# we don't have $stmt here, so test via a fresh prepare + reset cycle
$m->prepare("select 1", sub {
my ($stmt2, $err2) = @_;
ok(!$err2, 'stale stmt: prepare on new connection ok');
$m->close_stmt($stmt2, sub { EV::break });
});
});
});
# fork safety: child DESTROY must not kill parent connection
with_mariadb(cb => sub {
my $pid = fork;
if (!defined $pid) {
fail("fork safety: fork failed: $!");
EV::break;
return;
}
if ($pid == 0) {
# child: just exit â DESTROY should skip mysql_close
exit 0;
}
# parent: wait for child, then verify connection still works
waitpid($pid, 0);
$m->q("select 'alive'", sub {
my ($r, $e) = @_;
ok(!$e && $r->[0][0] eq 'alive', 'fork safety: parent connection survives child exit');
EV::break;
});
});
# utf8 option: text query results get UTF-8 flag
with_mariadb(utf8 => 1, charset => 'utf8mb4', cb => sub {
$m->q("select 'hello', _binary'raw'", sub {
my ($r, $e, $f) = @_;
ok(!$e, 'utf8 option: query ok');
ok(utf8::is_utf8($r->[0][0]), 'utf8 option: text column has UTF-8 flag');
ok(!utf8::is_utf8($r->[0][1]), 'utf8 option: binary column has no UTF-8 flag');
# prepared statement
$m->prepare("select ?", sub {
my ($stmt, $pe) = @_;
ok(!$pe, 'utf8 option: prepare ok');
$m->execute($stmt, ["test"], sub {
my ($pr, $pe2) = @_;
ok(utf8::is_utf8($pr->[0][0]), 'utf8 option: prepared stmt result has UTF-8 flag');
$m->close_stmt($stmt, sub { EV::break });
});
});
});
});
# utf8 round-trip: insert and read back Unicode via text query and prepared stmt
with_mariadb(utf8 => 1, charset => 'utf8mb4', cb => sub {
my $uni = "\x{263A}\x{2603}\x{1F600}"; # smiley, snowman, grinning face (4-byte)
$m->q("create temporary table _utf8rt (val varchar(100)) character set utf8mb4", sub {
die $_[1] if $_[1];
# insert via text query using escape
my $escaped = $m->escape($uni);
$m->q("insert into _utf8rt values ('$escaped')", sub {
die $_[1] if $_[1];
# read back via text query
$m->q("select val from _utf8rt", sub {
my ($r, $e) = @_;
ok(!$e, 'utf8 round-trip: text query select ok');
ok(utf8::is_utf8($r->[0][0]), 'utf8 round-trip: text result has UTF-8 flag');
is($r->[0][0], $uni, 'utf8 round-trip: text query data intact');
# insert + read via prepared stmt
$m->prepare("insert into _utf8rt values (?)", sub {
my ($istmt, $ie) = @_;
ok(!$ie, 'utf8 round-trip: prepare insert ok');
$m->execute($istmt, [$uni], sub {
die $_[1] if $_[1];
$m->close_stmt($istmt, sub {
$m->prepare("select val from _utf8rt order by val limit 1", sub {
my ($sstmt, $se) = @_;
ok(!$se, 'utf8 round-trip: prepare select ok');
$m->execute($sstmt, [], sub {
my ($pr, $pe) = @_;
ok(utf8::is_utf8($pr->[0][0]), 'utf8 round-trip: prepared result has UTF-8 flag');
is($pr->[0][0], $uni, 'utf8 round-trip: prepared stmt data intact');
$m->close_stmt($sstmt, sub { EV::break });
});
});
});
});
});
});
( run in 2.344 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )