# $File: //depot/libOurNet/BBS/lib/OurNet/BBS/ScalarFile.pm $ $Author: autrijus $ # $Revision: #4 $ $Change: 4012 $ $DateTime: 2003/01/29 11:06:24 $ package OurNet::BBS::ScalarFile; use strict; no warnings 'deprecated'; use if ($^O eq 'MSWin32'), open => (IN => ':bytes', OUT => ':bytes'); use if $OurNet::BBS::Encoding, open => ":encoding($OurNet::BBS::Encoding)"; sub TIESCALAR { my ($class, $filename) = @_; my ($cache, $mtime) = (undef, 0); return bless([$filename, $mtime, $cache], $class); } sub FETCH { my $self = shift; my $filename = $self->[0]; if (-e $filename) { return $self->[2] if ((stat($filename))[9] == $self->[1]); # cached $self->[1] = (stat($filename))[9]; local $/; open(my $FILE, "<$filename") or die "cannot read $filename: $!"; $self->[2] = <$FILE>; close $FILE; return $self->[2]; } else { undef $self->[1]; # empties mtime undef $self->[2]; # empties cache return; } } sub STORE { my $self = shift; my $filename = $self->[0]; no warnings 'uninitialized'; if (defined($_[0])) { if (length($self->[2]) and length($_[0]) >= length($self->[2]) and substr($_[0], 0, length($self->[2])) eq $self->[2]) { # append mode open(my $FILE, ">>$filename") or die "cannot append $filename: $!"; print $FILE substr($_[0], length($self->[2])); close $FILE; } else { open(my $FILE, ">$filename") or die "cannot write $filename: $!"; print $FILE $_[0]; close $FILE; } $self->[1] = (stat($filename))[9]; $self->[2] = $_[0]; } else { # store undef: kill the file undef $self->[1]; unlink $filename or die "cannot delete $filename: $!" if -e $filename; } return $self->[2]; } 1;