N d anonymat : page 1 LI345 - EXAMEN DU 30 MAI 2012 Durée : 2h ---documents autorisés Transactions Soit la relation R(x, y) contenant 10 nuplets pour lesquels l attribut x vaut respectivement de 1 à 10. Soient 4 instructions SQL a à d, pouvant être traitées par les deux transactions T 1 et T 2 : a : update R set y=1 where x = 3 b : update R set y=1 where x>5 c : update R set y=1 where x between 2 and 7 d : update R set y=1 where x = 3 or x = 4 2 pts Une instruction traitée par une transaction Ti, est désignée en deux caractères : la lettre de l instruction suivie du numéro i de la transaction. Par exemple, a1 représente l instruction a traitée par T 1. La granularité du verrouillage est le n-uplet. Le protocole de verrouillage utilisé est le protocole en 2 phases (les verrous sont libérés à la fin de la transaction). Question 1. La séquence exemple a1,d1,b1,c2 produit-elle un interblocage? Non car T1 n attend pas T2 Question 2. Donner toutes les séquences possibles d instructions conduisant à un interblocage et pour lesquelles T1 traite sa première instruction avant que T2 commence. Expliquer brièvement le raisonnement en 2 phrases, puis écrire chaque séquence sous la forme d une liste. Remarque : dans une séquence, chaque opération est faite une seule fois.
page 2 Il faut d abord que T1 et T2 traitent chacune une opération sans blocage donc accès à des données distinctes. Les deux seules paires d opérations disctinctes sont (a,b) et (d, b) Avec la 1ère paire d opérations disctinctes (a,b) a1,b2,c1, d2 attention : a1,b2,d1,c2 ne provoque pas d interblocage (T1 n est pas bloquée) b1,a2,c1,d2 b1,a2,d1,c2 Avec la 2eme paire d opérations disctinctes (d,b) d1,b2,c1,a2 attention : d1,b2,a1,c2 ne provoque pas d interblocage (T1 n est pas bloquée) b1,d2,a1,c2 b1,d2,c1,a2 Total : 6 séquences Question 3. On veut modifier l instruction a pour que plus aucun interblocage ne puisse se produire, tout en conservant la forme de l instruction : update R set y=1 where x = n Donner toutes les valeurs possibles de n (dans [1,10]) où n est une valeur entière 1,2,5 SQL3 5 Pts On considère le schéma SQL3 suivant : Create type Personne ; Create type liste as table of varchar2(20); Create type Msg as object ( Expediteur ref Personne, Objet varchar2(50), Contenu varchar2(100) ); Create type Lesmsg as table of Msg; Create type EnsPers as table of ref Personne; Create type Personne as object ( Nom varchar2(30), Message Lesmsg, Amis EnsPers, Interets liste ) ; Question 1. Donnez l instruction permettant de créer la table LesPersonnes permettant de stocker des objets de type Personne.
page 3 1pt Create table LesPersonnes of Personne nested table message store as tabmsg, nested table amis store as tabamis, nested table interest store as tabliste; On suppose que la table LesPersonnes contient les données suivantes : La personne Paul a cinéma, cuisine comme intérêts. La personne Marie a Paul comme ami et musique, cinéma comme intérêts. La personne Max a Marie et Paul comme amis et randonnée, cinéma comme intérêts. Question 2. Ecrivez l instruction SQL3 permettant d insérer dans la base les données suivantes : La personne Luc a Marie comme ami et ski, piscine, comme intérêts. Rép. 1pt Insert into LesPersonnes p values ( Luc, Lesmsg (), enspers((select ref(p) from LesPersonnes p where p.nom= Marie )), liste( ski, piscine )) ; Question 3. Ecrire en SQL3 les requêtes suivantes : a) Nom et intérêts des amis de Max. 1pt Select value(a).nom, value(a).interets from LesPersonnes p, table(p.amis) a where p.nom= Max ; a) Nom des personnes ayant envoyé (expéditeurs) un message ayant pour objet élections, et nom de la personne qui l a reçu.
page 4 1 pt Select m.expediteur.nom, p.nom from LesPersonnes p, table(p.message) m where m.objet= elections ; Question 4. On veut compléter le schéma en ajoutant un type photo, constitué d une légende (texte de 50 caractères), d un ensemble de tags, et d une image. Chaque tag a un auteur, qui est une personne, et un contenu qui est un texte de 100 caractères. Une image est du type img, qu on suppose déjà défini. Ecrivez en SQL3 la ou les instruction(s) permettant de créer le type photo. 1pt Create type tag as object ( Contenu varchar2(100), auteur ref Personne); Create type enstag as table of tag ; Create type photo as object (legende varchar2(50), tags enstag, image img); XML et DTD 4 pts Soit le document contacts.xml suivant : <?xml version = "1.0"?> <!DOCTYPE CONTACTS SYSTEM "contacts.dtd"> < CONTACTS> <CONTACT CONTACT_NUM = "2"> <NAME>Teri Mancuso</NAME> <EMAIL>teri@teri.com</EMAIL> </CONTACT> <CONTACT CONTACT_NUM = "1" MOTHER = "2"> <NAME>Kristin Mancuso</NAME> <EMAIL>kristin@kristin.com</EMAIL> <EMAIL>kristin@yahoo.com</EMAIL> </CONTACT> </CONTACTS> Question 1. Compléter la DTD contacts.dtd ci-dessous de façon à ce qu elle valide le document contacts.xml: <?xml version = "1.0" encoding="utf-8"?> <!ELEMENT CONTACTS.> <!ELEMENT....> <!ELEMENT.......> <!ELEMENT....> <!ATTLIST..> <!ATTLIST.....>
page 5 <?xml version = "1.0" encoding="utf-8"?> <!ELEMENT CONTACTS ANY> <!ELEMENT CONTACT (NAME, EMAIL+)> <!ELEMENT NAME (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ATTLIST CONTACT CONTACT_NUM ID #REQUIRED> <!ATTLIST CONTACT MOTHER IDREF #IMPLIED> Question 2. Ajouter dans contacts.dtd, un attribut facultatif GENDER de valeur soit male soit female pour l élément CONTACT. <!ATTLIST..> <!ATTLIST CONTACT GENDER (male female) #IMPLIED> Question 3. On souhaite ajouter pour chaque contact un numéro de téléphone obligatoire, un deuxième numéro facultatif et une adresse facultative contenant le nom de la ville et le nom du pays comme ceci : <CONTACT CONTACT_NUM = "1"> <NAME>Teri Mancuso</NAME> <EMAIL>teri@teri.com</EMAIL> <PHONE> 01 58 65 25 96 </PHONE> <PHONE> 06 45 65 30 25 </PHONE> <ADDRESS> <CITY> Paris </CITY> <COUNTRY> France </COUNTRY> </ADDRESS> </CONTACT> Donner uniquement les déclarations à modifier ou à ajouter dans contacts.dtd. <!ELEMENT CONTACT (NAME, EMAIL+, PHONE, PHONE?, ADDRESS?)> <!ELEMENT PHONE (#PCDATA)> <!ELEMENT ADDRESS (CITY,COUNTRY) <!ELEMENT CITY (#PCDATA)> <!ELEMENT COUNTRY (#PCDATA)> Question 4. Dans contacts.dtd, la ligne déclarant l élément CONTACT est remplacée par <!ELEMENT CONTACT (EMAIL, NAME)>.
page 6 Le document XML ci-dessous est-il valide par rapport à cette nouvelle DTD? Si non, modifier la déclaration de l élément CONTACT pour valider ce document XML. <?xml version = "1.0"?> <!DOCTYPE CONTACTS SYSTEM "contacts.dtd"> < CONTACTS> <CONTACT CONTACT_NUM = "2"> <EMAIL>teri@teri.com</EMAIL> <NAME>Teri Mancuso</NAME> </CONTACT> <CONTACT CONTACT_NUM = "1" MOTHER = "2"> <NAME>Kristin Mancuso</NAME> <EMAIL>kristin@kristin.com</EMAIL> </CONTACT> </CONTACTS> Réponse (Oui/Non?) : <!ELEMENT CONTACT....> Non valide <!ELEMENT CONTACT (EMAIL NAME)* >. XPath et XSLT 5 pts On considère des fichiers XML qui contiennent des informations sur la quantité (ou proportion) d'aliments de chaque catégorie alimentaire qu'il est recommandé de consommer chaque jour pour avoir une alimentation équilibrée. Pour chaque catégorie d'aliments, des exemples d'aliments sont éventuellement mentionnés. Ces fichiers XML suivent la DTD pyramide.dtd suivante : <!ELEMENT pyramide (aliments)* > <!ELEMENT aliments (categorie,quantite,aliment*) > <!ELEMENT categorie (#PCDATA) > <!ELEMENT quantite (#PCDATA) > <!ELEMENT aliment (#PCDATA) > <!ATTLIST aliment id ID #REQUIRED type CDATA #IMPLIED> Le fichier pyramide.xml ci-dessous contient quelques exemples d'aliments : <?xml version="1.0"?> <!DOCTYPE pyramide SYSTEM "pyramide.dtd"> <pyramide> <aliments> <categorie>eau et boisson sans sucre</categorie> <quantite>à volonté</quantite> <aliment id='e1'>eau</aliment> <aliment id='e2'>thé</aliment> </aliments> <aliments> <categorie>fruits et légumes</categorie> <quantite>5 portions</quantite> <aliment id='fl1' type='fruit'>banane</aliment> <aliment id='fl2' type='fruit'>pomme</aliment> <aliment id='fl3' type='legume'>laitue</aliment> </aliments> <aliments> <categorie>céréales</categorie> <quantite>4 portions</quantite> <aliment id='c1'>blé</aliment> <aliment id='c2'>riz</aliment>
page 7 </aliments> <aliments> <categorie>laitage</categorie> <quantite>3 portions</quantite> </aliments> <aliments> <categorie>viandes et poissons</categorie> <quantite>1 à 2 portions</quantite> </aliments> <aliments> <categorie>gras, sucré, salé</categorie> <quantite>0 à 1 portion</quantite> <aliment id='gs1' type='viennoiserie'>pain au chocolat</aliment> </aliments> </pyramide> Question 1 (2 points) Exprimez en Xpath les requêtes suivantes : questions a,b,c,d : 0.25 point par question questions e,f : 0.5 point par question a. La quantité de "fruits et légumes" qu'il est recommandé de manger chaque jour? //aliments[categorie="fruits et légumes"]/quantite b. Les identifiants des aliments dont l'attribut "type" est indiqué? //aliment[@type]/@id c. Les catégories des aliments dont au moins 2 aliments sont mentionnés? //aliments[count(aliment)>=2]/categorie d. L'identifiant du deuxième aliment dans la catégorie "céréales"? //aliments[categorie='céréales']/aliment[2]/@id e. La quantité des aliments de type "viennoiserie"? //aliments/aliment[@type='viennoiserie']/../quantite //aliments[aliment/@type='viennoiserie']/quantite
page 8 f. Les nœuds <aliment> qui appartiennent aux catégories "fruits et légumes" ou "céréales"? //aliment[../categorie="fruits et légumes" or../categorie="céréales"] //aliments[categorie="fruits et légumes" or categorie="céréales"]/aliment Question 2 (1 point) Compléter la feuille XSL suivante pour qu elle transforme le document XML pyramide.xml en un document HTML contenant un tableau HTML contenant la liste des aliments appartenant à la catégorie "fruits et légumes". Par exemple, le résultat obtenu par l'application de cette feuille de style sur le fichier pyramide.xml doit permettre d'obtenir : <HTML> <H1>Liste des fruits et légumes</h1> <TABLE border="1"> <TR><TH>Type</TH><TH>Nom</TH></TR> <TR><TD>fruit</TD><TD>banane</TD></TR> <TR><TD>fruit</TD><TD>pomme</TD></TR> <TR><TD>legume</TD><TD>laitue</TD></TR> </TABLE> </HTML> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match= "..."> <xsl:template match= "/"> <HTML> <H1>Liste des fruits et légumes</h1> <TABLE border='1'> <TR><TH>Type</TH><TH>Nom</TH></TR> <xsl:apply-templates select='//aliments[categorie="fruits et légumes"]/aliment'/> </TABLE> </HTML> </xsl:template> <xsl:template match= "..."> <xsl:template match= "aliment"> <TR> <TD><xsl:value-of select='@type'/></td> <TD><xsl:value-of select='text()'/></td>
page 9 </TR> </xsl:template> </xsl:stylesheet> Question 3 (0.5 points) Compléter la feuille XSL suivante pour qu elle transforme un document XML (qui suit la DTD pyramide.dtd) en un autre document XML qui suit la même DTD mais qui contient seulement les nœuds <aliments> qui ne contiennent pas de nœud <aliment>. Le résultat obtenu doit être : <?xml version="1.0" encoding="utf-8"?> <pyramide> <aliments> <categorie>laitage</categorie> <quantite>3 portions</quantite> </aliments> <aliments> <categorie>viandes et poissons</categorie> <quantite>1 à 2 portions</quantite> </aliments> </pyramide> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match= "/"> <pyramide> <xsl:copy-of select='//aliments[count(aliment)=0]'/> </pyramide> </xsl:template> </xsl:stylesheet>
page 10 Question 4 (1.5 points) Compléter la feuille XSL suivante pour qu elle transforme un document XML (qui suit la DTD pyramide.dtd) en un autre document XML contenant tout d'abord les catégories d'aliments (avec notamment un attribut IDAS contenant une liste de références vers des identifiants d'aliments appartenant à cette catégorie), puis les nœuds <aliment>. Le document résultat doit suivre la DTD donnée ci-après : <!ELEMENT nourriture (categorie*,aliment*) > <!ELEMENT categorie (#PCDATA) > <!ATTLIST categorie IDAS IDREFS #IMPLIED nom CDATA #REQUIRED> <!ELEMENT aliment (#PCDATA) > <!ATTLIST aliment id ID #REQUIRED type CDATA #IMPLIED> Par exemple, le résultat obtenu par l'application de cette feuille de style sur le fichier pyramide.xml est : <?xml version="1.0" encoding="utf-8"?> <nourriture> <categorie IDAS="E1 E2 " nom="eau et boisson sans sucre">à volonté</categorie> <categorie IDAS="FL1 FL2 FL3 " nom="fruits et légumes">5 portions</categorie> <categorie IDAS="C1 C2 " nom="céréales">4 portions</categorie> <categorie nom="laitage">3 portions</categorie> <categorie nom="viandes et poissons">1 à 2 portions</categorie> <categorie IDAS="GS1 " nom="gras, sucré, salé">0 à 1 portion</categorie> <aliment id="e1">eau</aliment> <aliment id="e2">thé</aliment> <aliment id="fl1" type="fruit">banane</aliment> <aliment id="fl2" type="fruit">pomme</aliment> <aliment id="fl3" type="legume">laitue</aliment> <aliment id="c1">blé</aliment> <aliment id="c2">riz</aliment> <aliment id="gs1" type="viennoiserie">pain au chocolat</aliment> </nourriture> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match= "/"> <nourriture> <xsl:apply-templates select='//aliments'/> <xsl:copy-of select='//aliment'/> </nourriture> </xsl:template> <xsl:template match= "aliments"> <categorie nom="{categorie"> <xsl:if test='count(aliment)>0'> <xsl:attribute name='idas'> <xsl:for-each select='aliment'> <xsl:value-of select='@id'/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:attribute> </xsl:if> <xsl:value-of select='quantite'/> </categorie> </xsl:template>
page 11 </xsl:stylesheet> PHP 4 Pts On considère une liste de personnes avec leurs dates de naissance, stockée sous la forme d'un tableau associatif, dont chaque clé est un nom de personne et chaque valeur associée est à son tour un tableau associatif. Pour ce deuxième tableau, les clés sont : le jour, le mois et l'année de naissance de la personne à laquelle il est associé. Question 1(0.5 pt) Donnez le code php permettant de créer le tableau $personnes contenant les informations concernant les personnes suivantes : Martin, né le 23/12/2000 et Thomas, né le 27/05/1980. $personnes=array('martin'=>array('j'=>'23', 'm'=>12,'a'=>'2000'), 'Thomas'=>array ('j'=>'27','m'=>'5','a'=>'1980')) ; Question 2(1 pt) Donnez le code qui crée le formulaire permettant d'introduire les informations suivantes :
page 12 Informations sur une personne Personne : Martin Voir âge Voir date naissance O On doit sélectionner dans une liste déroulante le nom d'une personne, ensuite on doit faire un choix entre visualiser sa date de naissance et son âge. La liste déroulante doit être construite à partir du tableau défini à la question 1. Les informations introduites seront envoyées au script Chercher.php <form method='post' action='chercher.php'> Personne :<SELECT name='personne'> <?php foreach($tab as $nom=>$daten){ echo '<OPTION value=''$nom''>'.$nom.'</option>'?> </SELECT>   ; Voir âge : <input type='radio' name='choix' value='âge'/>  ; Voir date naissance : <input type='radio' name='choix' value='naissance'/><br/>
page 13 <input type='submit' value='valider'/> </form> Question 3 (1pt) Écrivez la fonction php affichedatenaissance($personnes) contenue dans le fichier Chercher.php qui affiche la date de naissance de la personne qui a été choisie par l'utilisateur à travers le formulaire, si l'option 'Voir date naissance' a été choisie. Si cette option n'a pas été choisie, la fonction n'affiche rien. Le mois de naissance sera affiché sous forme de chaîne de caractères. Par exemple, le résultat qui sera affiché pour Martin est le suivant : Martin, le 23 Décembre 2000. function affichedatenaissance(($personnes){ if(isset($_post['choix']) && $_POST['choix']=='naissance'){ $mois=array('janvier', 'Février', 'Mars', 'Avril', 'May', 'Juin','Juillet','Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre') ; echo $_POST['personne'].'le '.$personnes['personne']['j'].' '. $mois[$personnes['personne']['m']-1].' '. $personnes['personne']['a']. Question 4 (1.5pt) Ecrivez la fonction afficheage($personnes) qui prend comme paramètre un tableau créé comme précédemment et qui affiche pour chaque personne son âge (nombre d'années et de mois) à la date courante. Le résultat produit le 25 mai 2012 pour les deux personnes précédentes serait le suivant : Martin 11 ans 5 mois Thomas 31 ans 11 mois
page 14 Aide : utiliser la fonction php getdate(), sans paramètres, qui retourne un tableau associatif contenant des informations sur date courante locale. Les éléments du tableau associatif retourné sont les suivants : «mday» : Représentation numérique du jour du mois courant (1 à 31) «mon» : Représentation numérique du mois (1 à 12) «year» : Année, sur 4 chiffres (ex : 1999, 2003, etc.)
page 15 function afficheage($tab){ $datecrt=getdate() ; foreach($tab as $nom=>$daten){ if($datecrt['mon']<$daten['m']){ $annees=($datecrt['year']-1)-$daten['a'] ; if($datecrt['mday']<daten['j']) $mois=($datecrt['mon']-1)+(12-$daten['m']) ; else $mois=$datecrt['mon']+(12-$daten['m']) ; if($datecrt['mon']>$daten[1]){ $annees = $datecrt['year']-$daten['a'] ; if($datecrt['mday']<daten['j']) $mois=($datecrt['mon']-1)-$daten['m'] ; else $mois=$datecrt['mon']-$daten['m'] ; if($datecrt['mon']==$daten['m']){ if($datecrt['mday']<daten['j']){
page 16 $annees = ($datecrt['year']-1)-$daten['a'] ; $mois = ($datecrt['mon']-1)+(12-$daten['m']) ;//== 11 else{ $annees = ($datecrt['year']-1)-$daten['a'] ; $mois=0 ; echo $nom.' '.$annees.' ans '.$mois.' mois<br/>' ;