DBIx-TryAgain
view release on metacpan or search on metacpan
lib/DBIx/TryAgain/db.pm view on Meta::CPAN
package DBIx::TryAgain::db;
use strict;
use warnings;
our @ISA = 'DBI::db';
our %defaults = (
private_dbix_try_again_algorithm => 'fibonacci', # or exponential or linear or constant
private_dbix_try_again_max_retries => 5,
private_dbix_try_again_on_messages => [ qr/database is locked/i ],
);
sub try_again_algorithm {
my $self = shift;
my $attr = 'private_dbix_try_again_algorithm';
return $self->{$attr} || $defaults{$attr} unless @_;
$self->{$attr} = shift;
}
sub try_again_max_retries {
my $self = shift;
my $attr = 'private_dbix_try_again_max_retries';
return $self->{$attr} || $defaults{$attr} unless @_;
$self->{$attr} = shift;
}
sub try_again_on_messages {
my $self = shift;
my $attr = 'private_dbix_try_again_on_messages';
return $self->{$attr} || $defaults{$attr} unless @_;
die "messages should be an array ref" if ref($_[0]) ne 'ARRAY';
$self->{$attr} = shift;
}
sub try_again_on_prepare {
my $self = shift;
my $attr = 'private_dbix_try_again_on_prepare';
return $self->{$attr} || $defaults{$attr} unless @_;
$self->{$attr} = shift;
}
sub _should_try_again {
my $self = shift;
return unless $self->try_again_on_prepare;
return $self->DBIx::TryAgain::st::_should_try_again(@_);
}
sub _sleep {
return shift->DBIx::TryAgain::st::_sleep(@_);
}
sub prepare {
my $self = shift;
my @args = @_;
for (keys %defaults) {
$self->{$_} = $defaults{$_} unless defined($self->{$_});
}
my $sth = $self->SUPER::prepare(@args);
if ($self->try_again_on_prepare) {
$self->_sleep('init');
$self->{private_dbix_try_again_tries} = 0;
}
while (!$sth && $self->_should_try_again) {
$self->{private_dbix_try_again_tries}++;
for ("DBIx::TryAgain [$$] prepare attempt number ".$self->{private_dbix_try_again_tries}."\n") {
( run in 0.666 second using v1.01-cache-2.11-cpan-99c4e6809bf )