#!/usr/local/bin/perl
use CGI qw(header param);
print header();
#features skipped: types num/sum/textarea/radio
#also, needs report generation
#and multiple field sorting
#define some commonly used CGI key names,
#preprend with | so they aren't in the column name namespace
$keykey = "|key";
$keysort = "|sort";
$keydb = "|db";
$keytask = "|task";
$dbname = param($keydb);
if ((length $dbname > 50) || ($dbname !~ /^[a-zA-Z0-9_]*$/)) {
print "Illegal database name
";
exit;
}
$task = param($keytask);
#if user hasn't specified a db name,
#print list of links to all db's
if(!(defined($dbname))){
printheader();
opendir(DIR,".") || print "can't open ."; #list all files in this dir
while(defined(my $file= readdir(DIR))) {
if($file =~ /^(.*).kdb$/ ){ #db descriptors in form of dbname.kdb
$dbname = $1;
print qq($dbname
)
}
}
closedir(DIR);
exit;
}
#we have a dbname, try to open it
dbmopen(%db,"./$dbname",0644) || print "Can't open $dbname $!
";
#if we have no task than just dump the database to a table
if($task eq ""){
printheader();
print qq(add entry);
viewdata();
}
#add a new entry:
if($task eq "new") {
printheader();
loadfieldinfo(); #gets dbname from global variables
print qq(add entry:);
printform();
}
#edit an existing entry
#same as adding new, but we override the 'default' values
if($task eq "edit") {
printheader();
loadfieldinfo(); #gets dbname from global variables
print qq(edit entry:);
#now override fielddefault{} entries with loaded values
$key = param("$keykey");
$fielddefault{$keykey} = $key;
$data = $db{$key};
$i = 0;
foreach $datum (split(/\n/,$data)){
chomp $datum;
$fieldname = $fieldnames[$i];
$fielddefault{$fieldname} = $datum;
$i++;
}
printform();
}
# updating can be the result of a new or edit
if($task eq "update"){
#generate a new key if the key field is blank
$thiskey = param("$keykey");
if($thiskey eq ""){
$thiskey = time.".".$$;
}
loadfieldinfo(); #gets dbname from global variables
#buuld the multiple column values as multiple lines in a scalar
$data = "";
foreach $fieldname (@fieldnames){
$datum = param($fieldname);
$datum =~ s/\n/ /g;
if($fieldtype{$fieldname} eq "date"){ #ensure date fields are YYYY.MM.DD
$datum = cleandate($datum);
}
$data .= "$datum\n";
}
#put data into database hash
$db{$thiskey} = $data;
#resfresh page to view of db
printrefreshview();
}
#deleting is pretty straightforward
if($task eq "delete"){
$thiskey = param("$keykey");
delete($db{$thiskey});
printrefreshview();
}
dbmclose(%db);
# table view of data:
sub viewdata {
loadfieldinfo();
print qq(
edit | ); $i = 0; #print the field names and an option to sort on this field foreach $fieldname (@fieldnames){ print qq($fieldname vv | ); $i++; } print qq(delete | ); calculateSortOrder(); foreach $key(sort onSortOrder keys %db){ #print link to edit print qq(|
---|---|---|---|
>> | ); $i = 0; #print all colums for this row foreach $datum (split(/\n/,$db{$key})){ #checkboxes are the only fields that needs parsing for the display #changeblank entries to so the table doesn't fill in if($datum eq "") {$datum = " ";} $datum = valuesafe($datum); if($fieldtype{$fieldnames[$i]} eq "checkbox" && $datum eq "on"){ $datum = "$datum | ); $i++; } # in case the last few fields were blank, we need # to generate filler TD's until we have as many TDs # as fieldnames... while($i <= $#fieldnames){ print qq(); $i++; } #print link to delete with javascript confirmation print qq( | xxx | ); print qq(