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.
La première étape consiste à ouvrir un MetaStore, et afficher l’arborescence de ses Worksets :
> ex_dbtool
open MaBase
iw f
pwh b
quit
< Internal Name
Omitted by Caller Request >
pour les Worksets internes
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
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 :