DBIx-QueryByName
view release on metacpan or search on metacpan
lib/DBIx/QueryByName/SthPool.pm view on Meta::CPAN
package DBIx::QueryByName::SthPool;
use utf8;
use strict;
use warnings;
use Data::Dumper;
use DBI;
use Carp qw(cluck);
use DBIx::QueryByName::Logger qw(get_logger debug);
use Scalar::Util qw(weaken);
sub _add_sth {
my ($self,$query,$sth) = @_;
get_logger->logcroak("undefined query or statement handler")
if (!defined $query || !defined $sth);
$self->{sths}->{$$}->{$query} = $sth;
}
sub _get_sth {
my ($self,$query) = @_;
get_logger->logcroak("undefined query")
if (!defined $query);
return $self->{sths}->{$$}->{$query};
}
sub new {
return bless( { sths => {} }, $_[0] );
}
sub parent {
my ($self, $parent) = @_;
$self->{dbhpool} = $parent->_dbh_pool;
weaken $self->{dbhpool};
$self->{querypool} = $parent->_query_pool;
}
sub finish_all_sths {
my $self = shift;
debug "Closing all sths for pid $$";
foreach my $query ( keys %{$self->{sths}->{$$}} ) {
if (defined $self->{sths}->{$$}->{$query}) {
$self->{sths}->{$$}->{$query}->finish;
}
}
delete $self->{sths}->{$$};
}
sub _prepare {
my ($self,$query) = @_;
my $log = get_logger();
my ($session,$sql) = $self->{querypool}->get_query($query);
if (defined $self->_get_sth($query)) {
debug "Query is already prepared. Using cached value.";
return $self->_get_sth($query);
}
my $dbh = $self->{dbhpool}->connect($session);
debug "Preparing query $query";
my $sth = $dbh->prepare($sql);
# TODO: add more verbose error description?
# TODO: retry in some smart way?
if (!defined $sth) {
$log->logcroak("failed to prepare query [$query]. Trace: ".cluck);
}
$self->_add_sth($query,$sth);
return $sth;
}
sub prepare_and_execute {
my ($self,%args) = @_;
my $log = get_logger();
my $query = $args{query_name} || $log->logcroak("undefined query name");
my $bulk_insertion = $args{bulk_insertion};
$log->logcroak("undefined bulk insertion flag") if (!defined $bulk_insertion);
$log->logcroak("undefined or wrong query args")
if (!exists $args{query_args} || ref $args{query_args} ne 'ARRAY');
my @args = @{$args{query_args}};
my ($session,undef) = $self->{querypool}->get_query($query);
my $retry = $self->{querypool}->get_retry_attribute($query);
my $error_connection_lost = qr/could not connect to server|no connection to the server|terminating connection due to administrator command/;
my $error_state_unknown = qr/server closed the connection unexpectedly|could not receive data from server|terminating connection due to administrator command/;
my $sth = $self->_prepare($query);
( run in 2.291 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )