AnyEvent-DBI-MySQL
view release on metacpan or search on metacpan
lib/AnyEvent/DBI/MySQL.pm view on Meta::CPAN
use Carp;
use Scalar::Util qw( weaken );
my $GLOBAL_DESTRUCT = 0;
END { $GLOBAL_DESTRUCT = 1; }
sub DESTROY {
my ($dbh) = @_;
if ($GLOBAL_DESTRUCT) {
return $dbh->SUPER::DESTROY();
}
$DATA[ $dbh->{$PRIVATE} ] = {};
push @NEXT_ID, $dbh->{$PRIVATE};
if (!$dbh->{Active}) {
$dbh->SUPER::DESTROY();
}
else {
# un-weaken cached $dbh to keep it for next connect_cached()
my $cache = $dbh->{Driver}{CachedKids};
for (grep {$cache->{$_} && $cache->{$_} == $dbh} keys %{$cache}) {
$cache->{$_} = $dbh;
}
}
return;
}
lib/AnyEvent/DBI/MySQL.pm view on Meta::CPAN
croak q{can't make more than one asynchronous query simultaneously};
}
$data->{cb} = pop @args;
$data->{h} = $dbh;
weaken($data->{h});
$args[1] //= {};
$args[1]->{async} //= 1;
if (!$args[1]->{async}) {
my $cb = delete $data->{cb};
my $h = delete $data->{h};
$cb->( $dbh->SUPER::do(@args), $h );
return;
}
}
else {
$args[1] //= {};
if ($args[1]->{async}) {
croak q{callback required};
}
}
return $dbh->SUPER::do(@args);
}
sub prepare {
my ($dbh, @args) = @_;
local $SIG{__WARN__} = sub { (my $msg=shift)=~s/ at .*//ms; carp $msg };
$args[1] //= {};
$args[1]->{async} //= 1;
my $sth = $dbh->SUPER::prepare(@args) or return;
$sth->{$PRIVATE} = $dbh->{$PRIVATE};
$sth->{$PRIVATE_async} = $args[1]->{async};
return $sth;
}
{ # replace C implementations in Driver.xst because it doesn't play nicely with DBI subclassing
no warnings 'redefine';
*DBI::db::selectrow_array = \&DBD::_::db::selectrow_array;
*DBI::db::selectrow_arrayref= \&DBD::_::db::selectrow_arrayref;
*DBI::db::selectall_arrayref= \&DBD::_::db::selectall_arrayref;
lib/AnyEvent/DBI/MySQL.pm view on Meta::CPAN
my @methods = qw(
selectcol_arrayref
selectrow_hashref
selectall_hashref
selectrow_array
selectrow_arrayref
selectall_arrayref
);
for (@methods) {
my $method = $_;
my $super = "SUPER::$method";
no strict 'refs';
*{$method} = sub {
my ($dbh, @args) = @_;
local $SIG{__WARN__} = sub { (my $msg=shift)=~s/ at .*//ms; carp $msg };
my $attr_idx = $method eq 'selectall_hashref' ? 2 : 1;
my $ref = ref $args[$attr_idx];
if ($ref eq 'CODE' || $ref eq 'AnyEvent::CondVar') {
splice @args, $attr_idx, 0, {};
} else {
lib/AnyEvent/DBI/MySQL.pm view on Meta::CPAN
my $ref = ref $args[-1];
if ($ref eq 'CODE' || $ref eq 'AnyEvent::CondVar') {
if ($data->{cb}) {
croak q{can't make more than one asynchronous query simultaneously};
}
$data->{cb} = pop @args;
$data->{h} = $sth;
if (!$sth->{$PRIVATE_async}) {
my $cb = delete $data->{cb};
my $h = delete $data->{h};
$cb->( $sth->SUPER::execute(@args), $h );
return;
}
$sth->SUPER::execute(@args);
if ($sth->err) { # execute failed, I/O won't happens
my $cb = delete $data->{cb};
my $h = delete $data->{h};
my $args=delete $data->{call_again};
$cb->( undef, $h, $args // () );
}
return;
}
elsif ($sth->{$PRIVATE_async}) {
croak q{callback required};
}
return $sth->SUPER::execute(@args);
}
package AnyEvent::DBI::MySQL::st::ready;
use base qw( DBI::st );
sub execute { return '0E0' };
1; # Magic true value required at end of module
__END__
( run in 1.133 second using v1.01-cache-2.11-cpan-49f99fa48dc )