DBForge
Qu'est-ce que DBForge ?

DBForge est un outil pour décrire des schémas de base de données et générer le code OCaml permettant d'accéder à ces bases.

Principe

L'idée de l'outil est basée sur le problème suivant: La création de fonctions exécutant des requêtes SQL

  • est répétitive: traduction de paramètres en chaînes de caractères et concaténation pour créer les requête, exécution de la requête, test de la valeur de retour, traduction des données (pour les requêtes select) vers les type OCaml correspondant,
  • est source d'erreurs: une erreur dans la concaténation de chaînes pour créer la requête (par exemple l'oubli d'un espace) ou dans les chaînes concaténées causer une erreur à l'exécution,
  • ne permet pas une bonne maintenabilité: en effet, quand le schéma de la base de données est modifié, il faut vérifier que chaque requête est encore correcte par rapport au schéma.

Pour résoudre ces problèmes, nous voulons

  • générer automatiquement les fonctions qui exécutent les requêtes de base sur chaque table,
  • permettre à l'utilisateur la définition de requêtes complexes, en langage SQL; les fonctions OCaml exécutant ces requêtes étant automatiquement générées, nous voulons garantir à la compilationque l'exécution de ces requêtes n'échouera (par exemple à cause d'erreurs de syntaxe ou encore par référencement de colonne non existente dans une table),
  • vérifier automatiquement et invalider des requêtes quand le schéma de la base est modifié.

Pour faire tout cela, nous avons besoin des informations suivantes à propos de chaque colonne de chaque table:

  • son nom,
  • la définition de son type selon la base de données cible,
  • des attributs indiquant par exemple si la colonne peut être NULL, si c'est une clé,
  • son type OCaml dans le code source que nous voulons générer,
  • les fonctions à utiliser pour traduire les valeurs de la base de données vers des valeurs OCaml et réciproquement.

La liste des tables avec les informations ci-dessus pour chaque colonne est ce que nous appelons le schéma de base de données.

L'outil DBForge permet de définir un tel schéma dans une interface graphique et de générer le code OCaml correspondant. L'utilisateur peut également définir des requêtes SQL pour qu'elles soient encapsulées dans des fonctions OCaml dans le code généré. Pour l'instant, seules les requêtes de type "select" et "union" sont supportées.

Exemple

La distribution contient un exemple dans le répertoire src/dbforge/example. On y trouve plusieurs fichiers.

Makefile est le fichier pour compiler avec make.

base.xml est le fichier contenant le schéma. Il peut être édité par l'éditeur graphique lancé avec la commande suivante:

dbforge2.gui.{x,byte} base.xml

Le code OCaml est généré à partir de ce fichier par la commande suivante:

dbforge2.{x,byte} -o base.ml base.xml

Le fichier base.ml contient alors le code OCaml généré. Ce dernier utilise deux modules installés en même temps que Cameleon2: Dbf_sql_driver et Dbf_sql_misc. On peut obtenir le fichier d'interface avec la commande suivante:

ocamlc -I +cameleon2 -i base.ml > base.mli

Le code généré est composé de foncteurs, un par table et un pour les requêtes additionnelles. Ces foncteurs prennent tous en paramètre un module du type Dbf_sql_driver.SqlDriver, qui permet d'abstraire le système de gestion de base de données utilisé en utilisant des modules partageant la même interface.

example.ml est le fichier principal de l'exemple. Il utilise le module Dbf_mysql dont le source est installé en même temps que Cameleon2. Comme il nécessite que la bibliothèque OCaml-Mysql soit installée, il n'est pas compilé à l'installation mais doit être compilé par l'application qui souhaite s'en servir. Ce module est du type Dbf_sql_driver.SqlDriver et peut donc être passé en paramètre aux foncteurs générés dans le fichier base.ml. Les modules obtenus fournissent les fonctions d'accès à la base de données.

A compléter...