Apache-Session

 view release on metacpan or  search on metacpan

lib/Apache/Session/Lock/Sybase.pm  view on Meta::CPAN

############################################################################
#
# Apache::Session::Lock::Sybase
# Sybase locking for Apache::Session
# Copyright(c) 2003 Oliver Maul (oli@42.nu)
# Distribute under the Perl License
#
############################################################################

package Apache::Session::Lock::Sybase;

use strict;

use DBI;
use vars qw($VERSION);

$VERSION = '1.00';

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}";
    
    my $sth = $self->{dbh}->prepare(q{sp_getapplock @Resource = '}.$self->{lockid}.q{',@LockMode='Exclusive',@LockOwner='Session',@LockTimeout = '3600000'});
    $sth->execute() || die $DBI::errstr;
    
    $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(q{sp_releaseapplock @Resource='}.$self->{lockid}.q{',@Lookowner='Session'});
        $sth->execute() || die $DBI::errstr;
        
        $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::Sybase - Provides mutual exclusion using Sybase

=head1 SYNOPSIS

 use Apache::Session::Lock::Sybase;

 my $locker = Apache::Session::Lock::Sybase->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);



( run in 0.551 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )