/usr/local/CPAN/new.spirit/NewSpirit/LKFile.pm



# $Id: LKFile.pm,v 1.6 2003/05/19 13:41:59 joern Exp $

package NewSpirit::LKFile;

$VERSION = "0.01";

use strict;
use FileHandle;
use Carp;
use Fcntl ':flock';

sub new {
        my $type = shift;
        my ($filename) = @_;

	croak "NewSpirit::LKFile: missing filename" unless $filename;

        my $self = {
		filename =>$filename
	};

        return bless $self, $type;
}

sub read {
	my $self = shift;
	
	my $filename = $self->{filename};
	my $fh = new FileHandle;
	open ($fh, $filename) or confess "can't read $filename";
	binmode $fh;

	flock $fh, LOCK_SH or croak "can't share lock $filename";
	my $data = join ('', <$fh>);
	close $fh;

	return \$data;
}

sub write {
	my $self = shift;
	my ($data) = @_;
	
	my $filename = $self->{filename};

	my $fh = new FileHandle;

	open ($fh, "+> $filename") or croak "can't write $filename";
	binmode $fh;
	flock $fh, LOCK_EX or croak "can't exclusive lock $filename";
	seek $fh, 0, 0 or croak "can't seek $filename";
	print $fh $$data or croak "can't write data $filename";
	truncate $fh, length($$data) or croak "can't truncate $filename";;
	close $fh or croak "can't close $filename";

	1;
}

1;