MariaDB-NonBlocking

 view release on metacpan or  search on metacpan

lib/MariaDB/NonBlocking.pm  view on Meta::CPAN

package MariaDB::NonBlocking;

use v5.18.2; # needed for __SUB__, implies strict
use warnings;
use Sub::StrictDecl;

use constant DEBUG => $ENV{MariaDB_NonBlocking_DEBUG} // 0;
sub TELL (@) {
    say STDERR __PACKAGE__, ': ', join " ", @_;
}

use Carp (); # for confess

=head1 NAME

MariaDB::NonBlocking - Nonblocking connections to MySQL using libmariadbclient

=head1 VERSION

Version 0.31

=cut

use Exporter qw(import);
use XSLoader qw();

BEGIN {
    our $VERSION = '0.31';
    XSLoader::load(__PACKAGE__);
};

our @EXPORT_OK = qw/
    MYSQL_WAIT_READ
    MYSQL_WAIT_WRITE
    MYSQL_WAIT_EXCEPT
    MYSQL_WAIT_TIMEOUT
/;
our %EXPORT_TAGS = (
    'all' => [ @EXPORT_OK ]
);

use constant {
    OPERATION_RUN_QUERY => 0x01,
    OPERATION_CONNECT   => 0x02,
    OPERATION_PING      => 0x04,
};

# Better to import this, since it is a custom op
use Ref::Util qw(is_arrayref is_coderef);
use Scalar::Util qw(weaken);

sub new {
    my $class = shift;
    my $obj = $class->init;
    return $obj;
}

sub ___clean_object {
    my ($maria) = @_;
    delete $maria->{pending};
    delete $maria->{in_use};
    $maria->_clean_object
}

sub _clean_object { ... } # Must be overriden

sub _set_timer { # Must be overriden
    my ($maria, $timer_type, $timeout_s, $cb) = @_;
    ...
}
sub _disarm_timer { # Must be overriden
    my ($maria, $timer_type) = @_;
    ...
}

sub _set_io_watcher { # Must be overriden
    my ($maria, $fd, $wait_type, $cb) = @_;
    ...
}

sub start_work {
    my ($maria, $operation, $operation_args) = @_;
    $maria->{in_use} = 1;
    if ( $operation == OPERATION_RUN_QUERY ) {
        return $maria->run_query_start( @{ $operation_args || [] } );
    }
    elsif ( $operation == OPERATION_CONNECT ) {
        return $maria->connect_start($operation_args);
    }
    elsif ( $operation == OPERATION_PING ) {
        return $maria->ping_start;
    }
    else {
        ...
    }
}

sub work_done {
    my ($maria, $operation) = @_;
    if ( $operation == OPERATION_RUN_QUERY ) {
        return $maria->query_results;
    }
    elsif ( $operation == OPERATION_PING ) {
        return $maria->ping_result;
    }
    elsif ( $operation == OPERATION_CONNECT ) {
        return $maria;
    }
    else {



( run in 1.983 second using v1.01-cache-2.11-cpan-39bf76dae61 )