DBIO-PostgreSQL-Async
view release on metacpan or search on metacpan
t/10-integration.t view on Meta::CPAN
my $connected = 0;
my $pg;
$pg = EV::Pg->new(
conninfo => $conninfo,
on_connect => sub { $connected = 1 },
on_error => sub { diag "EV::Pg error: $_[0]"; $connected = -1 },
);
# Run event loop until connected
EV::run until $connected;
if ($connected < 0) {
plan skip_all => "Could not connect to PostgreSQL: check DBIO_TEST_PG_DSN";
}
ok $connected > 0, 'connected to PostgreSQL';
diag "Server version: " . $pg->server_version;
# --- Simple query ---
{
my $done = 0;
my ($result_rows, $result_err);
$pg->query('SELECT 1 AS one', sub {
($result_rows, $result_err) = @_;
$done = 1;
});
EV::run until $done;
ok !$result_err, 'no error on SELECT 1';
is $result_rows->[0][0], 1, 'got correct result from SELECT 1';
}
# --- Parameterized query ---
{
my $done = 0;
my ($rows, $err);
$pg->query_params('SELECT $1::text AS greeting', ['hello DBIO'], sub {
($rows, $err) = @_;
$done = 1;
});
EV::run until $done;
ok !$err, 'no error on parameterized query';
is $rows->[0][0], 'hello DBIO', 'parameterized query works';
}
# --- Multiple queries chained ---
{
my @results;
my $done = 0;
# EV::Pg processes one query at a time per connection (outside pipeline),
# so we chain them in callbacks
my @vals = (1..5);
my $run_next; $run_next = sub {
my $i = shift @vals;
unless (defined $i) { $done = 1; return }
$pg->query_params('SELECT $1::int * 2 AS doubled', [$i], sub {
my ($rows, $err) = @_;
push @results, $rows->[0][0] unless $err;
$run_next->();
});
};
$run_next->();
EV::run until $done;
is_deeply \@results, [2, 4, 6, 8, 10],
'chained queries all return correct results in order';
}
# --- Pipeline mode ---
{
$pg->enter_pipeline;
my @results;
my $count = 0;
for my $i (1..3) {
$pg->query_params('SELECT $1::int AS num', [$i], sub {
my ($rows, $err) = @_;
push @results, $rows->[0][0] unless $err;
$count++;
});
}
my $synced = 0;
$pg->pipeline_sync(sub { $synced = 1 });
EV::run until $synced;
$pg->exit_pipeline;
is scalar @results, 3, 'pipeline returned 3 results';
is_deeply [sort { $a <=> $b } @results], [1, 2, 3],
'pipeline mode returns correct results';
}
# --- Prepared statement ---
{
my $prepared = 0;
$pg->prepare('test_add', 'SELECT $1::int + $2::int AS sum', sub {
$prepared = 1;
});
EV::run until $prepared;
my $done = 0;
my ($rows, $err);
$pg->query_prepared('test_add', [17, 25], sub {
($rows, $err) = @_;
$done = 1;
( run in 2.203 seconds using v1.01-cache-2.11-cpan-6aa56a78535 )