Examination 28 mars 2019
Detta är den individuella examinationen som är en del av kmom10.
Uppgifterna skall lösas individuellt och du får inte prata, diskutera eller chatta med någon för att ta hjälp. Fråga läraren om något är oklart med uppgifterna. Om du är distansstudent så kan du använda kursens Gitter-kanal, eller forumet, för att ställa allmänna frågor till läraren.
Övriga hjälpmedel är tillåtna, inklusive egen dator, access till Internet och tillgång till tidigare kursmoment och ditt kursrepo.
Examinationen är begränsad till 5 timmar.
Du kan maximalt få 30 poäng. Du behöver samla minst 18 poäng (60%) för att bli godkänd på tentamen. Samla fler poäng för att nå ett högre slutbetyg på kursen.
Du har troligen redan gjort dbwebb exam checkout try1
.
Spara all kod i me/kmom10/try1
.
Missa inte att läsa sista stycket om hur du skall lämna in din examination.
Innan du börjar, läs igenom hela dokumentet så att du får en uppfattning om uppgifterna, poängfördelningen och vad uppgifterna omfattar.
#Inledning
Du har fått ett jobb på Säkerhetspolisens (SÄPO) hemliga avdelning för att utreda samband mellan olika brott och förberedelser till brott. Det är första veckan på jobbet och du vill framstå som en god databasprogrammerare.
Chefen har gett dig ett excelark med lite data och bett dig “fixa lite snygga rapporter” inför veckans avdelningsmöte.
Du är redo, du har gjort sånt här förut, så du tar datat och påbörjar arbetet att slänga ihop en databas, här tänker du glänsa.
#Uppgift 1 (20p)
Bygg en databas med en webbklient och en terminalklient.
#Kodstandard små bokstäver
Kom ihåg att vi använder en rekommenderad kodstandard som säger små bokstäver på tabeller, vyer, procedurer, triggers och kolumnnamn, eventuellt separerade med _.
Vad du än gör, var noggrann och konsekvent i hur du använder stora/små bokstäver, annars går det inte rätta din inlämning.
#Generella krav
Din katalog innehåller en
package.json
med samtliga externa moduler som används.Inloggningsdetaljer till databasen skall sparas i
config/db/sapo.json
.Javascript-kod som delas mellan klienterna, eller extra moduler, lägger du i katalogen
src
.
#Databasmodell
Du tittar i Excelfilen och skapar dig en bild av informationen.
Det finns en logg som sparar händelser där SÄPO-agenter har noterat misstänkt bottslighetet.
Loggen är kopplad mot Personer och Organisationer och varje händelse är av en Kategori.
- Rita ett logiskt ER diagram över databasens tabeller. Spara diagrammet som
doc/er.pdf
.
#Databas
Skapa databasen och fyll den med data.
SQL-filer lägger du i
sql/sapo
. Skapa filensetup.sql
för att skapa databasen och användaren. Låt din databas hetasapo
och ge användarenuser
full tillgång till databasen.Skapa filen
ddl.sql
där du samlar all kod som skapar tabeller, vyer, procedurer, triggers och liknande. Använd den filen för att skapa databasens schema.Skapa filen
insert.sql
med SQL-kod för att lägga in innehåll i tabellerna, motsvarande det som syns i Excelfilen. Innehållet kan du läsa in från CSV-filer eller manuellt via egenskapade INSERT-satser. CSV-filerna sparar du i samma katalog som sql-filerna (tänk på radbrytningar alá LF).Om du skapar extra SQL-kod för att testa tabellerna, till exempel vanlig SELECT, så sparar du den koden i
dml.sql
.
#Webbklient
Bygg en webbklient.
Skapa en webbklient med Express. Servern startas via
node index.js
och skall snurra på porten 1337.Alla sidor skall ha en navigeringsdel så det går att klicka sig fram mellan sidorna, via navigeringen.
I webbklienten, skapa routen
/sapo/index
som visar en välkomstssida. Välj själv vad du visar på förstasidan.All access från klienten mot databasen skall gå via lagrade procedurer.
Skapa routen
/sapo/logg
som visar en rapport från tabellenlogg
tillsammans med organisationens namn, personens fulla namn och nivå på brottskategorin.Lägg till länken i navbaren.
#Terminalklient
Bygg ett terminalprogram och spara main-funktionen i
cli.js
. Terminalprogrammet skall startas mednode cli.js
.All access från klienten mot databasen skall gå via lagrade procedurer.
Ditt terminalprogram skall fungera som en oändlig kommandoloop där man kan skriva in kommandon som programmet utför. Det skall finnas ett kommando
menu
som visar menyn med samtliga kommandon. När man skriver kommandotexit
skall programmet avslutas.Skapa kommandot
logg
som visar en rapport från tabellenlogg
tillsammans med organisationens namn, personens fulla namn och nivå på brottskategorin.Lägg till kommandot så det syns när man kör
menu
.
#Backup med lagrade procedurer
Skapa en backup av din databas och spara den i sql/sapo/backup.sql
.
Så här gör du för att få med de lagrade procedurerna.
mysqldump -udbwebb -p --routines sapo > backup.sql # alterativt mysqldump -udbwebb -p --routines --result-file=backup.sql sapo
Om du använder en specifik CHARSET/COLLATION när du gör CREATE DATABASE, så behöver du ta din backup så här.
mysqldump -udbwebb -p --routines --add-drop-database --databases sapo > backup.sql # alterativt mysqldump -udbwebb -p --routines --add-drop-database --result-file=backup.sql --databases sapo
Är din backup felaktig går det inte att rätta din inlämning.
Inspektera gärna din backupfil innan du känner dig nöjd (titta på den i texteditorn).
#Uppgift 2 (5p)
Chefen kommer förbi och hävdar bestämt att det behövs en sökfunktion i ditt verktyg som visar loggen. Man skall kunna söka på delsträngar av kategorier, personer (id, fornamn, efternamn), organisationer (id, namn) och loggtexten (vad) samt exakt sökning på säkerhetsnivån (kategorin).
I webbklienten, skapa routen
sapo/search
där man i ett formulär kan ange en söksträng. Visa samma rapport som du skapade tidigare, men visa enbart de rader som matchar söksträngen.Lägg till länken i navbaren.
I terminalklienten, skapa kommandot
search <str>
som visar motsvarande.Lägg till kommandot så det syns när man kör
menu
.
#Uppgift 3 (5p)
Denna uppgiften är lite extra svår och kan tvinga dig att pilla lite extra med din SQL-konstruktion, kanske till och med googla lite ny information.
Chefen är stressad och precis innan mötet börjar så kommer han till dig och ber om en mycket specifik rapport. Han säger “rapporten måste se ut EXAKT som den jag visar här”. Du gör som han säger, även om rapporten ser aningen udda ut.
Det handlar om att visa alla personer och visa antalet händelser de eventuellt varit inblandade i och vilka organisationer de varit kopplade till.
Studera utskriften nedan extra noggrant, skriv sedan SQL-kod som löser EXAKT samma rapport med EXAKT samma innehåll (samma rubriker, samma rader, samma ordning på raderna, samma innehåll i respektive kolumn).
Det är rapportens innehåll som är viktigt, inte hur du skriver ut det i tabellformatet, det är som vanligt godtyckligt tabellformat.
+----------------------------+-------+---------------------------------------------------+ | Namn | Antal | Organisation | +----------------------------+-------+---------------------------------------------------+ | Mumintrollet Mumin (mumin) | 2 | Henriks Änglar | | Mikael Roos (mos) | 2 | Internationell pengatvätt + Pensionerade spioner | | John Doe (jodoe) | 1 | Pensionerade spioner | | Jane Doe (jadoe) | 0 | NULL | +----------------------------+-------+---------------------------------------------------+
- I terminalklienten, skapa kommandot
person
som visar ovan rapport.
#Inlämning
Läs noggrant, checka av varje punkt innan du är klar.
Innan du lämnar in så skall du se till att din kod validerar via
dbwebb validate
. Varje valideringsfel ger normalt avdrag med 1 poäng.Uppdatera din databasbackup i
sql/sapo/backup.sql
så att den är aktuell.Lämna slutligen in genom att göra
dbwebb exam seal try1
.När du är helt klar så går du in på Canvas och “lämnar in” tentan genom att skriva “KLAR!” följt av din akronym. Om det är något särskilt som läraren behöver veta om din inlämning så skriver du det.
Vid problem, gör en dbwebb upload
och maila sedan mos@bth.se och berätta vad som hänt och ange ditt namn och studentakronym.
#Revision history
- 2019-03-28: (B, mos) Uppgift 3 löses med terminalen, samt förtydligande om tabellutskrift.