DBIx-Poggy
view release on metacpan or search on metacpan
lib/DBIx/Poggy.pm view on Meta::CPAN
use strict;
use warnings;
use v5.14;
package DBIx::Poggy;
our $VERSION = '0.08';
use Scalar::Util qw(weaken refaddr);
=head1 NAME
DBIx::Poggy - async Pg with AnyEvent and Promises
=head1 SYNOPSIS
use strict;
use warnings;
lib/DBIx/Poggy.pm view on Meta::CPAN
unless ( $dbh->ping ) {
warn "connection is not alive, dropping";
next;
}
}
last;
}
if ( $args{auto} ) {
$dbh->{private_poggy_state}{release_to} = $self;
weaken $dbh->{private_poggy_state}{release_to};
return $dbh;
}
return $dbh unless wantarray;
return ( $dbh, guard { $self->release($dbh) } );
}
=head2 release
Takes a handle as argument and puts it back into the pool. At the moment,
no protection against double putting or active queries on the handle.
lib/DBIx/Poggy/DBI.pm view on Meta::CPAN
supported methods below:
=cut
package DBIx::Poggy::DBI::db;
use base 'DBI::db';
use AnyEvent;
use DBD::Pg qw(:async);
use Promises qw(collect deferred);
use Scalar::Util qw(weaken blessed);
use Guard qw(guard);
use Devel::GlobalDestruction;
sub connected {
my $self= shift;
$self->{private_poggy_state} = {active => 0, queue => []};
return;
}
=head2 METHODS
lib/DBIx/Poggy/DBI.pm view on Meta::CPAN
$args->{pg_async} |= PG_ASYNC;
my $sth = $self->SUPER::prepare( @_ );
return $sth unless $sth;
my $state = $self->{private_poggy_state};
$state->{active}++;
my $wself = $self;
weaken $wself;
$sth->{private_poggy_guard} = guard {
--$state->{active};
return unless @{ $state->{queue} };
unless ($wself) {
warn "still have pending sql queries, but dbh has gone away";
return;
}
$wself->_do_async( @{ shift @{$state->{queue}} } );
};
( run in 0.712 second using v1.01-cache-2.11-cpan-65fba6d93b7 )