# -*- perl -*-
#
# HTML::EP - A Perl based HTML extension.
#
#
# Copyright (C) 1998 Jochen Wiedmann
# Am Eisteich 9
# 72555 Metzingen
# Germany
#
# Phone: +49 7123 14887
# Email: joe@ispsoft.de
#
# All rights reserved.
#
# You may distribute this module under the terms of either
# the GNU General Public License or the Artistic License, as
# specified in the Perl README file.
#
############################################################################
require 5.004;
use strict;
use Data::Dumper ();
use Safe ();
use Fcntl ();
use Symbol ();
package HTML::EP::Session::Dumper;
sub new {
my($proto, $ep, $id, $attr) = @_;
my $session = { '_ep_data' => { 'fh' => $attr->{'fh'} } };
bless($session, (ref($proto) || $proto));
}
sub Open {
my($proto, $ep, $id, $attr) = @_;
my $fh = Symbol::gensym();
sysopen($fh, $id, Fcntl::O_RDWR()|Fcntl::O_CREAT())
or die "Failed to open $id for writing: $!";
flock($fh, Fcntl::LOCK_EX()) or die "Failed to lock $id: $!";
return $proto->new($ep, $id, {'fh' => $fh}) if eof($fh);
local $/ = undef;
my $contents = <$fh>;
die "Failed to read $id: $!" unless defined $contents;
my $self = Safe->new()->reval($contents);
die "Failed to eval $id: $@" if $@;
die "Empty or trashed $id: Returned a false value" unless $self;
$self->{'_ep_data'} = { 'fh' => $fh };
bless($self, (ref($proto) || $proto));
}
sub Store {
my($self, $ep, $id, $locked) = @_;
my $data = delete $self->{'_ep_data'};
my $fh = $data->{'fh'};
(seek($fh, 0, 0) and
(print $fh (Data::Dumper->new([$self])->Indent(1)->Terse(1)->Dump())) and
truncate($fh, 0))
or die "Failed to update $id: $!";
if ($locked) {
$self->{'_ep_data'} = $data;
}
}
sub Delete {
my($self, $ep, $id) = @_;
if (-f $id) {
unlink $id or die "Failed to delete $id: $!";
};
}
1;