#!/usr/bin/perl
###########################################
# handleform -- Send FORM data to databases
# Mike Schilli, 2002 ([email protected])
###########################################
use warnings;
use strict;

use CGI qw(:all);
use DBI;
use Log::Log4perl qw(get_logger);

###########################################
my $DB_DIR      = "/tmp/data";
my $DB_HOST     = "localhost";
my $DB_NAME     = "webdata";

   # CSV-File
my $DB_DRIVER   = "CSV";
my $DB_PAR      = "f_dir=$DB_DIR";

   # MySQL database
#my $DB_DRIVER  = "mysql";
#my $DB_PAR     = "database=$DB_NAME;" .
#                 "host=$DB_HOST";

my $DB_USER     = "root";
my $DB_PASSWD   = "";
my $DB_TABLE    = "survey";

my $THANK_YOU   = "/thankyou.html";
my $ERROR       = "/error.html";

my @FIELDS = qw(
   name hobbies glueck einkommen
);

my %MAP = (
   einkommen => { e1 => "Unter 100.000",
                  e2 => "Über 100.000" },
);
###########################################

Log::Log4perl::init(\ <<'EOT');
Log4perl.logger = WARN, File
Log4perl.appender.File= Log::Dispatch::File
Log4perl.appender.File.layout=\
 Log::Log4perl::Layout::PatternLayout
Log4perl.appender.File.filename=/tmp/hf.log
Log4perl.appender.File.layout.Conversion\
Pattern=%d %p %F (%L) %m %n
EOT

my $DB_DSN = "DBI:$DB_DRIVER:$DB_PAR";
my $DATE   = "i_date";

my $logger = Log::Log4perl::get_logger();

$SIG{__DIE__} = sub {
   $logger->fatal(@_);
   print redirect($ERROR);
   exit 0 };

my %val = ();

for my $field (@FIELDS) {
   if(defined param($field)) {
       my @v;
       for(param($field)) {
           if(exists $MAP{$field} and
              exists $MAP{$field}->{$_}) {
              push @v, $MAP{$field}->{$_};
           } else {
              push @v, $_;
           }
       }
       $val{$field} = join '|', @v;
   }
}

init_db();

my $dbh = DBI->connect($DB_DSN, $DB_USER,
   $DB_PASSWD, { RaiseError => 1 } ) or
   die "Cannot connect to DB";

init_table($dbh);

unshift @FIELDS, $DATE;
$val{$DATE} = nicedate();

my $fieldlist = join(",", @FIELDS);
my $valuelist = join(",",
   map { $dbh->quote($val{$_}) } @FIELDS);

my $sql = qq[
   INSERT INTO $DB_TABLE ( $fieldlist )
   VALUES ( $valuelist ) ];
my $sth = $dbh->do($sql);

print redirect($THANK_YOU);

###########################################
sub nicedate {
###########################################

   my ($s,$mi,$h,$d,$mo,$y) = localtime();

   return sprintf(
       "%02d-%02d-%d %02d:%02d:%02d",
       $mo+1, $d, $y+1900, $h, $mi, $s);
}

###########################################
sub init_db {
###########################################

   my($drh) = DBI->install_driver(
                              $DB_DRIVER);
   my @dbs = $drh->data_sources(
                 { 'f_dir' => $DB_DIR } );
   @dbs = () unless defined $dbs[0];
   return if grep { /\b$DB_NAME/ } @dbs;

   return if $DB_DRIVER eq "CSV";

   $drh->func("createdb", $DB_NAME,
       $DB_HOST, $DB_USER, $DB_PASSWD,
       "admin");
}

###########################################
sub init_table {
###########################################
   my $dbh = shift;

   if($DB_DRIVER eq "CSV") {
       die "$DB_DIR missing/protected" if
          !-d $DB_DIR or !-w _ or !-x _;
   }

   my @tables = $dbh->tables();

   return if grep {
    $_ =~ /\b$DB_TABLE$/ } $dbh->tables();

   my $defs = join ",", map {
       "$_ VARCHAR(50)" } $DATE, @FIELDS;

   $dbh->do(qq[
      CREATE TABLE $DB_TABLE ( $defs ) ]);
}