#!/usr/local/bin/perl -Tw ############################################################################### ############################################################################### ## ## EnterData.pl ## ## This program generated the initial CGI form page for ECG entry. It ## connects to the MySQL database in order to dynamically generate ## form elements corresponding to the SQL column datatypes. ## ## Input: Nothing. ## ## Output: Valid HTML fillout form passed to users browser. ## ## Calls: VerifyData.pl ## ## Uses: perl modules CGI and DBI ## ## This program begins the data entry process. It uses DBI:mysql to ## connect to the MySQL database. It outputs an appropriate HTML form ## for entering data to the database using calls to MakeFormElement. ## When the form is submitted VerifyData.pl is called. ## ############################################################################### ############################################################################### # Extend the terse diagnostics normally produced by perl compiler and # perl interpreter to print more readable information. use diagnostics -verbose; # Disallow symbolic references, undeclared variables, and bareword # identifiers. use strict; # Load the perl CGI and DBI modules use DBI; use CGI; # Variable declaration section my $Database="ecg"; # Name of database to connect to my $User="hpaul"; # Name of Database user my $Password="ralph"; # Database user's password my $dbh; # Database handle object my $query=new CGI; # CGI form object my $method="POST"; # Form method for data transmission my $action="VerifyData.pl"; # CGI script called on submit for CGI form object; my $encoding=$CGI::MULTIPART; # HTML encoding type $encoding = $CGI::MULTIPART; # Set twice to avoid annoying lint error # Generate appropriate HTML for the beginning of a page print $query->header; print $query->start_html; # Generate appropriate HTML for the beginning of a form print $query->start_multipart_form($method,$action,$encoding); print $query->isindex($action); # Connect the database handle $dbh = DBI->connect("DBI:mysql:$Database:",$User,$Password) # If the database handle can't be connected, die with some useful information or die "Can't connect to the database!\n"; # Print Fill-out form using calls to MakeFormElement print "

Administrative Data

\n"; print "
Case Number: \n"; MakeFormElement ($dbh, 'ECG', 'CaseNumber','0'); print "
Date & Time: \n"; MakeFormElement ($dbh, 'ECG', 'DateAndTime','0'); print "
Orderer: \n"; MakeFormElement ($dbh, 'ECG', 'Orderer','0'); print "
Recorder: \n"; MakeFormElement ($dbh, 'ECG', 'Recorder','0'); print "
\n"; print "

Raw Data

"; print "
Image: \n"; MakeFormElement ($dbh, 'ECG', 'Image','0'); ############################################################################### # Millimeters per second and Millivolts per centimeter are used for # processing the tiff into an eWav format. These form elements are # generated manually since they are not columns in the ECG table; print "
Millimeters per Second\n"; print $query->textfield ('-name'=>'MMperSec', 'default'=>'25', 'size'=>'4', 'maxlength'=>'4'); print "Millivolts per Centimeter\n"; print $query->textfield ('-name'=>'MVperCM', 'default'=>'0.5', 'size'=>'4', 'maxlength'=>'4'); print "
\n"; ############################################################################### print "

Abnormalities, etc

\n"; print "
Intraventricular Conduction Defects:\n"; MakeFormElement ($dbh, 'ECG', 'IntraventricularConductionDefects','0'); print "
Chamber Enlargements:\n"; MakeFormElement ($dbh, 'ECG', 'ChamberEnlargements','0'); print "
Other Comments:\n"; MakeFormElement ($dbh, 'ECG', 'OtherComments','0'); print "
\n"; ############################################################################### print "

Arrhythmias

\n"; print "
Atrioventricular Dissociation:\n"; MakeFormElement ($dbh, 'ECG', 'AtrioventricularDissociation','0'); print "
Atrioventricular Blocks:\n"; MakeFormElement ($dbh, 'ECG', 'AtrioventricularBlocks','0'); print "
Ventricular Arrhythmias:\n"; MakeFormElement ($dbh, 'ECG', 'VentricularArrhythmias','0'); print "
Atrioventricular Arrhythmias:\n"; MakeFormElement ($dbh, 'ECG', 'AtrioventricularArrhythmias','0'); print "
Supraventricular Arrhythmias:\n"; MakeFormElement ($dbh, 'ECG', 'SupraventricularArrhythmias','0'); print "
Abnormal Sinoatrial Arrhythmias:\n"; MakeFormElement ($dbh, 'ECG', 'AbnormalSinoatrialArrhythmias','0'); print "
\n"; ############################################################################### print "

Morphology

\n"; print "
Average Heart Rate:\n"; MakeFormElement ($dbh, 'ECG', 'AverageHeartRate','0'); print "
PQ Interval:\n"; MakeFormElement ($dbh, 'ECG', 'PQInterval','0'); print "
Q Wave Amplitude:\n"; MakeFormElement ($dbh, 'ECG', 'QWaveAmplitude','0'); print "
QRS Wave Duration:\n"; MakeFormElement ($dbh, 'ECG', 'QrsWaveDuration','0'); print "
QT Interval:\n"; MakeFormElement ($dbh, 'ECG', 'QtInterval','0'); print "
S Wave Amplitude:\n"; MakeFormElement ($dbh, 'ECG', 'SWaveAmplitude','0'); print "
ST Segment Displacement:\n"; MakeFormElement ($dbh, 'ECG', 'StSegmentDispl','0'); print "
ST Segment Displacement Lead:\n"; MakeFormElement ($dbh, 'ECG', 'StSegmentDisplLead','0'); print "
T Wave Amplitude:\n"; MakeFormElement ($dbh, 'ECG', 'T_Wave_Amplitude','0'); print "
ST Segment:\n"; MakeFormElement ($dbh, 'ECG', 'St_Segment','0'); print "
P Wave Morphology:\n"; MakeFormElement ($dbh, 'ECG', 'P_Wave_Morphology','0'); print "
Predominant Rhythm:\n"; MakeFormElement ($dbh, 'ECG', 'Predominant_Rhythm','0'); print "
\n"; ############################################################################### print "

Artifact source:

\n"; print "
Artifacts:\n"; MakeFormElement ($dbh, 'ECG', 'Artifacts','0'); print "
\n"; ############################################################################### # Disconnect the database handle. This actually disconnects you from # the database specified by $dbh $dbh->disconnect; # Generate HTML submit button print $query->submit; # Generate HTML suitablr for end of page print $query->endform; print $query->end_html; # ############################################################################### ############################################################################### ## ## Subroutine MakeFormElement ## ## This subroutine takes as arguments a database handle object, a ## table name, a column name, and a debug flag. It outputs an HTML ## form element corresponding to the type of columns passed. ## ## Inputs: Database Handle ## Table name ## Column name ## Debug Flag ## ## Outputs: HTML form element corresponding to the type of columns ## passed ## ## Returns: Nothing ## ## Uses: perl modules CGI and DBI ## ## This subroutine uses an SQL call to the database to determine a ## column's type. It then uses regular expressions to format the ## returned datatype (if enum or set) to be an appropriate fomat for ## the 'values' argument to the various CGI make form-element calls. ## Depending on the variable type a different form generating funtion ## is called from CGI.pm ## ############################################################################### ############################################################################### sub MakeFormElement { my $dbh = $_[0]; # Database handle object my $Table = $_[1]; # Name of table in database my $Column = $_[2]; # Name of Column in table my $Debug = $_[3]; # Debug flag my $sql; # SQL code to execute my $sth; # Statement Handle my $Field; # Column Name my $Type; # SQL datatype including length information : varchar(30) my $Null; my $Key; my $Default; # Default value if unassigned my $Extra; my $DataType; # SQL datatype: varchar, datetime, blob, # integer, set, enum, etc. my $Num_Elements; my @ValueArray; my $Values; # Possible elements if Type enum or set, length if integet # or text, undefined if blob if ($Debug) { print "
dbh, Table, Column = $dbh, $Table, $Column
\n\n"; } # Get data about column from database my $q_Column = $dbh->quote($Column); $sql = "show columns from $Table like $q_Column"; $sth = $dbh->prepare($sql); $sth->execute or warn $dbh->errstr; ($Field, $Type, $Null, $Key, $Default, $Extra) = $sth->fetchrow_array; $sth->finish; # Split data into useful variables ($DataType, $Values) = split /[\(\)]/, $Type; $Num_Elements=0; if ($Values) { $Values =~ s/'//g; # Fix xemacs auto-indent bug --> '; @ValueArray = split /,/, $Values; $Num_Elements = scalar(@ValueArray); } # Keep picklists from getting absurdly long if ($Num_Elements > 6) { $Num_Elements = 7;} # Print some debugging info if ($Debug) { print "Field = $Field
\n"; print "Type = $Type
\n"; print "Datatype = $DataType
\n"; print "Values = "; if (!$Values) { print "*UNDEFINED*
\n"; } else { print "\"$Values\"
\n" }; print "ValueArray = "; foreach $Values (@ValueArray) { print "\"$Values\"\t"; } print "\n"; print "Null = $Null
\n"; print "Key = $Key
\n"; print "Default = " ; if (!$Default) { print "*UNDEFINED*
\n"; } else { print "$Default
\n"; } print "Extra = $Extra
\n"; } ########################################################################### # Here we generate a form element appropriate to the database # column being represented. ########################################################################### if ($DataType eq 'set') { print $query->scrolling_list ('-name'=>$Column, 'values'=>\@ValueArray, 'default'=>$Default, 'size'=>$Num_Elements, 'multiple'=>'true'); } ########################################################################### elsif ($DataType eq 'enum') { print $query->popup_menu ('-name'=>$Column, 'values'=>\@ValueArray, 'default'=>$Default); } ########################################################################### elsif ($DataType eq 'smallint' || $DataType eq 'varchar' || $DataType eq 'mediumint') { print $query->textfield ('-name'=>$Column, 'default'=>$Default, 'size'=>$Values, 'maxlength'=>$Values); } ########################################################################### elsif ($DataType eq 'float') { print $query->textfield ('-name'=>$Column, 'default'=>$Default, 'size'=>'15', 'maxlength'=>'15'); } ########################################################################### elsif ($DataType eq 'datetime') { print $query->textfield ('-name'=>$Column, 'default'=>$Default, 'size'=>'20', 'maxlength'=>'20'); } ########################################################################### elsif ($DataType eq 'longblob') { print $query->filefield ('-name'=>$Column, 'size'=>'50', 'maxlength'=>'80'); } ########################################################################### else { print "

Datatype \"$DataType\" not recognized

\n"; } print "\n\n"; } #