Titre du stage Durée Encadrant Lieu du stage Sujet de stage

publicité
Titre du stage
Interrogation sûre et exible de bases de données depuis OCaml
Durée
2 à 3 mois
Encadrant
Jérôme Vouillon, laboratoire PPS, université Paris Diderot - Paris 7 & CNRS
(http://www.pps.jussieu.fr/~vouillon/)
Lieu du stage
Laboratoire PPS (http://www.pps.jussieu.fr/)
Sujet de stage
Contexte
L'objectif du stage est de dénir une interface permettant d'interagir de manière sûre et exible avec une base de données depuis OCaml. Plus
précisement, les requêtes doivent être vériées syntaxiquement et typées à la
compilation. Il doit également être possible de construire des requêtes complexes
de façon modulaire, en combinant des requêtes plus simples.
Généralement, l'interaction avec une base de données depuis un programme
s'eectue en formulant des requêtes SQL sous la forme de chaînes de caractères.
Mysql.exec db
(Format.sprintf "select * from users where id = %d" id)
Il n'y a pas de vérication statique que la requête soit bien-formée, ni qu'elle
soit en adéquation avec le contenu de la base de donnée. Cette approche est également peu modulaire : on peut créer des requêtes complexes par concaténation
de chaîne de caractères, mais le code est alors peu lisible.
La bibliothèque PG'OCaml1 propose de typer les requêtes SQL. Des requêtes
pouvant comporter des trous (nommés) sont envoyées lors de la compilation à
la base de donnée. Celle-ci les vérie et retourne leurs types, ainsi que le type
des trous. Ces types sont utilisée pour produire le code OCaml approprié.
PGSQL(db) "select * from users where id = $id"
On garantit ainsi que les requêtes sont bien formées et correspondent au contenu
de la base de donnée. Mais, puisque les requêtes doivent être connues à la compilation, toute modularité est perdu. En pratique, on se retrouve facilement dans
1 http://developer.berlios.de/projects/pgocaml/
1
un programme avec de multiples requêtes eectuant la même jointure entre deux
tables mais sélectionnant des lignes diérentes de la table résultante.
Il paraît dicile de typer des requêtes SQL de façon modulaire depuis
OCaml. En particulier, pour typer une jointure select * from t1, t2 ,
il faudrait disposer de la concaténation de types enregistrements. Nous proposons donc de formuler les requêtes sous forme de compréhensions [1, 3, 2, 4].
{ u | u <- users, u.id = id }
Un tel langage a de plus de bonne propriétés algébriques et est facile à traduire
vers SQL.
Travail demandé
Il s'agit de dénir et implémenter un langage de requête à
base de compréhensions. Ce langage de requête sera déni comme une extension
de syntaxe Camlp4 pour OCaml. Il doit être choisi de manière à être expressif
tout en pouvant être traduit vers SQL et typé à l'aide du système de type
d'OCaml.
Connaissances préalables
Bonne aisance dans la programmation en Caml.
Références
[1] Peter Buneman, Leonid Libkin, Dan Suciu, Val Tannen, and Limsoon Wong.
Comprehension syntax. SIGMOD Rec., 23(1) :8796, 1994.
[2] Torsten Grust, Manuel Mayr, Jan Rittinger, and Tom Schreiber. Ferry :
Database-supported program execution. In Proceedings of the 28th ACM
SIGMOD Int'l Conference on Management of Data, June 2009. To appear.
[3] Simon Peyton Jones and Philip Wadler. Comprehensive comprehensions.
In Haskell '07 : Proceedings of the ACM SIGPLAN workshop on Haskell
workshop, pages 6172, New York, NY, USA, 2007. ACM.
[4] Jan Van den Bussche. Simulation of the nested relational algebra by the
at relational algebra, with an application to the complexity of evaluating
powerset algebra expressions. Theor. Comput. Sci., 254(1-2) :363377, 2001.
2
Téléchargement