# #
# File: shared/Posting/Cache.pm #
# #
-# Authors: André Malo <nd@o3media.de>, 2001-04-21 #
+# Authors: André Malo <nd@o3media.de> #
# #
# Description: Views/Voting Cache class #
# #
################################################################################
use strict;
-use vars qw(
- $VERSION
-);
-
use Fcntl;
use File::Path;
-use Lock qw(:ALL);
+use Lock;
################################################################################
#
# Version check
#
-$VERSION = do { my @r =(q$Revision$ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
+# last modified:
+# $Date$ (GMT)
+# by $Author$
+#
+sub VERSION {(q$Revision$ =~ /([\d.]+)\s*$/)[0] or '0.0'}
-my $O_BINARY = eval "O_BINARY";
+my $O_BINARY = eval "local $SIG{__DIE__}; O_BINARY";
$O_BINARY = 0 if ($@);
### sub new ####################################################################
}
sub r_add_posting {
my ($self, $handle, $param) = @_;
- local *FILE;
+ my $newfile = new Lock ($self->cachefile($param));
local $\;
unless (-d $self -> threaddir($param)) {
- mkdir $self->threaddir($param) or return;
+ mkdir $self->threaddir($param), 0777 or return;
}
- sysopen (
- FILE,
- $self->cachefile($param),
- O_WRONLY | O_CREAT | O_TRUNC
- ) or return;
- close FILE or return;
+ $newfile -> open (O_WRONLY | O_CREAT | O_TRUNC) or return;
+ $newfile -> close or return;
my $z;
if (-s $handle) {
'L4' => $param->{posting}, $param->{thread}, 0, 0
) or return;
- release_file ($self->cachefile($param));
+ $newfile -> release;
1;
}
sub add_wrap {
my ($self, $gosub, @param) = @_;
my $status;
+ my $summary = new Lock ($self -> summaryfile);
- unless (write_lock_file ($self->summaryfile)) {
- violent_unlock_file ($self->summaryfile);
- $self->set_error ('could not write-lock summary file '.$self->summaryfile);
+ unless ($summary -> lock (LH_EXCL)) {
+ $self->set_error ('could not write-lock summary file '.$summary -> filename);
}
else {
- local *SUM;
- unless (sysopen (SUM, $self->summaryfile, $O_BINARY | O_APPEND | O_CREAT | O_RDWR)) {
+ unless ($summary -> open($O_BINARY | O_APPEND | O_CREAT | O_RDWR)) {
$self->set_error
- ('could not open to read/write/append summary file '.$self->summaryfile);
+ ('could not open to read/write/append summary file '.$summary->filename);
}
else {
$status = $gosub -> (
$self,
- \*SUM,
+ $summary,
@param
);
- unless (close SUM) {
+ unless ($summary -> close) {
$status=0;
- $self->set_error('could not close summary file '.$self->summaryfile);
+ $self->set_error('could not close summary file '.$summary -> filename);
}
}
- violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile));
+ $summary -> unlock;
}
# return
sub vote_wrap {
my ($self, $gosub, $param) = @_;
my $status;
+ my $summary = new Lock ($self -> summaryfile);
- unless (write_lock_file ($self->summaryfile)) {
- violent_unlock_file ($self->summaryfile);
- $self->set_error ('could not write-lock summary file '.$self->summaryfile);
+ unless ($summary -> lock (LH_EXCL)) {
+ $self->set_error ('could not write-lock summary file '.$summary -> filename);
}
else {
- local *S;
- unless (sysopen (S, $self->summaryfile, O_RDWR | $O_BINARY)) {
- $self->set_error ('could not open to read/write summary file '.$self->summaryfile);
+ unless ($summary -> open (O_RDWR | $O_BINARY)) {
+ $self->set_error ('could not open to read/write summary file '.$summary -> filename);
}
else {
unless (-d $self->threaddir($param)) {
- mkdir $self->threaddir($param) or return;
+ mkdir $self->threaddir($param), 0777 or return;
}
- my $filename = $self->cachefile($param);
+ my $cache = new Lock ($self->cachefile($param));
- unless (write_lock_file ($filename)) {
- violent_unlock_file ($filename);
- $self->set_error ('could not write-lock cache file '.$filename);
+ unless ($cache -> lock (LH_EXCL)) {
+ $self->set_error ('could not write-lock cache file '.$cache -> filename);
}
else {
- local *CACHE;
- unless (sysopen (CACHE, $filename, O_APPEND | O_CREAT | O_RDWR)) {
- $self->set_error ('could not open to read/write/append cache file '.$filename);
+ unless ($cache -> open (O_APPEND | O_CREAT | O_RDWR)) {
+ $self->set_error ('could not open to read/write/append cache file '.$cache -> filename);
}
else {
$status = $gosub -> (
$self,
- \*S,
- \*CACHE,
+ $summary,
+ $cache,
$param
);
- unless (close CACHE) {
+ unless ($cache -> close) {
$status=0;
- $self->set_error('could not close cache file '.$filename);
+ $self->set_error('could not close cache file '.$cache -> filename);
}
}
- violent_unlock_file ($filename) unless (write_unlock_file ($filename));
+ $cache -> unlock;
}
- unless (close S) {
+ unless ($summary -> close) {
$status=0;
- $self->set_error('could not close summary file '.$self->summaryfile);
+ $self->set_error('could not close summary file '.$summary -> filename);
}
}
- violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile));
+ $summary -> unlock;
}
# return
sub purge_wrap {
my ($self, $gosub, @param) = @_;
my $status;
- my $filename = $self -> summaryfile . '.temp';
+ my $summary = new Lock ($self -> summaryfile);
- unless (write_lock_file ($self->summaryfile)) {
- violent_unlock_file ($self->summaryfile);
- $self->set_error ('could not write-lock summary file '.$self->summaryfile);
+ unless ($summary -> lock (LH_EXSH)) {
+ $self->set_error ('could not write-lock summary file '.$summary -> filename);
}
else {
- local *TEMP;
- unless (sysopen (TEMP, $filename, O_CREAT | O_WRONLY | O_TRUNC | $O_BINARY)) {
- $self->set_error ('could not open to write temp summary file '.$filename);
+ my $temp = new Lock::Handle ($summary -> filename . '.temp');
+ unless ($temp -> open (O_CREAT | O_WRONLY | O_TRUNC | $O_BINARY)) {
+ $self->set_error ('could not open to write temp summary file '.$temp -> filename);
}
else {
- local *S;
- unless (sysopen (S, $self->summaryfile, O_RDONLY | $O_BINARY)) {
- $self->set_error ('could not open to read summary file '.$self->summaryfile);
+ unless ($summary -> open (O_RDONLY | $O_BINARY)) {
+ $self->set_error ('could not open to read summary file '.$summary -> filename);
}
else {
$status = $gosub -> (
$self,
- \*S,
- \*TEMP,
+ $summary,
+ $temp,
@param
);
- unless (close S) {
+ unless ($summary -> close) {
$status = 0;
- $self->set_error('could not close summary file '.$self->summaryfile);
+ $self->set_error('could not close summary file '.$summary -> filename);
}
}
- unless (close TEMP) {
+ unless ($temp -> close) {
+ $status=0;
+ $self->set_error('could not close temp summary file '.$temp -> filename);
+ }
+ unless ($summary -> lock (LH_EXCL)) {
$status=0;
- $self->set_error('could not close temp summary file '.$filename);
+ $self->set_error ('could not write-lock summary file '.$summary -> filename);
}
if ($status) {
- unless (rename $filename => $self->summaryfile) {
+ unless (rename $temp -> filename => $summary -> filename) {
$status=0;
- $self->set_error('could not rename temp summary file '.$filename);
+ $self->set_error('could not rename temp summary file '.$temp -> filename);
}
}
}
- violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile));
+ $summary -> unlock;
}
# return
sub pick_wrap {
my ($self, $gosub, $filename, @param) = @_;
my $status;
+ my $cache = new Lock ($filename);
- unless (lock_file ($filename)) {
- violent_unlock_file ($filename);
- $self->set_error ('could not lock cache file '.$filename);
+ unless ($cache -> lock (LH_SHARED)) {
+ $self->set_error ('could not lock cache file '.$cache -> filename);
}
else {
- local *CACHE;
- unless (sysopen (CACHE, $filename, O_RDONLY)) {
- $self->set_error ('could not open to read cache file '.$filename);
+ unless ($cache -> open (O_RDONLY)) {
+ $self->set_error ('could not open to read cache file '.$cache -> filename);
}
else {
$status = $self -> read_wrap (
$gosub,
- \*CACHE,
+ $cache,
@param
);
- unless (close CACHE) {
+ unless ($cache -> close) {
$status=0;
- $self->set_error('could not close cache file '.$filename);
+ $self->set_error('could not close cache file '.$cache -> filename);
}
}
- violent_unlock_file ($filename) unless (unlock_file ($filename));
+ $cache -> unlock;
}
# return
sub read_wrap {
my ($self, $gosub, @param) = @_;
my $status;
+ my $summary = new Lock ($self -> summaryfile);
- unless (lock_file ($self->summaryfile)) {
- violent_unlock_file ($self->summaryfile);
- $self->set_error ('could not read-lock summary file '.$self->summaryfile);
+ unless ($summary -> lock (LH_SHARED)) {
+ $self->set_error ('could not read-lock summary file '.$summary -> filename);
}
else {
- local *S;
- unless (sysopen (S, $self->summaryfile, O_RDONLY | $O_BINARY)) {
- $self->set_error ('could not open to read summary file '.$self->summaryfile);
+ unless ($summary -> open (O_RDONLY | $O_BINARY)) {
+ $self->set_error ('could not open to read summary file '.$summary -> filename);
}
else {
$status = $gosub -> (
$self,
- \*S,
+ $summary,
@param
);
- unless (close S) {
+ unless ($summary -> close) {
$status=0;
- $self->set_error('could not close summary file '.$self->summaryfile);
+ $self->set_error('could not close summary file '.$summary -> filename);
}
}
- violent_unlock_file ($self->summaryfile) unless (unlock_file ($self->summaryfile));
+ $summary -> unlock;
}
# return
sub mod_wrap {
my ($self, $gosub, @param) = @_;
my $status;
+ my $summary = new Lock ($self -> summaryfile);
- unless (write_lock_file ($self->summaryfile)) {
- violent_unlock_file ($self->summaryfile);
- $self->set_error ('could not write-lock summary file '.$self->summaryfile);
+ unless ($summary -> lock (LH_EXCL)) {
+ $self->set_error ('could not write-lock summary file '.$summary -> filename);
}
else {
- local *S;
- unless (sysopen (S, $self->summaryfile, O_RDWR | $O_BINARY)) {
- $self->set_error ('could not open to read/write summary file '.$self->summaryfile);
+ unless ($summary -> open (O_RDWR | $O_BINARY)) {
+ $self->set_error ('could not open to read/write summary file '.$summary -> filename);
}
else {
$status = $gosub -> (
$self,
- \*S,
+ $summary,
@param
);
- unless (close S) {
+ unless ($summary -> close) {
$status=0;
- $self->set_error('could not close summary file '.$self->summaryfile);
+ $self->set_error('could not close summary file '.$summary -> filename);
}
}
- violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile));
+ $summary -> unlock;
}
# return