package QWizard::Storage::File; use QWizard::Storage::Memory; use strict; our @ISA = qw(QWizard::Storage::Memory); our $VERSION = '3.15'; sub new { my $class = shift; my %args = @_; bless \%args, $class; } sub set { my ($self, $it, $val) = @_; $self->SUPER::set($it, $val); $self->save_parms(); } sub set_all { my ($self, $vals) = @_; $self->SUPER::set_all($vals); $self->save_parms(); } sub save_parms { my $self = shift; return if (!$self); return if ($self->{'dontsave'}); my $vars = $self->get_all(); if ($self->{'file'}) { open(OPFILE, ">$self->{'file'}"); foreach my $var (keys(%$vars)) { print OPFILE xlat_data_fw($var),"\n"; print OPFILE xlat_data_fw($vars->{$var}),"\n"; } close(OPFILE); } } sub load_data { my $self = shift; return if (!$self); $self->reset(); $self->{'dontsave'} = 1; if ($self->{'file'} && -f $self->{'file'}) { open(IPFILE, "$self->{'file'}"); while () { chomp(); my $key = xlat_data_rv($_); $_ = ; chomp(); my $val = xlat_data_rv($_); $self->set($key, $val); } } $self->{'dontsave'} = 0; } sub xlat_data_fw { my $data = shift; $data =~ s/([^a-zA-Z0-9])/'%' . ord($1) . ";"/eg; return $data; } sub xlat_data_rv { my $data = shift; $data =~ s/\%([0-9]+);/chr($1)/eg; return $data; } 1; =pod =head1 NAME QWizard::Storage::File - Stores data in a file =head1 SYNOPSIS my $st = new QWizard::Storage::File(file => '/path/to/some/file'); $st->set('var', 'value'); $st->get('var'); # optionally bootstrap from an existing file: $st->load_data(); =head1 DESCRIPTION Stores data passed to it in a file (and in memory for faster lookups). Generally speaking this should *not* be used except when being copied to from another faster storage mechanism (like a QWizard::Storage::Memory object). This module is actually a child class of QWizard::Storage::Memory. =head1 AUTHOR Wes Hardaker, hardaker@users.sourceforge.net =head1 SEE ALSO perl(1) Net-Policy: http://net-policy.sourceforge.net/ =cut