DBIx-Locker
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/DBIx/Locker.pm view on Meta::CPAN
#pod
#pod This is the I<entire> mechanism. This is quick and dirty and quite effective,
#pod but it's not highly efficient. If you need high speed locks with multiple
#pod levels of resolution, or anything other than a quick and brutal solution,
#pod I<keep looking>.
#pod
#pod =head1 STORAGE
#pod
#pod To use this module you'll need to create the lock table, which should have five
#pod columns:
#pod
#pod =over
#pod
#pod =item * C<id> Autoincrementing ID is recommended
#pod
#pod =item * C<lockstring> varchar(128) with a unique constraint
#pod
#pod =item * C<created> datetime
#pod
#pod =item * C<expires> datetime
#pod
#pod =item * C<locked_by> text
#pod
#pod =back
#pod
#pod See the C<sql> directory included in this dist for DDL for your database.
#pod
#pod =method new
#pod
#pod my $locker = DBIx::Locker->new(\%arg);
#pod
#pod This returns a new locker.
#pod
#pod Valid arguments are:
#pod
#pod dbh - a database handle to use for locking
#pod dbi_args - an arrayref of args to pass to DBI->connect to reconnect to db
#pod table - the table for locks
#pod
#pod =cut
sub new {
my ($class, $arg) = @_;
my $guts = {
dbh => $arg->{dbh},
dbi_args => ($arg->{dbi_args} || $class->default_dbi_args),
table => ($arg->{table} || $class->default_table),
};
Carp::confess("cannot use a dbh without RaiseError")
if $guts->{dbh} and not $guts->{dbh}{RaiseError};
my $dbi_attr = $guts->{dbi_args}[3] ||= {};
Carp::confess("RaiseError cannot be disabled")
if exists $dbi_attr->{RaiseError} and not $dbi_attr->{RaiseError};
$dbi_attr->{RaiseError} = 1;
return bless $guts => $class;
}
#pod =method default_dbi_args
#pod
#pod =method default_table
#pod
#pod These methods may be defined in subclasses to provide defaults to be used when
#pod constructing a new locker.
#pod
#pod =cut
sub default_dbi_args {
Carp::confess('dbi_args not given and no default defined')
}
sub default_table {
Carp::Confess('table not given and no default defined')
}
#pod =method dbh
#pod
#pod This method returns the locker's dbh.
#pod
#pod =cut
sub dbh {
my ($self) = @_;
return $self->{dbh} if $self->{dbh} and eval { $self->{dbh}->ping };
die("couldn't connect to database: $DBI::errstr")
unless my $dbh = DBI->connect(@{ $self->{dbi_args} });
return $self->{dbh} = $dbh;
}
#pod =method table
#pod
#pod This method returns the name of the table in the database in which locks are
#pod stored.
#pod
#pod =cut
sub table {
return $_[0]->{table}
}
#pod =method lock
#pod
#pod my $lock = $locker->lock($lockstring, \%arg);
#pod
#pod This method attempts to return a new DBIx::Locker::Lock.
#pod
#pod =cut
my $JSON;
BEGIN { $JSON = JSON->new->canonical(1)->space_after(1); }
sub lock {
my ($self, $lockstring, $arg) = @_;
$arg ||= {};
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.961 second using v1.00-cache-2.02-grep-82fe00e-cpan-9f2165ba459b )