The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
our $VERSION = '0.000004';
use Carp qw/croak/;
+ready
+started
+result
};
sub start {
my $self = shift;
croak "Async query already started" if $self->{+STARTED};
$self->{+STARTED} = $self->{+SOURCE}->do_select($self->params, async => $self);
return $self;
}
sub started { $_[0]->{+STARTED} ? $_[0] : undef }
sub sth { $_[0]->{+STARTED} ? $_[0]->{+STARTED}->{sth} : croak 'Async query has not been started (did you forget to call $s->start?)' }
sub ready {
my $self = shift;
return $self if defined $self->{+READY};
my $started = $self->{+STARTED} or croak 'Async query has not been started (did you forget to call $s->start?)';
return undef unless $started->{ready}->();
$self->{+READY} = 1;
return $self;
}
sub cancel { $_[0]->discard }
sub result {
my $self = shift;
return $self->{+RESULT} if defined $self->{+RESULT};
$self->wait();
return $self->{+RESULT};
}
sub _rows {
my $self = shift;
return $self->{+ROWS} if $self->{+ROWS};
$self->wait();
return $self->{+ROWS};
}
sub wait {
my $self = shift;
return if exists $self->{+RESULT};
return if exists $self->{+ROWS};
my $started = $self->{+STARTED} or croak 'Async query has not been started (did you forget to call $s->start?)';
$self->{+READY} = 1;
$self->{+RESULT} = $started->{result}->();
$self->{+ROWS} = $started->{fetch}->();
$self->connection->async_stop($self);
return $self;
}
sub count { @{$_[0]->_rows} }
sub discard {
my $self = shift;
my $done = 0;
for my $field (ROWS(), READY(), RESULT()) {
$done = 1 if delete $self->{$field};
}
if (my $started = delete $self->{+STARTED}) {
$started->{cancel}->() unless $done;
}
$self->connection->async_stop($self);
return $self;
}
1;