DBD-BigQuery
view release on metacpan or search on metacpan
t/end-to-end/05-live-concurrency-multi-fd.t view on Meta::CPAN
use strict;
use warnings;
use Test::More;
use DBI;
use JSON::PP;
my ($project_id, $dataset_id, $creds);
if ($ENV{BIGQUERY_PROJECT} && $ENV{BIGQUERY_DATASET}) {
$project_id = $ENV{BIGQUERY_PROJECT};
$dataset_id = $ENV{BIGQUERY_DATASET};
} elsif (-f 'env.json') {
open my $fh, '<', 'env.json' or die $!;
my $data = do { local $/; <$fh> };
close $fh;
my $cfg = decode_json($data);
$project_id = $cfg->{project_id};
$dataset_id = $cfg->{dataset_id};
$creds = $cfg->{credentials_file};
}
if (!$project_id || !$dataset_id) {
plan skip_all => 'Live BigQuery credentials not configured (BIGQUERY_PROJECT/BIGQUERY_DATASET or env.json missing)';
}
plan tests => 5;
$ENV{GOOGLE_APPLICATION_CREDENTIALS} = $creds if $creds && -f $creds;
my $dbh = DBI->connect("dbi:BigQuery:project=$project_id;dataset=$dataset_id", '', '', { RaiseError => 1 });
my $sth1 = $dbh->prepare('SELECT 100 AS c1', { Async => 1 });
my $sth2 = $dbh->prepare('SELECT 200 AS c2', { Async => 1 });
is($sth1->execute(), '0E0', 'sth1 non-blocking execute returned 0E0');
is($sth2->execute(), '0E0', 'sth2 non-blocking execute returned 0E0');
my @active = ($sth1, $sth2);
my %results;
while (@active) {
my @next_active;
for my $sth (@active) {
if ($sth->FETCH('AsyncWantRead')) {
if ($sth->async_read_ready()) {
my $row = $sth->fetch_async_row();
$results{$sth} = $row->[0] if $row;
} else {
push @next_active, $sth;
}
}
}
@active = @next_active;
}
ok(defined $results{$sth1}, 'sth1 fetched result concurrently');
ok(defined $results{$sth2}, 'sth2 fetched result concurrently');
ok(!$sth1->FETCH('Active') && !$sth2->FETCH('Active'), 'Both concurrent handles finished');
( run in 2.125 seconds using v1.01-cache-2.11-cpan-007c89162af )