Take your problem from Homework One and rewrite it to keep state on the server side. Use a database to store the sessions. How could you do that? 1) You could chapter 11 and use that. Some people did that. 2) You could look into the posted notes under What's New? Mon-Wed Jul 06-08 and use that. 3) You can also get the smallest A on this assignment by: a) being in class on Wed Jul 07 b) creating a table in a database in your MySQL for sessions I used database homeworkThree, table last, with the definition in the notes for today: create table last ( session_id char(8) primary key, message varchar(240), balance int, modified timestamp ); c) finally you copy the code we developed in class today in your account and post a link to it and another one to its code on your page. Make sure that the code you link is updated to refer to your port, your database and your table. #!/usr/bin/perl use CGI; use DBI; use Digest::MD5 qw(md5 md5_hex md5_base64); $DB = "dbi:mysql:homeworkThree:silo.cs.indiana.edu:port=44089"; $username = "lbird"; $password = "sp00n"; $DB_TABLE = "last"; $SECRET = "something secret"; $EXPIRE = 30 * 60 * 60 * 24; # one month $MAX_TRIES = 10; $ID_LENGTH = 8; $q = new CGI; # Open the database -------------------------------------------------------- $DBH = DBI->connect($DB, $username, $password, {PrintError => 0}) || die "Couldn't open database: ", $DBI::errstr; # get the current session ID, or make one ---------------------------------- my ($session_id, $note) = &get_session_id(); # start the page ----------------------------------------------------------- print $q->header, $q->start_html(-title => 'Last Lab', -bgcolor => 'lightgrey'); my $state = &get_state($session_id); $message = $state->{'message'}; # state variables $balance = $state->{'balance'}; $amount = $q->param('amount'); # input $bet = $q->param('bet'); $action = $q->param('action'); $d1 = "N/A"; $d2 = "N/A"; $d3 = "N/A"; if ($message) { if ($action eq "Deposit") { $balance += $amount; } else { $d1 = int(rand(6) + 1); $d2 = int(rand(6) + 1); $d3 = int(rand(6) + 1); if ($d1 == $d2 && $d2 == $d3) { $balance += 2 * $bet; } else { if ($d1 == $d2 || $d2 == $d3 || $d1 == $d3) { $balance += $bet; } else { $balance -= $bet; } } } } else { $balance = 0; $message = "Welcome"; } $state->{'message'} = $message; $state->{'balance'} = $balance; &save_state($state, $session_id); print qq{
}, $q->end_html; # get the state from the database ------------------------------get_state--- sub get_state { my $id = shift; my $query = "SELECT * FROM $DB_TABLE WHERE session_id = '$id'"; my $sth = $DBH->prepare($query) || die "Prepare: ", $DBH->errstr; $sth->execute || die "Execute: ", $sth->errstr; my $state = $sth->fetchrow_hashref; $sth->finish; return $state; } # retrieve the session ID from the path info. if it's -----get_session_id--- # not already there, add it to the path info (more or less) with a redirect sub get_session_id { my (@result); &expire_old_sessions(); my ($id) = $q->path_info() =~ m:^/([a-h0-9]{$ID_LENGTH}):o; return @result if $id and @result = &check_id($id); # if we get here, there's not already an ID in the path info my $session_id = &generate_id(); die "Couldn't make a new session id" unless $session_id; print $q->redirect($q->script_name() . "/$session_id"); exit 0; } # find a new unique ID and insert it into the database -------generate_id--- sub generate_id { # create a new session id my $tries = 0; my $id = &hash($SECRET . rand()); while ($tries++ < $MAX_TRIES) { last if $DBH->do("INSERT INTO $DB_TABLE (session_id) VALUES ('$id')"); $id = &hash($id); } return undef if $tries >= $MAX_TRIES; # we failed return $id; } # check to see that an old ID is valid --------------------------check_id--- sub check_id { my $id = shift; return ($id, '') if $DBH->do("SELECT 1 FROM $DB_TABLE WHERE session_id = '$id'") > 0; return ($id, 'The record of your game may have expired. Restarting.') if $DBH->do("INSERT INTO $DB_TABLE (session_id) VALUES ('$id')"); return (); } # generate a hash value ---------------------------------------------hash--- sub hash { my $value = shift; return substr(md5_hex($value), 0, $ID_LENGTH); } sub expire_old_sessions { # --------------------------expire_old_sessions--- $DBH->do(<