Actualités Volubis

Actualités

informations du mois & nouveautés

à la une ce mois-ci :

Nouvelle version de l'extension DB2 for i pour Visual Studio Code

Ce 21 juillet, une nouvelle version de l'extension DB2 for , très attendue, est délivrée (en toujours en preview).

Elle apporte des fonctionnalités présentes dans Access Client Solutions au travers de l'outil "Schémas" permettant l'introspection et des actions sur la base de données. L'intérêt est d'avoir à disposition un maximum d'outils pour le développeur directement dans l'environnement VSCode.

Tour d'horizon!

 

La page de l'extension (Open Source) : https://marketplace.visualstudio.com/items?itemName=HalcyonTechLtd.vscode-db2i

 

Installation

Vous pouvez installer l'extension directement, mais elle est également inclue dans le "IBM i Development Pack" qui rassemble une douzaine d'extensions pour l'IBM i (RPGLE, COBOL, DB2, couverture de code etc ...). C'est donc notre méthode préférée.

Lien vers l'extension : https://marketplace.visualstudio.com/items?itemName=HalcyonTechLtd.ibm-i-development-pack

 

Utilisation

Une fois connecté à un IBM i, l'extension DB2 for i est représentée par le symbole BD/Table. Vous avez alors accès aux éléments suivants :

  • Alias
  • Fonctions (scalaire et table)
  • Variables globales
  • Index
  • Types
  • Tables
  • Triggers
  • Types
  • Vues

 

Des actions spécifiques sont disponibles pour chaque item :

 

Mais l'extension a besoin d'un serveur sur l'IBM i pour communiquer. A défaut, toutes les options tombent en erreur :

Serveur

La documentation indique :

 

Le dépôt correspondant (toujours Open Source) : https://github.com/ThePrez/CodeForIBMiServer

 

VSCode installa automatiquement le serveur dans le répertoire /home/user/.vscode (donc pour chaque utilisateur) :

 

 

L'outil propose ensuite de démarrer un job SQL (QZDASOINIT)

 

Remarque : pensez vérifier que les notifications de VSCode soient bien activées (votre serviteur a cherché longtemps pourquoi cela ne fonctionnait pas) !

 

Vous pouvez modifier le comportement de façon permamente dans les options :

 

 Choisissez de démarrer le travail pour aller plus loin. A défaut vous aurez systématiquement :

 

 Maintenant toutes les fonctions sont disponibles. Exemple :

 

L'option "Generate SQL" produit le code DDL correspondant à l'objet :

 

L'option "Get related objects" produit la liste des dépendances (alias, index, vue, clés ...) :

 

Le produit est encore en béta, et nous n'avons pas tout testé dans les détails. Toutefois, l'utilisation est réactive. Il reste quelques limitations, comme l'impossibilité de faire un copier/coller depuis un résultat.

Mais ce n'est qu'un début, attendons la release ! Nul doute que l'extension évoluera rapidement !   

 

Serveur Java 

Si vous voulez "jouer" pour comprendre le fonctionnement du serveur Java, lisez la suite !

 

Pour télécharger le fichier jar contenant le serveur :

 

 Une fois le fichier jar téléchargé, placez le sur l'IFS de votre IBM i (nous l'avons fait par ACS ici) :

 

Si vous l'avez déjà mis en place avec VSCode vous pouvez bien entendu utiliser /home/user/.vscode/codeforiserver-1.0.0-alpha-32.jar

 

Le serveur est prévu pour fonctionner au travers d'une connexion SSH :

- un "message" JSON en saisi en entrée, correspondant à une demande de traitement

- le serveur écrit la réponse JSON en sortie sur le terminal

 

Vous pouvez visualiser ce fonctionnement avec Putty ou tout autre client SSH :

Pour lancer le serveur Java dans la session SSH : 

/QOpenSys/QIBM/ProdData/JavaVM/jdk80/64bit/bin/java -jar /vscode/codeforiserver-1.0.0-alpha-32.jar

Vous pouvez ensuite saisir des demandes au format JSON attendu par le serveur (cf la documentation sur la page du produit https://github.com/ThePrez/CodeForIBMiServer) :

 

Le principe est le suivant :

- toutes les demandes sont asynchrones, chaque message contient donc un "id" qui doit être unique (il sera présent également dans la réponse)

- le "type" indique quelle est l'action souhaitée : connexion, déconnexion, requête SQL, commande CL ...

- en fonction de la valeur de "type", des paramètres optionnels : commande CL ou instruction SQL par exemple

 

Quelques exemples re-formatés pour plus de lisibilité :

1. Connexion (obligatoire) :

{"id": "connexion1", "type": "connect", "props":"naming=system;libraries=nb,sqlsample"}

Produit :

{"id":"connexion1","job":"331975/QUSER/QZDASOINIT","success":true}

2. Commande CL :

{"id": "cl1", "type": "cl", "cmd": "crtlib nbiserver"}

Produit :

{
    "id": "cl1",
    "data": [{
            "SUMMARY": "CPC2102 [COMP ]: Bibliothèque NBISERVER créée.",
            "SEVERITY": 0,
            "MESSAGE_SECOND_LEVEL_TEXT": "\u0026N Cause . . . . . : Bibliothèque NBISERVER créée dans le pool de mémoire secondaire (ASP) 1, unité ASP *SYSBAS.",
            "MESSAGE_ID": "CPC2102",
            "MESSAGE_TYPE": "COMPLETION",
            "MESSAGE_SUBTYPE": null,
            "MESSAGE_TIMESTAMP": "2023-07-24 16:45:31.982991",
            "FROM_LIBRARY": "QSYS",
            "FROM_PROGRAM": "QLICRLIB",
            "FROM_MODULE": null,
            "FROM_PROCEDURE": null,
            "FROM_INSTRUCTION": "0B2C",
            "TO_LIBRARY": "QSYS",
            "TO_PROGRAM": "QSQRUN4",
            "TO_MODULE": "QSQCALLSP",
            "TO_PROCEDURE": "CALLPROGRAM",
            "TO_INSTRUCTION": "45027",
            "FROM_USER": "NB",
            "MESSAGE_LIBRARY": "QSYS",
            "MESSAGE_FILE": "QCPFMSG",
            "MESSAGE_TOKEN_LENGTH": 22,
            "MESSAGE_TOKENS": "D5C2C9E2C5D9E5C5D94000015CE2E8E2C2C1E2404040",
            "MESSAGE_TEXT": "Bibliothèque NBISERVER créée.",
            "MESSAGE_KEY": "00000174",
            "QUALIFIED_JOB_NAME": "331973/QUSER/QZDASOINIT"
        }
    ],
    "is_done": true,
    "success": true
}

3. SQL :

{"id": "1l", "type": "sql", "rows":2, "sql":"select * from nb.clientww"}

Produit :

{
    "id": "1l",
    "has_results": true,
    "metadata": {
        "column_count": 4,
        "job": "332483/QUSER/QZDASOINIT",
        "columns": [{
                "name": "NAME",
                "type": "CHAR",
                "display_size": 30,
                "label": "NAME"
            }, {
                "name": "ADDR_FR",
                "type": "CHAR",
                "display_size": 40,
                "label": "ADDR_FR"
            }, {
                "name": "ADDR_US",
                "type": "CHAR",
                "display_size": 40,
                "label": "ADDR_US"
            }, {
                "name": "ADDR_WW",
                "type": "CHAR",
                "display_size": 40,
                "label": "ADDR_WW"
            }
        ]
    },
    "data": [{
            "NAME": "Client 1",
            "ADDR_FR": "En France - cli1",
            "ADDR_US": "Aux US - cli1",
            "ADDR_WW": "Ailleurs - cli1"
        }, {
            "NAME": "Client 2",
            "ADDR_FR": "En France - cli2",
            "ADDR_US": "Aux US - cli2",
            "ADDR_WW": "Ailleurs - cli2"
        }
    ],
    "is_done": false,
    "success": true
}

4. Obtenir la version :

{"id": "v1", "type": "getversion"}

Produit :

{"id":"v1","build_date":"2023-07-20 19:35:07 (GMT)","version":"1.0.0-alpha-32","success":true}

5. Terminer le serveur :

{"id": "bye", "type": "exit"}

 

On peut également tester au travers de QSH/QP2TERM :

 

 

Nos tweets