Présentation

Dès lors qu’un projet prend de l’ampleur, il devient nécessaire d’automatiser certaines tâches. Avec ETI*Extract, l’utilisateur peut tout faire avec sa souris, mais les commandes en ligne sont rares... et quasiment pas documentées.

L’objectif de cet article est de vous démontrer que l’on peut réaliser des utilitaires très puissants autour d’ETI*Extract, principalement avec ex_dbtool et ex_tclFrontEnd, pour lesquels malheureusement aucune documentation n'est fournie par l'éditeur.

Mise en garde

Attention, un mauvais usage de certaines commandes peut endommager les données de votre MetaStore. En plusieurs années de développement avec ETI*Extract, cela ne m’est encore jamais arrivé, mais on ne sait jamais. Les utilitaires doivent être développés et testés sur une base réservée à cet usage.

ex_dbtool

La première fois que j’ai utilisé ex_dbtool, c’était pour débloquer un utilisateur dont le poste de travail avait subi une coupure d’électricité alors qu’il utilisait ETI*Extract. Cela se passait avec le hotliner au téléphone. J’ai noté les commandes, et je me suis mis à rêver que d’autres commandes existaient et me permettraient d’automatiser certaines tâches.

La première étape consiste à ouvrir un MetaStore, et afficher l’arborescence de ses Worksets :

> ex_dbtool
open MaBase
iw f
pwh b
quit

Après quelques recherches, j’ai identifié plus de 400 commandes ! Je ne sais pas toutes les utiliser, mais certaines m’ont déjà rendu de nombreux services. Pour vous convaincre, partons sur un exemple précis : récupérer la liste des objets d'un Workset sous la forme type nom version. La ligne de commande suivante permet de le faire, dans laquelle $ms est le nom du MetaStore et $ws le Workset :

(echo open $ms
 echo cw $ws
 echo pw b
 echo quit
) | ex_dbtool 2> /dev/null | grep '^[[]' | (
  while read line; do
    objtype=`expr "$line" : '[[]\(.*\)[]]'`
    objkey=`expr "$line" : '.*[]]\(.*\)\.[0-9]*\.[0-9]*:[0-9]*'`
    objver=`expr "$line" : '.*\.\([0-9]*\.[0-9]*:[0-9]*\)'`
    echo $objtype $objkey $objver
  done)

ex_tclFrontEnd

Il s’agit d’un interpréteur Tcl contenant une extension pour accéder à des fonctionnalités d’ETI*Extract. Il s’utilise avec la syntaxe suivante :

ex_tclfrontend

ex_tclfrontend est pratique pour automatiser des installations de DSL, importer ou exporter des objets. Chaque commande retourne une chaîne de caractère de la forme X: Y où X est un code de status (T ou F si OK, E si erreur) et Y le résultat éventuel de la commande.

Exemple : importer une Conversion dans un Workset avec ses Schemas et Databases de versions données

Lorsqu’on importe une Conversion, les versions des dépendances importées sont celles disponibles dans le Workset courant, et la dernière version disponible sinon. Lorsqu’on travaille avec plusieurs versions majeures de Schemas, par exemple, et que ces Schemas sont dans un Workset parent, la Conversion risque de « perdre » les versions d’origine des Schemas. Une solution est d’écrire un petit utilitaire utilisant ex_tclFrontEnd qui va créer un Workset temporaire, copier les Databases et Schemas ainsi que la Conversion, réaliser l’import, faire un check-in, puis tout nettoyer.

# sch1, vsch1, db1, vdb1, sch2, vsch2, db2, vdb2 = schemas et databases et leurs versions majeures
# conv, vconv = la conversion
# ws = le workset
# fexp = fichier .exp de la conversion
# on se place dans le workset de base
eti_MetaStore SetCurrWorkset $ws
# on cree un workset fils et on se positionne dedans
eti_Workset CreateChildWorkset Temp
eti_MetaStore SetCurrWorkset $ws/Temp
# copie des objets
eti_Workset AddObject Schema $sch1 $vsch1
eti_Workset AddObject Schema $sch2 $vsch2
eti_Workset AddObject Database $db1 $vdb1
eti_Workset AddObject Database $db2 $vdb2
eti_Workset AddObject Conversion $conv $vconv
eti_Workset CheckOutObj Conversion $conv $vconv
# import puis check-in
eti_Workset ImportObjMinor Conversion $conv $fexp
eti_Workset CheckInObj Conversion $conv $vconv
# remove du workset temporaire
set fd [open |ex_dbtool w]
puts $fd "open [file tail [eti_GetMetaStorePath]]"
puts $fd "cw $ws"
puts $fd "delws $ws/Temp"
puts $fd "t"
puts $fd "quit"
catch {close $fd}

On remarque qu’il faut appeler ex_dbtool pour supprimer le Workset temporaire et son contenu. Les utilitaires sont en général des scripts pour ex_tclFrontEnd qui ouvrent un pipe vers un ex_dbtool à l'initialisation pour permettre un dialogue entre les deux programmes qui sont complémentaires.

Pour rendre cet utilitaire utilisable réellement, il faudrait ajouter les éléments suivants :

Conclusion

Vous devez maintenant être convaincus qu’il est possible de réaliser (assez) facilement des utilitaires autour d’ETI*Extract ! Parmi les applications possibles, voici des exemples de réalisations  :

Retour