Prøveeksamen, efterår 2000

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

af Martin Elsman


Introduktion

For at lette administrationen af udlån og reservation af videoprojektorer på en IT-Højskole i Københavnsområdet er du blevet stillet overfor opgaven at konstruere et webbaseret videoprojektorreservationssystem.

Personalet i IT-Højskolens reception har hver dag brug for at se hvem der denne dag har reserveret skolens 5 videoprojektorer eller om der er videoprojektorer ledige til udlån. Det kan antages i det følgende at videoprojektorer udlånes en hel dag ad gangen. Det nye system skal give mulighed for lærere og personale selv at reservere videoprojektorer til undervisnings- og forsknings-formål.

For at afgrænse opgaven ser vi i det der følger bort fra en del administrationsfunktionaliteter - omend disse er vigtige i et virkeligt system.

Opgave 1 (15 procent) - HTML

Opgave 1.1

Nedenfor vises en simpel ``About''-side for videoprojektorreservationssystemet:

Opskriv HTML koden for visning af siden på billedet ovenfor (rammen er ikke en del af html-siden). Besvarelsen skal fremgå som html-kode indeholdende både <html> og </html> tags.

Den sorte bar i billedet ønskes implementeret som en tabel med vidde 100 procent, baggrundsfarve sort (attribut bgcolor=black) og indeholdende en række med to felter:

  1. Venstrestillet felt med bold tekst ``Video Projector Reservation System''
  2. Højrestillet felt med logo. Det kan antages at logoet er tilgængeligt på url-adressen http://www.it-c.dk/logo_black.jpg. Isoleret set ser logoet ud som vist til højre.

Opgave 1.2

I denne opgave skal du opskrive HTML kode til brug for en HTML-form til reservation af en projektor. HTML-koden du skal opskrive skal have formen
  <select ...>
    ...
  </select>
og vise en SELECT box med tre af IT-højskolens projektorer (se billedet til højre).

Til brug i HTML-formen skal navnet på SELECT boxen være proj_id og værdien for hver af projektormulighederne skal være nummeret på projektoren, således at valget med teksten ``Projektor 1'' har værdien ``1'', valget med teksten ``Projektor 2'' har værdien ``2'' og så fremdeles.

Opgave 2 (20 procent) - Tcl

Opgave 2.1

Vis HTML-koden som er resultatet af at kalde tcl-proceduren projector_list, vist nedenfor, med listen
  [list [list "4" "Projector 4"] [list "1" "Projector 1"]]
givet som argument:
  proc projector_list { l } {
      set res "<ul>\n"
      foreach e $l {
         set id [lindex $e 0]
         set text [lindex $e 1]
         append res " <li> <a href=projector_show.tcl?id=$id>$text</a>\n"
      }
      append res "</ul>"
      return $res
  }

Opgave 2.2

Skriv en tcl-procedure select_box, som returnerer HTML-kode for en SELECT box med en liste af valg. Proceduren skal tage to argumenter, et navn på SELECT boxen brugt til name attributten og en liste af projektorer, som i Opgave 2.1. Du kan passende bruge proceduren projector_list fra Opgave 2.1 som skabelon.

Hint: Ved følgende kald af proceduren select_box skal proceduren returnere besvarelsen på Opgave 1.2:

  select_box "proj_id" [list [list "1" "Projektor 1"]      \
                             [list "2" "Projektor 2"]      \
                             [list "3" "Projektor 3"]]

Opgave 2.3

Til at returnere en HTML-side til en web-browser fra AOLserver web-serveren benyttes kommandoen
  ns_return 200 text/html " -- HTML kode -- "
hvor teksten -- HTML kode -- erstattes med relevant HTML kode.

Konstruer en procedure vp_return_page som benytter kommandoen ns_return til at returnere en side til en web-browser. Proceduren skal tage to argumenter. Det første argument er titlen på siden (title), som i kald af proceduren skal forekomme i <title>...</title> tags i headeren for siden. Det andet argument er kroppen på siden (body). Alle sider som returneres med vp_return_page skal--uafhængigt af argumenterne--indeholde den sorte bar og email-signaturen, som i Opgave 1.1.

Hint: Følgende kald af proceduren vp_return_page skal returnere web-siden der er vist i Opgave 1:

  vp_return_page "About" "
    <h2>About</h2>
    The Video Projector Reservation System allows registered users to 
    make reservations of video projectors at the IT University of Copenhagen."

Opgave 3 (15 procent) - Regulære udtryk

Opgave 3.1

Det regulære udtryk [0-9]+ matches af et eller flere forekomster af cifrene 0-9. Opskriv et regulært udtryk som matches af enten
  1. cifferet 0
  2. et ciffer 1-9 efterfulgt af nul-eller-flere forekomster af cifrene 0-9.
Tegnsekvenserne ``012'' og ``00'' matcher altså ikke dette mønster, hvorimod ``12'' og ``0'' gør.

Opgave 3.2

Opskriv et regulært udtryk for datoer på formen YYYY-MM-DD, hvor YYYY udgør et år (f.eks. 2000), MM udgør et måned (f.eks. 05) og DD udgør en dag (f.eks. 12).

Opgave 3.3

Skriv en tcl-procedure vp_check_date til at undersøge om en dato har formen YYYY-MM-DD, som beskrevet i Opgave 3.2. Hvis datoen, som overføres til proceduren som argument, har den rigtige form skal proceduren med det samme returnere til stedet hvorfra proceduren kaldes. Ellers skal proceduren returnere en fejlbesked til brugerens web-browser, hvorefter programmet skal stoppe ved et kald til tcl-kommandoen exit.

Du kan antage at du kan benytte proceduren vp_return_page fra Opgave 2.1 til at returnere en besked til brugerens web-browser. Til at undersøge om datoen har den rigtige form skal du bruge tcl-kommandoen regexp.

Opgave 4 (20 procent) - SQL

Datamodellen for videoprojektorreservationssystemet skal bestå af tre tabeller:
  1. vp_person - indeholder de personer som kan reservere projektorer
  2. vp_projector - indeholder projektorene
  3. vp_reservation - knytter personer til projectorer for de enkelte datoer
Tabellerne vp_person og vp_projector og to Oracle sekvencer til generering af unikke numre er oprettet ved følgende SQL kommandoer:
  create table vp_person (
    id integer primary key,
    name varchar(100) not null,
    email varchar(100) not null,
    password varchar(100) not null
  );

  create table vp_projector (
    id integer primary key,
    name varchar(100)
  );

  create sequence vp_person_id_sequence start with 10;
  create sequence vp_projector_id_sequence start with 10;
Følgende SQL insert kommandoer kan efterfølgende antages at være udført:
  insert into vp_person (id, name, email, password)
  values (1, 'John Paulin', 'paulin@it.edu', 'yes!');

  insert into vp_person (id, name, email, password)
  values (2, 'Niels Hallenberg', 'nh@it.edu', 'no!');

  insert into vp_projector (id, name) values (1, 'Projektor 1');
  insert into vp_projector (id, name) values (2, 'Projektor 2');
  insert into vp_projector (id, name) values (3, 'Projektor 3');

Opgave 4.1

Vis resultatet af at udføre følgende select kommando:
  select name, email from vp_person;

Opgave 4.2

Opskriv en SQL select kommando til at returnere antallet af projektorer i tabellen vp_projector.

Opgave 4.3

Opskriv en SQL kommando til at oprette tabellen vp_reservation. Tabellen skal have tre kolonner: Brug Oracles unique-constraint til at udtrykke at der i tabellen ikke må forekomme to rækker hvor både projector_id og res_date er ens.

Opgave 4.4

Skriv to SQL kommandoer til oprettelse af følgende reservationer i tabellen vp_reservation:
  1. Projektor 2 for John Paulin den 6. februar, 2001 (2001-02-06)
  2. Projektor 1 for Niels Hallenberg den 8. februar, 2001 (2001-02-08)

Opgave 4.5

Konstruer en SQL kommando til udtrækning af projektorreservationer for datoen 2001-02-06. Resultatet af at udføre kommandoen skal resultere i følgende data - kolonnenavnene er skrevet med bold:

proj_idproj_namepers_idpers_nameemail
2Projector 21John Paulinpaulin@it.edu

Opgave 4.6

Til brug for reservation af en projektor er det hensigtsmæssigt at spørge om hvilke projektorer der er tilgængelige til reservation en given dag. Opskriv en SQL kommando der for datoen 2001-02-08 resulterer i de projektorer der er tilgængelige for reservation denne dag. Resultatet af at udføre kommandoen skal resultere i følgende data:

proj_idproj_name
2Projector 2
3Projector 3

Hint: Det er nødvendigt at benytte en sub-query.

Opgave 5 (30 procent) - Web-service

Til konstruktion af tcl-filerne som implementerer videoprojektorreservationssystemet er der opstillet følgende tilstandsdiagram, hvor kasserne repræsenterer web-sider (implementeret som tcl-filer), pilene uden annoteringer repræsenterer links og de annoterede pile repræsenterer transaktioner:
Nedenfor følger en skabelon til filen projektor.tcl.
  # set the form variable `date' if it is available
  set_form_variables 0

  set db [ns_db gethandle]

  if [info exists date] {
      vp_check_date $date
  } else {
      # if a form variable `date' is not set, we use todays date
      set date [database_to_tcl_string $db "select sysdate from dual"]
  }

  # Now date is set and on the form YYYY-MM-DD. Let's ask 
  # the Oracle about the dates of the day following $date 
  # and the day preceeding $date; we do this by adding one 
  # to $date and subtracting one from $date, respectively.

  set query_nextday "select to_date('$date', 'YYYY-MM-DD') + 1 from dual"
  set nextday [database_to_tcl_string $db $query_nextday]

  set query_prevday "select to_date('$date', 'YYYY-MM-DD') - 1 from dual"
  set prevday [database_to_tcl_string $db $query_prevday]

  # Extract information about the projector reservations for `date'
  set query " -- DIT SVAR PÅ OPGAVE 4.5 HVOR DATOEN '2001-02-06' 
                 UDSKIFTES MED '$date' -- "

  set selection [ns_db select $db $query]
  set reservations ""
  while { [ns_db getrow $db $selection] } {
      set_variables_after_query  
      append reservations "<li>$proj_name - $pers_name</a>
  }

  append reservations "<p> 
    <li> <a href=res_add_form.tcl?date=$date>Add reservation</a>"

  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=$nextday>Next Day</a> \]
   <ul>$reservations</ul>"

Opgave 5.1

Opskriv tcl-koden til definition af to tcl-variabler nextweek og prevweek som henholdsvis skal indeholde datoen en uge senere end $date og datoen en uge tidligere end $date. Det er hensigten at tcl-koden skal kunne indsættes efter definitionen af variablen prevday.

Omskriv også kaldet af vp_return_page til slut i filen projector.tcl således at der er links til henholdsvis ugen efter og ugen før den pågældende dato.

Opgave 5.2

I denne opgave skal du konstruere filen add_res_form.tcl. Det kan antages at filen altid forespørges sammen med en form variabel date, som indeholder datoen for hvilken der skal reserveres en projektor.

Her følger en skabelon til filen:

  #set the form variable `date'
  set_form_variables
  
  # CHECK FORM VARIABLES
  ## A ## ...

  set db [ns_db gethandle]

  set query " -- DIT SVAR PÅ OPGAVE 4.6 HVOR DATOEN '2001-02-08' 
                 UDSKIFTES MED '$date' -- "

  set selection [ns_db select $db $query]

  # make an empty list
  set sel_box_list [list]

  # loop through the rows
  while { [ns_db getrow $db $selection] } {
      set_variables_after_query

      # append select option to the list
      lappend sel_box_list [list $id $name]
  }

  # use the procedure selectbox to actually create a 
  # selection box to put in an HTML form
  set sel_box [select_box "proj_id" $sel_box_list]

  # CODE FOR RETURNING A FORM TO THE USER
  ## B ## ...
Bemærk at proceduren select_box fra Opgave 2.2 benyttes til at opbygge select-boxen.

Som svar på opgaven skal du skrive kode for at undersøge indholdet af form-variablen date (programpunkt ## A ## i koden ovenfor). Herudover skal du skrive kode for at returnere en form til brugeren (programpunkt ## B ## i koden ovenfor).

Opgave 5.3

Konstruer filen add_res.tcl. Husk at skriv kode for at undersøge om indholdet af formvariablerne har den rette form. Du kan antage at proceduren vp_check_date er til rådighed udover procedurerne vp_check_id og vp_check_email der kan bruges til henholdsvis at undersøge om en streng indeholder et tal eller en email-adresse.

Husk at en bruger kun må få lov til at reservere en projektor hvis kodeordet der indtastes stemmer overens med kodeordet i databasen for den pågældende person.


mael@it.edu