#!/usr/bin/perl
###########################################
# handleform -- Send FORM data to databases
# Mike Schilli, 2002 (m@perlmeister.com)
###########################################
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 ) ]);
}
