#!/usr/bin/perl -w
use strict;
use CGI::Debug;
use CGI;
use DBI;

=pod

Detta är en uppkoppling mot databas jonas med tabell person:

  create table person (id serial, fnamn text, enamn text, fodd int); 

Datatypen serial räknar själv upp ett unikt nummer för varje ny skapad post.

skriv "use CGI qw( :standard );" om du vill använda cgi-funktionerna utan
CGI::-prefixt.

=cut

{
    my $dbname = 'jonas'; 
    my $user   = 'jonas'; 
    my $passwd = 'jonas';
    my $dbh = DBI->connect("dbi:Pg:dbname=$dbname", $user, $passwd) 
	or die $DBI::errstr;

    print "Content-type: text/html\n\n";
    
    my $state = CGI::param( 'state' ) || "";
    if(    $state eq 'list_records' )
    {
	require "list_records.pm";
	&list_records( $dbh );
    }
    elsif( $state eq 'create_record_form' )
    {
	&create_record_form( $dbh );
    }
    elsif( $state eq 'create_record_result' )
    {
	&create_record_result( $dbh );
    }
    elsif( $state eq 'update_record_form' )
    {
	&update_record_form( $dbh );
    }
    elsif( $state eq 'update_record_result' )
    {
	&update_record_result( $dbh );
    }
    elsif( $state eq 'delete_record_result' )
    {
	&delete_record_result( $dbh );
    }
    elsif( $state eq 'view_record' )
    {
	&view_record( $dbh );
    }
    else
    {
	&menu;
    }

    $dbh->disconnect;
    exit;
}
####################################

sub topp
{
    my $text = "<html><head><title>Admin</title></head><body>\n";

    # Skriv ut lite debuggdata:
    $text .= "<table border>\n";
    $text .= "<tr><th colspan=2>Indata till programmet\n";
    foreach my $key ( CGI::param )
    {
	my $value = CGI::escapeHTML( CGI::param( $key ) );
	$text .= "<tr><td>$key <td>$value\n";
    }
    $text .= "</table>\n";

    return $text;
}

sub bottom
{
    return "<p><a href=$ENV{SCRIPT_NAME}>Tillbaka till början</a> </body></html>\n";
}

sub menu
{
    print &topp;
    print "<h1>Meny</h1>\n";
    print "<form>\n";
    print "<p>State: <input type=radio name=state value=list_records> Visa poster\n";
    print "<p>State: <input type=radio name=state value=create_record_form> Skapa ny post\n";
    print "<p><input type=submit>\n";
    print "</form>\n";
    print &bottom;
}




sub view_record
{
    my( $dbh ) = @_;

    my $id = CGI::param( 'id' )       or die "Du måste ange ett id";

    my $sql = "select * from person where id=$id";
    my $sth = $dbh->prepare( $sql );
    $sth->execute or die(  "< $sql > $DBI::errstr" );
    my $rr = $sth->fetchrow_hashref   or die "Kunde inte hitta en post med id $id";

    # Se till så att fälten inte innehåller HTML-kod
    # Ge tomma fält sina defaultvärden
    my $fnamn = CGI::escapeHTML( $rr->{'fnamn'} ) || "";
    my $enamn = CGI::escapeHTML( $rr->{'enamn'} ) || "";
    my $fodd  = CGI::escapeHTML( $rr->{'fodd'} )  || 0;

    print &topp;
    print "<h1>Post nr $id</h1>\n";
    print "<table>\n";
    print "<tr><td>Förnamn    <td>$fnamn\n";
    print "<tr><td>Efternamn  <td>$enamn\n";
    print "<tr><td>Födelseår  <td>$fodd\n";
    print "</table>\n";

    print "<form>\n";
    print "<p>Id:    <input type=text  name=id    value=\"$id\">\n";
    print "<p>State: <input type=radio name=state value=update_record_form> Uppdatera post\n";
    print "<p>State: <input type=radio name=state value=delete_record_result> Radera post\n";
    print "<p><input type=submit>\n";
    print "</form>\n";

    print &bottom;
}


sub create_record_form
{
    my( $dbh ) = @_;

    print &topp;
    print "<h1>Ny post</h1>\n";

    print "<form>\n";
    print "<table>\n";
    print "<tr><td>Förnamn    <td><input name=fnamn >\n";
    print "<tr><td>Efternamn  <td><input name=enamn >\n";
    print "<tr><td>Födelseår  <td><input name=fodd  >\n";
    print "</table>\n";

    print "<p>State: <input type=radio name=state value=create_record_result> Skapa\n";
    print "<p><input type=submit>\n";
    print "</form>\n";

    print &bottom;
}


sub create_record_result
{
    my( $dbh ) = @_;

    # Alla texter som ska in i databasen måste escapas med quote-metoden
    # Metoden översätter texten "Svennes' verkstad" till 
    # "'svennes'' verkstad'". Odefinierade variabler översätts till
    # null

    my $fnamn = $dbh->quote(  CGI::param('fnamn') );
    my $enamn = $dbh->quote( CGI::param('enamn') );
    my $fodd  = CGI::param('fodd') || 0;

    my $sql = "insert into person ( fnamn, enamn, fodd ) values ( $fnamn, $enamn, $fodd)";
    $dbh->do( $sql ) or die( "< $sql > $DBI::errstr" );

    print &topp;
    print "<h1>Ny post skapad</h1>\n";
    print "<p>Klart!\n";
    print &bottom;
}


sub update_record_form
{
    my( $dbh ) = @_;

    my $id = CGI::param( 'id' )       or die "Du måste ange ett id";
    
    my $sql = "select * from person where id=$id";
    my $sth = $dbh->prepare( $sql );
    $sth->execute or die(  "< $sql > $DBI::errstr" );
    my $rr = $sth->fetchrow_hashref   or die "Kunde inte hitta en post med id $id";

    # Se till så att fälten inte innehåller HTML-kod
    # Ge tomma fält sina defaultvärden
    my $fnamn = CGI::escapeHTML( $rr->{'fnamn'} ) || "";
    my $enamn = CGI::escapeHTML( $rr->{'enamn'} ) || "";
    my $fodd  = CGI::escapeHTML( $rr->{'fodd'} )  || 0;

    print &topp;
    print "<h1>Post nr $id</h1>\n";

    print "<form>\n";
    print "<table>\n";
    print "<tr><td>Id         <td><input name=id    value=\"$id\">\n";
    print "<tr><td>Förnamn    <td><input name=fnamn value=\"$fnamn\">\n";
    print "<tr><td>Efternamn  <td><input name=enamn value=\"$enamn\">\n";
    print "<tr><td>Födelseår  <td><input name=fodd  value=\"$fodd\">\n";
    print "</table>\n";

    print "<p>State: <input type=radio name=state value=update_record_result> Uppdatera\n";
    print "<p><input type=submit>\n";
    print "</form>\n";

    print &bottom;
}


sub update_record_result
{
    my( $dbh ) = @_;

    # Alla texter som ska in i databasen måste escapas med quote-metoden
    # Metoden översätter texten "Svennes' verkstad" till 
    # "'svennes'' verkstad'". Odefinierade variabler översätts till
    # null

    my $id = CGI::param( 'id' )       or die "Du måste ange ett id";
    my $fnamn = $dbh->quote(  CGI::param('fnamn') );
    my $enamn = $dbh->quote( CGI::param('enamn') );
    my $fodd  = CGI::param('fodd') || 0;

    my $sql = "update person set fnamn=$fnamn, enamn=$enamn, fodd=$fodd where id=$id";
    $dbh->do( $sql ) or die( "< $sql > $DBI::errstr" );

    print &topp;
    print "<h1>Uppdatering av post $id</h1>\n";
    print "<p>Klart!\n";
    print &bottom;
}


sub delete_record_result
{
    my( $dbh ) = @_;

    my $id = CGI::param( 'id' )       or die "Du måste ange ett id";

    my $sql = "delete from person where id=$id";
    $dbh->do( $sql ) or die( "< $sql > $DBI::errstr" );

    print &topp;
    print "<h1>Radering av post $id</h1>\n";
    print "<p>Klart!\n";
    print &bottom;
}


__END__



