#!/usr/bin/perl use NDBM_File; use Fcntl ':DEFAULT', ':flock'; use CGI ':standard'; use CGI::Carp 'fatalsToBrowser'; $DIR = $ENV{REMOTE_ADDR} ? '/home/mtrain60/public_html/data' : '/home/mtrain60/public_html/testdata' ; chdir $DIR or die "Couldn't go to data directory: $!"; $datafile = 'info'; $semaphore = 'info.sem'; my %db; my @form_fields = qw(first_name last_name phone); my $page; if (param('action') eq 'update') { my %data = decode_form(); put_data($data{last_name}, %data); my $cookie = cookie(-NAME => last_name, -VALUE => $data{last_name}, -EXPIRES => '+1w', ); $page = show_form(%data); } elsif (param('action') eq 'search') { my ($who) = param('last_name'); my %data = get_data($who); $page = show_form(%data); } else { if (cookie('last_name')) { my %data = get_data(cookie('last_name')); $page = show_form(%data); } else { $page = show_form(); } } print header(-COOKIE => $cookie), start_html("Form demo"); print $page; print end_html(); sub get_data { my ($key) = @_; open S, "< $semaphore" or die "Couldn't open semaphore: $!; aborting"; flock S, LOCK_SH or die "Couldn't lock: $!; aborting"; tie %db => NDBM_File, $datafile, O_RDWR, 0666 or die "Couldn't tie database file $datafile: $!; aborting"; my @raw_data = split /:::/, $db{$key}; untie %db; my (%data, $field); foreach $field (@form_fields) { $data{$field} = shift @raw_data; } close S; return %data; } sub put_data { my ($key, %data) = @_; my (@raw_data, $field); foreach $field (@form_fields) { push @raw_data, $data{$field}; } open S, "> $semaphore" or die "Couldn't open semaphore: $!; aborting"; flock S, LOCK_EX or die "Couldn't lock: $!; aborting"; tie %db => NDBM_File, $datafile, O_RDWR|O_CREAT, 0666 or die "Couldn't tie database file $datafile: $!; aborting"; $db{$key} = join ':::', @raw_data; untie %db; close S; } sub show_form { my %data = @_; my $field; my $html; $html .= join '', h2("Update / Create"), start_form(); foreach $field (@form_fields) { $html .= join '', $field, ": ", textfield(-NAME => $field, -VALUE => $data{$field}, -OVERRIDE => 1), br(); } $html .= join '', hidden(-NAME => 'action', -VALUE => 'update', -OVERRIDE => 1), submit(-VALUE => 'Create / Update'); $html .= end_form(); $html .= join '', hr(), start_form(), "Name to search for: ", textfield(-NAME => 'last_name'), hidden(-NAME => 'action', -VALUE => 'search', -OVERRIDE => 1), br(), submit(-VALUE => 'Search'), end_form() ; return $html; } sub decode_form { my %data ; my $field; foreach $field (@form_fields) { $data{$field} = param($field); } %data; }