/usr/share/perl5/Apache/Session/Lock/MySQL.pm is in libapache-session-perl 1.93-2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | ############################################################################
#
# Apache::Session::Lock::MySQL
# MySQL locking for Apache::Session
# Copyright(c) 2000 Jeffrey William Baker (jwbaker@acm.org)
# Distribute under the Perl License
#
############################################################################
package Apache::Session::Lock::MySQL;
use strict;
use DBI;
use vars qw($VERSION);
$VERSION = '1.01';
sub new {
my $class = shift;
return bless {lock => 0, lockid => undef, dbh => undef, mine => 0}, $class;
}
sub acquire_read_lock {
my $self = shift;
my $session = shift;
return if $self->{lock};
if (!defined $self->{dbh}) {
if (defined $session->{args}->{LockHandle}) {
$self->{dbh} = $session->{args}->{LockHandle};
}
else {
$self->{dbh} = DBI->connect(
$session->{args}->{LockDataSource},
$session->{args}->{LockUserName},
$session->{args}->{LockPassword},
{ RaiseError => 1, AutoCommit => 1 }
);
$self->{mine} = 1;
}
}
local $self->{dbh}->{RaiseError} = 1;
$self->{lockid} = "Apache-Session-$session->{data}->{_session_id}";
#MySQL requires a timeout on the lock operation. There is no option
#to simply wait forever. So we'll wait for a hour.
my $sth = $self->{dbh}->prepare_cached(q{SELECT GET_LOCK(?, 3600)}, {}, 1);
$sth->execute($self->{lockid});
$sth->finish();
$self->{lock} = 1;
}
sub acquire_write_lock {
$_[0]->acquire_read_lock($_[1]);
}
sub release_read_lock {
my $self = shift;
if ($self->{lock}) {
local $self->{dbh}->{RaiseError} = 1;
my $sth = $self->{dbh}->prepare_cached(q{SELECT RELEASE_LOCK(?)}, {}, 1);
$sth->execute($self->{lockid});
$sth->finish();
$self->{lock} = 0;
}
}
sub release_write_lock {
$_[0]->release_read_lock;
}
sub release_all_locks {
$_[0]->release_read_lock;
}
sub DESTROY {
my $self = shift;
$self->release_all_locks;
if ($self->{mine}) {
$self->{dbh}->disconnect;
}
}
1;
=pod
=head1 NAME
Apache::Session::Lock::MySQL - Provides mutual exclusion using MySQL
=head1 SYNOPSIS
use Apache::Session::Lock::MySQL;
my $locker = Apache::Session::Lock::MySQL->new();
$locker->acquire_read_lock($ref);
$locker->acquire_write_lock($ref);
$locker->release_read_lock($ref);
$locker->release_write_lock($ref);
$locker->release_all_locks($ref);
=head1 DESCRIPTION
Apache::Session::Lock::MySQL fulfills the locking interface of
Apache::Session. Mutual exclusion is achieved through the use of MySQL's
GET_LOCK and RELEASE_LOCK functions. MySQL does not support the notion
of read and write locks, so this module only supports exclusive locks. When
you request a shared read lock, it is instead promoted to an exclusive
write lock.
=head1 CONFIGURATION
The module must know how to connect to your MySQL database to acquire locks.
You must provide a datasource name, a user name, and a password. These options
are passed in the usual Apache::Session style, and are very similar to the
options for Apache::Session::Store::MySQL. Example:
tie %hash, 'Apache::Session::MySQL', $id, {
LockDataSource => 'dbi:mysql:database',
LockUserName => 'database_user',
LockPassword => 'K00l'
};
Instead, you may pass in an already opened DBI handle to your database.
tie %hash, 'Apache::Session::MySQL', $id, {
LockHandle => $dbh
};
=head1 AUTHOR
This module was written by Jeffrey William Baker <jwbaker@acm.org>.
=head1 SEE ALSO
L<Apache::Session>
|