Vejledende løsning til prøveeksamen, efterår 2000

for Database-baseret Web-publicering, efterår 2000

af Martin Elsman


Vejledende løsning til Opgave 1 (15 procent) - HTML

Opgave 1.1

  <html>
    <title>About</title><body bgcolor=white>
    <table width=100% bgcolor=black border=0 cellpadding=5 cellspacing=0>
      <tr><td><font color=white size=+2><b>Video Projector Reservation System</b></font></td>
          <td align=right><img src=http://linuxlab.dk/itc_logo_black.png></td>
      </tr>
    </table>
    
    <h2>About</h2>
    The Video Projector Reservation System allows registered users to 
    make reservations of video projectors at the IT University of Copenhagen.
    <hr>
    <address>
    <a href="mailto:mael@it.edu">mael@it.edu</a>
    </address>
    </body>
  </html>

Opgave 1.2

  <select name=proj_id>
    <option value=1>Projektor 1
    <option value=2>Projektor 2
    <option value=3>Projektor 3
  </select>

Vejledende løsning til Opgave 2 (20 procent) - Tcl

Opgave 2.1

  <ul>
   <li> <a href=projector_show.tcl?id=4>Projector 4</a>
   <li> <a href=projector_show.tcl?id=1>Projector 1</a>
  </ul>

Opgave 2.2

  proc selectbox { name l } {
      set res "<select name=$name>\n"
      foreach e $l {
         set id [lindex $e 0]
         set text [lindex $e 1]
         append res " <option value=$id>$text\n"
      }
      append res "</select>"
      return $res
  }

Opgave 2.3

  proc vp_return_page { title body } {
    ns_return 200 text/html "<html>
      <title>$title</title><body bgcolor=white>
      <table width=100% bgcolor=black border=0 cellpadding=5 cellspacing=0>
	<tr><td><font color=white size=+2><b>Video Projector Reservation System</b></font></td>
	    <td align=right><img src=http://linuxlab.dk/itc_logo_black.png></td>
	</tr>
      </table>
      $body
      <hr>
      <address>
      <a href=\"mailto:mael@it.edu\">mael@it.edu</a>
      </address>
      </body>
      </html>
      "
  }

Vejledende løsning til Opgave 3 (15 procent) - Regulære udtryk

Opgave 3.1

   0|([1-9][0-9]*)

Opgave 3.2

   [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]

Opgave 3.3

  proc vp_check_date { d } {
    if { ![regexp {^[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]$} $d } {
      vp_return_page "FEJL: Forkert dato format" "Gå tilbage og
                      indtast datoen i formatet YYYY-MM-DD."
      exit
    }
    return
  }

Vejledende løsning til Opgave 4 (20 procent) - SQL

Opgave 4.1

   NAME              EMAIL
   -------------------------------
   John Paulin       paulin@it.edu
   Niels Hallenberg  nh@it.edu

Opgave 4.2

  select count(*) from vp_projector

Opgave 4.3

  create table vp_reservation (
    projector_id references vp_projector,
    person_id references vp_person,
    res_date date not null,
    unique(projector_id, res_date)
  );

Opgave 4.4

  insert into vp_reservation (projector_id, person_id, res_date)
  values (2, 1, '2001-02-06');

  insert into vp_reservation (projector_id, person_id, res_date)
  values (1, 2, '2001-02-08');

Opgave 4.5

  select vp_projector.id as proj_id, 
         vp_projector.name as proj_name, 
         vp_person.id as pers_id, 
         vp_person.name as pers_name, 
         email
  from vp_person, vp_projector, vp_reservation
  where vp_person.id = vp_reservation.person_id
    and vp_projector.id = vp_reservation.projector_id
    and res_date = '2001-02-06';

Opgave 4.6

  select id as proj_id, 
         name as proj_name
  from vp_projector
  where id not in (select projector_id 
                   from vp_reservation
                   where res_date = '2001-02-08');

Vejledende løsning til Opgave 5 (30 procent) - Web-service

Opgave 5.1

Tcl-kode til indsættelse efter definitionen af variablen prevday:
  set query_nextweek "select to_date('$date', 'YYYY-MM-DD') + 7 from dual"
  set nextweek [database_to_tcl_string $db $query_nextweek]

  set query_prevweek "select to_date('$date', 'YYYY-MM-DD') - 7 from dual"
  set prevweek [database_to_tcl_string $db $query_prevweek]
Omskrivning af kaldet af vp_return_page:
  vp_return_page "Projector Reservations" "
     <h3>Projector Reservations for $date</h3>
     \[ <a href=projector.tcl?date=$prevday>Prev Day</a> | 
        <a href=projector.tcl?date=$prevweek>Prev Week</a> | 
	<a href=projector.tcl?date=$nextweek>Next Week</a> |
        <a href=projector.tcl?date=$nextday>Next Day</a> \]
   <ul>$reservations</ul>"

Opgave 5.2

Programpunkt ## A ##:
  vp_check_date $date
Programpunkt ## B ##:
  vp_return_page "Add Projector Reservation" "
    <h3>Add Projector Reservation for $date</h3>
    <form action=res_add.tcl>
    <input type=hidden name=date value=$date>    
    <b>Email:</b><br>
    <input type=text name=email size=40><p>
    <b>Password:</b><br>
    <input type=password name=password size=40><p>
    $sel_box
    <input type=submit value=\"Add Reservation\">
    </form>
    "

Opgave 5.3

  # set form variables `date', `email', `password', `proj_id'
  set_the_usual_form_variables

  vp_check_date $date
  vp_check_email $email
  vp_check_id $proj_id

  set query "select id 
	     from vp_person 
	     where email = '$QQemail'
	       and password = '$QQpassword'"

  set db [ns_db gethandle]

  set selection [ns_db 0or1row $db $query]

  if { $selection == "" } {
    vp_return_page "Could not add reservation" "
      <h3>Could not add reservation</h3>
      Wrong password or email address"
    return
  }

  set_variables_after_query

  set insert "insert into vp_reservation (person_id, projector_id, res_date)
	      values ('$id', '$proj_id', '$date')"

  if [catch {ns_db dml $db $insert} res] {
    vp_return_page "Could not add reservation" "
      <h3>Could not add reservation</h3>
      Perhaps the projector is already booked"
    return
  }

  ns_returnredirect "projector.tcl?date=$date"

mael@it.edu