CTRLFIC
From Pickwiki
Jump to navigationJump to search
To periodically check the Unidata files in level 1 overflow (from a list or just for given file) or level 2 using Unidata "guide" and "checkover" commands.
It creates a log in spool file _HOLD_ with Unidata commands you can execute later to optimize the found files. A mail is also send in case of corrupted files.
========= Main Program =============
*====================================================================== *= Domaine : OUTILS *= Programme : CTRLFIC *= Version 7.1.1.1 *= Date de mise a jour : 01/09/25 *= Date de generation : 01/09/28 *====================================================================== *= L'instruction suivante permet de connaitre le numero de version du *= programme compile sous unix par la commande : what _[[NomProgramme]] *= [[NumeroDeVersionDuProgramme]] = "@(#)[CTRLFIC 7.1.1.1 01/09/25]" *= *====================================================================== *-- Libelle : Controle de fichier *-- Date creation : 18/08/97 *-- Reference : *-- Objet : Cf. c-dessous *====================================================================== *-- Utilitaires *-- Controle de la structure de fichiers Unidata par l'utilisation de *-- la commande "guide" *-- Le controle porte sur : *-- Le fichier passe dans la commande s'il existe *-- La liste active si l'on est en SELECT *-- La liste LCTRLFIC si elle existe *-- Rien si aucun des cas ci-dessus *-- *-- Si l'execution se fait avec le parametre -M, la file SFILES<3> est *-- automatiquement envoyee par mail a l'AU *-- Creation : 18/08/97 par HME *---------------------------------------------------------------------- *-- Modification : HME *-- Le : 20/08/98 *-- Objet : Ajoût d'un SP.CLOSE de la file d'erreur avant de pouvoir *-- la traiter par uuencode, sinon la piece jointe du mail *-- est vide ! *---------------------------------------------------------------------- *-- Modification : HME *-- Le : 10/03/99 *-- Objet : Rajout dans la file de messages des "conseils" donnes par *-- la commande 'guide' afin d'optimiser les fichiers analyses. *---------------------------------------------------------------------- *-- Modification : HME *-- Le : 16/03/99 *-- Objet : Ajout, dans le cas d'un appel sans paramêtre, a un appel *-- a l'utilitaire CHECKOVER qui recherche les fichiers du compte *-- en debordement de niveau 2 afin de les ajouter a ceux de la *-- liste LCTRLFIC *---------------------------------------------------------------------- *---------------------------------------------------------------------- *-- Modification : HME *-- Le : 13/01/00 *-- Objet : Ajout d'une trace d'execution dans le fichier BOITENOIRE *---------------------------------------------------------------------- *---------------------------------------------------------------------- *-- Date de modification : 05/09/01 *-- Reference : DI00090, MDA_00090_001 *-- Objet : Ajouter la faculte de generer la liste des ordres d'optimisation des *-- fichiers a executer apres le passage de CTRLFIC. *-- Regeneration automatique de la liste LCTRLFIC (a partir de TT.CTRLFIC) *-- si celle-ci a ete supprimee. *-- Permettre a CTRLFIC de retourner un code d'erreur a la procedure *-- appelante. *---------------------------------------------------------------------- * *=== Recuperation de l'ordre d'execution PHRASE = @SENTENCE PHRASE = TRIM(PHRASE) * *=== Initialisation de la trace d'execution DATA "Controle des Fichiers",10 EXECUTE "TRACE.OLD" CALL TRACE.DEBUT("CTRLFIC","Controle des Fichiers") * *=== Initialisation des files d'impression SFILES = '' SFILES<1> = '' SFILES<2> = 'MES.CTRLFIC' MESFILN = 1 SFILES<3> = 'ERR.CTRLFIC' ERRFILN = 2 CALL SLIMPRIMANTE(SFILES) GOSUB GETFILE ; *-- Recuperation du nom de la file d'erreurs dans _HOLD_ * *=== Initialisation des variables ERRFLAG = 0 ; *-- Nombre de fichiers errones FICFLAG = 0 ; *-- Nombre de fichiers traites ADVFLAG = 0 ; *-- Nombre de fichiers a optimiser. NBFIC = 0 ; *-- Nombre de fichiers a traiter NBUSR = 0 ; *-- Nombre d'utilisateurs Unidata NFIC = "" ; *-- Nom du fichier a traiter en parametre FICHIER = "" ; *-- Nom du fichier en cours de traitement CAPUSR = "" ; *-- Capture de l'execution de listuser MFLAG = "" ; *-- Flag de mail auto si pb *-- Debut modification DI00090 EQUATE TRUE TO 1, FALSE TO 0 ; *-- Constantes booleenes UNDEFINED = "Indefini" ; *-- Valeur introuvable dans EXTRAIRE NL = CHAR (10) ; *-- Newline POS = 0 ; *-- Postition dans chaine ADVFIC pour recherche FINI = FALSE ; *-- Condition de la boucle CQFF = '' ; *-- Tableau avec Ce Qu'il Faut Faire (RESIZE, REBUILD) [[NBL_CQFF]] = 0 ; *-- Nombre de lignes dans CQFF [[ERR_OK]] = 0 ; *-- Pas d'erreur [[ERR_VOC]] = 897 ; *-- Fichier non trouve [[ERR_FIXFILE]] = 998 ; *-- Fichier doit être repare avec fixfile [[ERR_KO]] = 999 ; *-- Erreur grave RC = [[ERR_OK]]; *-- Code erreur SORTIE.ECRAN = "" ; *-- Messages sur l'ecran SORTIE.MSG = "" ; *-- Messages sur MESFILN1 SORTIE.ERR = "" ; *-- Messages sur ERRFILN1 [[ENTETE_MSG]] = "" ; *-- Entête des files MESFILN et ERRFILN [[ENTETE_ERR]] = "" ; *-- Entête des files MESFILN et ERRFILN [[PREDICTED_RESIZE_BLOCK_SIZE]] = UNDEFINED *-- Valeur extraits d'ADVFIC dans EXTRAIRE [[PREDICTED_RESIZE_MODULO]] = UNDEFINED *-- Valeur extraits d'ADVFIC dans EXTRAIRE [[CURRENT_BLOCK_SIZE]] = UNDEFINED *-- Valeur extraits d'ADVFIC dans EXTRAIRE [[BLOCK_SIZE_MULTIPLIER]] = UNDEFINED *-- Parametre commande RESIZE GOSUB ENTETE ; *- Initialiser entêtes RET1 = "" ; *-- Resultat de RETURNING (non utilise) CAP1 = "" ; *-- Resultat de CAPURING (non utilise) *-- Fin modification DI00090 *=== Determination de la population a controler *--- Recuperation du nom de fichier potentiel IF FIELD(UPCASE(PHRASE)," ",1) # "RUN" THEN NFIC = FIELD(PHRASE," ",2) IF NFIC = "-M" THEN MFLAG = "-M" NFIC = "" END ELSE MFLAG = FIELD(PHRASE," ",3) END END ELSE NFIC = FIELD(PHRASE," ",4) IF NFIC = "-M" THEN MFLAG = "-M" NFIC = "" END ELSE MFLAG=FIELD(PHRASE," ",5) END END * IF NFIC <> "" ; *-- J'ai un nom en parametre de ma commande THEN EXECUTE 'TSELECT VOC = "' : NFIC :'"' CAPTURING RESULTAT IF @SYSTEM.RETURN.CODE = 0 THEN *- Affichage message SORTIE.MSG := "Il n'y a pas de composant " : NFIC : NL SORTIE.MSG := NL SORTIE.MSG := "Pas de fichier selectionne, aucune analyse effectuee" : NL *- Affichage ecran SORTIE.ECRAN := "Il n'y a pas de composant " : NFIC : NL SORTIE.ECRAN := NL SORTIE.ECRAN := "Pas de fichier selectionne, aucune analyse effectuee" : NL FINI = TRUE *- N.B. Avec FINI = TRUE on n'entre pas dans la boucle GOSUB AFFICHAGE END IF @SYSTEM.RETURN.CODE < 0 THEN SORTIE.ECRAN := "Erreur lors selection dans VOC" : NL SORTIE.ECRAN := "Message d'erreur : ":RESULTAT : NL RC = [[ERR_KO]] *- N.B. Avec RC = [[ERR_KO]] on n'entre pas dans la boucle GOSUB AFFICHAGE END NBFIC = @SYSTEM.RETURN.CODE END ELSE ; *-- Je n'ai pas de nom en parametre IF SELECTINFO(1) <> 1 THEN ; *-- Je ne suis pas dans une selection GOSUB CHKOVR ; *-- On va chercher les fichiers a optimiser IF RC # [[ERR_KO]] THEN GETLIST "LCTRLFICTOT" SETTING NBFIC ELSE SORTIE.MSG := "Pas de fichier selectionne, aucune analyse effectuee" : NL SORTIE.ECRAN := "Pas de fichier selectionne, aucune analyse effectuee" : NL FINI = TRUE END END END ELSE ; *-- Je suis dans une selection NBFIC = SYSTEM(11) ; *-- Je recupere le nombre d'elements de la liste END END GOSUB AFFICHAGE * SORTIE.MSG := "Il y a ":NBFIC:" fichier(s) a analyser" : NL SORTIE.ECRAN := "Il y a ":NBFIC:" fichier(s) a analyser" : NL *== Mise en garde sur les utilisateurs connectes GOSUB GETUSR * *== On commence l'analyse de la population selectionnee LOOP READNEXT FICHIER ELSE FINI = TRUE * WHILE RC # [[ERR_KO]] AND NOT (FINI) DO ;*- Tant que RC # [[ERR_KO]] on continue FICFLAG = FICFLAG + 1 IF FICHIER = "" OR FICHIER = "*" OR TRIM(FICHIER)=" " THEN CONTINUE * *- Verifier si FICHIER est de type DIR EXECUTE 'COUNT VOC "':FICHIER:'" IF F1 = "DIR"' RETURNING RET1 CAPTURING CAP1 IF @SYSTEM.RETURN.CODE > 0 THEN ;*- Fichier de type DIR SORTIE.ECRAN := "Pas d'analyse de " : FICHIER : " (fichier de type DIR) " : NL SORTIE.MSG := "Pas d'analyse de " : FICHIER : " (fichier de type DIR) " : NL CONTINUE END *- Verifier si FICHIER est un dictionnaire; DICT est affiche dans les *- commandes REBUILD ou RESIZE a executer DICT = "" IF FICHIER[1,2] = "D_" THEN DICT = "DICT " ; *- FICHIER est un dictionnaire * SORTIE.ECRAN := "Analyse de ":FICHIER:NL *- La suite sur MESFILN vient plus bas: Pas appeller AFFICHAGE SORTIE.MSG := TIMEDATE():" - Analyse de ":FICHIER * GOSUB GUIDE IF RC = [[ERR_KO]] THEN EXIT * FINDSTR "Errors encountered: 0" IN ERRFIC SETTING F,V,S THEN * *- Analyse fichier advice OSREAD ADVFIC FROM OSADVFIC ELSE NULL POS = INDEX (ADVFIC, "may improve performance", 1) IF POS <> 0 THEN *- La suite de Analyse de ... SORTIE.MSG := " - OK mais optimisation possible par " : NL SORTIE.MSG := ADVFIC : NL * *- Analyse approfondie GOSUB ANALYSE ADVFLAG = ADVFLAG + 1 END ELSE SORTIE.MSG := " - OK" : NL ; *-- Pas de probleme pour ce fichier END GOSUB AFFICHAGE OSDELETE OSADVFIC OSDELETE OSFIXFIC END ELSE SORTIE.MSG := " - NOK" : NL ; *-- On a trouve au moins une erreur de structure GOSUB AFFICHAGE GOSUB FIXFILE END * *- Supprime fichier d'erreurs OSDELETE OSERRFIC REPEAT ; *-- On va analyser un autre fichier * *=== Fin de programme, Affichage compte rendu GOSUB [[COMPTE_RENDU]] * *=== MAJ de la trace d'execution CALL TRACE.FIN("CTRLFIC","Controle des Fichiers") IF NBFIC <> 0 THEN SORTIE.MSG := "======= FIN DES TRAITEMENTS =======" : NL GOSUB AFFICHAGE END * *- Rendre Code Erreur a l'appelant @USER.RETURN.CODE = RC * STOP "Fin de traitement (RC = " : RC : ")" * *=============================================================================== * *=== Sous-programme pour la definition des entêtes ENTETE: [[ENTETE_MSG]] = "" [[ENTETE_ERR]] = "" * [[ENTETE_MSG]] := "==============================================" : NL [[ENTETE_MSG]] := " ANALYSE DE LA STRUCTURE DES FICHIERS UNIDATA " : NL [[ENTETE_MSG]] := "==============================================" : NL [[ENTETE_ERR]] = [[ENTETE_MSG]] [[ENTETE_MSG]] := TIMEDATE() : CHAR(9) : "Programme : ":SYSTEM(40) : NL [[ENTETE_ERR]] := NL [[ENTETE_MSG]] := NL [[ENTETE_ERR]] := NL * RETURN * *=== Sous-programme pour l'affichagedes messages d'erreur AFFICHAGE: * *- Affichage des 3 sorties IF SORTIE.MSG # "" THEN IF LEN ([[ENTETE_MSG]]) # 0 THEN PRINT ON MESFILN [[ENTETE_MSG]] [1, LEN ([[ENTETE_MSG]]) - 1] [[ENTETE_MSG]] = "" END PRINT ON MESFILN SORTIE.MSG [1, LEN (SORTIE.MSG) - 1] SORTIE.MSG = "" END * IF SORTIE.ERR # "" THEN IF LEN ([[ENTETE_ERR]]) # 0 THEN PRINT ON ERRFILN [[ENTETE_ERR]] [1, LEN ([[ENTETE_ERR]]) - 1] [[ENTETE_ERR]] = "" END PRINT ON ERRFILN SORTIE.ERR [1, LEN (SORTIE.ERR) - 1] SORTIE.ERR = "" END * IF SORTIE.ECRAN # "" THEN PRINT SORTIE.ECRAN [1, LEN (SORTIE.ECRAN) - 1] SORTIE.ECRAN = "" END * RETURN * *=== Sous-programme de recherche des utilisateurs connectes GETUSR: IF (CAPUSR = "") THEN *- On appelle GETUSR deux fois, la deuxieme fois on sais *- deja combien il y en a d'utilisateurs, on affiche la mise en *- garde sur SORTIE.ERR PCPERFORM "listuser" CAPTURING CAPUSR * IF @SYSTEM.RETURN.CODE < 0 THEN NBUSR = -1 ; *-- listuser n'a pas fonctionne (peut-être pb proces lcp) END ELSE NBUSR = DCOUNT(CAPUSR,@AM) - 8 ; *-- On enleve l'entete, l'en-pied et nous CONVERT @AM TO NL IN CAPUSR END * *- Definir Mise en garde IF NBUSR > 1 THEN SORTIE.ECRAN := "!! Attention il y a d'autres utilisateurs connectes ce qui peut fausser les analyses !!" : NL [[MISE_EN_GARDE]] = NL [[MISE_EN_GARDE]] := "!! Attention il y a d'autres utilisateurs que vous (":@LOGNAME:"-":@USERNO:")" : NL [[MISE_EN_GARDE]] := " ce qui peut fausser les analyses !!" : NL [[MISE_EN_GARDE]] := NL END ELSE IF NBUSR < 0 THEN SORTIE.ECRAN := "!! Impossible de controler la presence d'autres utilisateurs !!" : NL [[MISE_EN_GARDE]] := NL [[MISE_EN_GARDE]] := "!! Impossible de verifier la presence d'autres utilisateurs" : NL [[MISE_EN_GARDE]] := " les analyses effectues devront donc etre controlees !!" : NL [[MISE_EN_GARDE]] := NL END END *- Mise en garde sortie sur MESFILN SORTIE.MSG := [[MISE_EN_GARDE]] END ELSE *- Mise en garde sortie sur ERRFILN SORTIE.ERR := [[MISE_EN_GARDE]] *- N.B. La partie SORTIE.ECRAN ne sort pas une deuxieme foix END * *- Afficher la mise en garde GOSUB AFFICHAGE * RETURN * *=== Sous-Programme de recuperation du nom de la file d'erreur GETFILE: *- Ce sous-programme suppose que la commande juste precedente est un *- CALL SLIMPRIMANTE et que le dernier argument de ce dernier est la file *- d'erreur. SOHOLD = 0 ; *-- Flag d'ouverture du dictionnaire de _HOLD_ OPEN "DICT _HOLD_" TO FDHOLD ELSE SOHOLD = 1 IF SOHOLD <> 1 THEN READV NUM FROM FDHOLD,"NEXT.HOLD",1 THEN NUM = NUM - 2 ; *-- on enleve 1 pour la file 19 de SLIMPRIMANTE et 1 pour avoir le dernier utilise ERRFIL = SFILES<3>:"_":NUM "R%4" END ELSE ERRFIL = SFILES<3>:"_????" ; *-- On n'a pas reussi a lire le dictionnaire, on prend tout ! END END ELSE ERRFIL = SFILES<3>:"_????" ; *-- On n'a pas reussi a ouvrir le dictionnaire, on prend tout ! END CLOSE FDHOLD RETURN * *=== Envoi d'un mail a l'AU SENDMAIL: TMPFILE = "/tmp[[/CTRLFIC_]]":@USERNO:".sh" ; *-- Fichier temporaire de commande Unix TMPLINE="" ; *-- Tableau commandes Unix TMPLINE<1>="#!/sbin/sh" TMPLINE<2>="mail you@yourcompany <<ZZTABOULE" TMPLINE<3>="subject: ":ERRFIL TMPLINE<4>="L'analyse des fichiers par la commande ":PHRASE:" a produit la file jointe ":SFILES<3> TMPLINE<5>="Merci de verifier ces resultats et de corriger les fichiers dont la structure serait invalide" TMPLINE<6>="" TMPLINE<7>="Cette analyse a ete effectuee par le login ":@LOGNAME:" sur le compte ":@WHO TMPLINE<8>="" TMPLINE<9>="`uuencode ":OCONV("_HOLD_","TVOC;C;;2"):"/":ERRFIL:" ":ERRFIL:".doc`" TMPLINE<10>="ZZTABOULE" CONVERT @AM TO NL IN TMPLINE OSWRITE TMPLINE ON TMPFILE ON ERROR GOSUB [[PB_MAIL]] ; *-- On cree le fichier de commande RETURN ; *-- Sortie de SENDMAIL END IF STATUS() <> 0 THEN GOSUB [[PB_MAIL]] RETURN ; *-- Sortie de SENDMAIL END EXECUTE "! chmod u+wx ":TMPFILE:" ; ":TMPFILE:" ; rm ":TMPFILE ; *-- Et on l'execute avant de l'effacer IF @SYSTEM.RETURN.CODE < 0 THEN GOSUB [[PB_MAIL]] RETURN ; *-- Sortie de SENDMAIL END * RETURN * [[PB_MAIL]]: *-- On a eu un probleme d'envoi de mail SORTIE.MSG := "Le mail n'a pas pu etre envoye a l'Assistance" : NL SORTIE.ECRAN := "Le mail n'a pas pu etre envoye a l'Assistance" : NL GOSUB AFFICHAGE * RETURN * *== Sous-programme de recuperation des overflow de niveau 2 CHKOVR: *- Ce sous-programme recupere les fichiers en overflow de type 2 et *- les ajoute a la liste LCTRLFIC pour faire la liste LCTRLFICTOT qui *- contient la totalite des fichiers a tester SORTIE.ECRAN := "Recherche des fichiers en debordement de niveau 2" : NL GOSUB AFFICHAGE *- *- On fait un peu de menage dans les listes EXECUTE "touch SAVEDLISTS[[/LCTRLFICOVR000]] ; touch SAVEDLISTS[[/LCTRLFICTOT000]]" CAPTURING RESULTAT *- *- On cherche les fichiers en overflow de type 2 EXECUTE "! checkover" CAPTURING RESULTAT *- *- On recupere ces fichiers pour en faire une liste exploitable IF @SYSTEM.RETURN.CODE >= 0 THEN EXECUTE "! cat [[U_OVERFLOWED]] | awk '{print $1}' > SAVEDLISTS[[/LCTRLFICOVR000]]" CAPTURING RESULTAT EXECUTE "!wc -l SAVEDLISTS[[/LCTRLFICOVR000]] | awk '{print $1}'" CAPTURING RESULTAT SORTIE.ECRAN := "Il y a ":RESULTAT<1,1>:" fichier(s) en debordement de niveau 2" : NL END IF @SYSTEM.RETURN.CODE >= 0 THEN EXECUTE "rm [[U_OVERFLOWED]]" CAPTURING RESULTAT *- *- Verifier existence LCTRLFIC *- Si elle n'existe plus on va la creer avec LCTRLFIC PHRASE = 'SELECT SAVEDLISTS ="LCTRLFIC000"' EXECUTE PHRASE CAPTURING RESULTAT TROUVE = @SYSTEM.RETURN.CODE *- Ne pas oublier : dans LCTRLFIC il y a un autre SELECT CLEARSELECT IF TROUVE = 0 THEN SORTIE.ECRAN := "Reconstitution de la liste des fichiers a verifier" : NL GOSUB LCTRLFIC END *- *- On reunit les listes LCTRLFIC et LCTRLFICOVR dans LCTRLFICTOT DATA "LCTRLFICTOT" EXECUTE "SLUNION-LIST SAVEDLISTS LCTRLFIC LCTRLFICOVR" CAPTURING RESULTAT *- IF @SYSTEM.RETURN.CODE < 0 THEN SORTIE.ECRAN := "Erreur SLUNION-LIST":NL SORTIE.ECRAN := "Message d'erreur : ":RESULTAT : NL RC = [[ERR_KO]] * RETURN END * RETURN * *== Sous-programme pour la reconstitution de la liste LCTRLFIC si celle-ci a ete *== supprimee LCTRLFIC: *- Lire le fichier TT.CTRLFIC OPEN 'TT.CTRLFIC' TO TT.CTRLFIC ELSE SORTIE.ECRAN := "Erreur lors de l'ouverture TT.CTRLFIC" : NL RC = [[ERR_KO]] * RETURN END SELECT TT.CTRLFIC *- Lire la liste LCTRLFIC000 dans TT.CTRLFIC.REC READ TT.CTRLFIC.REC FROM TT.CTRLFIC,"LCTRLFIC000" ELSE SORTIE.ECRAN := "Erreur de lecture TT.CTRLFIC" : NL RC = [[ERR_KO]] * RETURN END * CLOSE TT.CTRLFIC *- Sauve la liste dans LCTRLFIC car SLUNION-LIST attend les 2 listes dans *- SAVEDLISTS *- La phrase "... key(s) written to 1 record." apparait a l'ecran WRITELIST TT.CTRLFIC.REC ON "LCTRLFIC" CLEARSELECT * RETURN * *== Sous-programme d'extraction de parametres pour RESIZE EXTRAIRE: *- Recuperer *- "current block size", *- "predicted resize block size" et *- "predicted resize modulo". *- ADVFIC contient les lignes suivantes (y compris les blancs en debut *- de ligne): ************************************************ * The average data size of 129.57 bytes, * the standard deviation of 12.30 bytes, * and the total data size of 534367 bytes * were evaluated. The predicted resize * block size is 2048 bytes. The predicted * resize modulo is 379 group(s). * The current block size is 1024 bytes. * The current modulo is 11 group(s). ************************************************ * Il y a une variante : * were evaluated. The predicted resize * values are the same as the current ones. * Changing the modulo may help. * Dans ce cas ce qu'il faut faire est un RESIZE sans arguments ************************************************ * *- Initialisation des variables a indefini [[PREDICTED_RESIZE_BLOCK_SIZE]] = UNDEFINED [[PREDICTED_RESIZE_MODULO]] = UNDEFINED [[CURRENT_BLOCK_SIZE]] = UNDEFINED *- Les 4 chaines que l'on va chercher LOOK<1> = "The predicted resize" LOOK<2> = "block size is " LOOK<3> = "resize modulo is " LOOK<4> = "The current block size is " LOOK<9> = "values are the same as the current ones" * FOR I = 1 TO 4 ;*- Pas 9 !!! POS = INDEX (ADVFIC [1, LEN (ADVFIC)], LOOK <I>, 1) IF (POS = 0) THEN IF (I = 2 AND INDEX (ADVFIC [1, LEN (ADVFIC)], LOOK <9>, 1) = 1) THEN *- Dans ce cas il faut faire RESIZE sans *- arguments. Remonte dans ASS28819 *- Il se peut qu'apres le RESIZE guide donnne *- les même conseils * RETURN END * SORTIE.ECRAN := "Erreur inattendue" : NL SORTIE.ECRAN := CHAR(9) : LOOK <I> : " introuvable" : NL RC = [[ERR_KO]] * RETURN END * *- ADVFIC advance BEGIN CASE CASE I = 1 *- 4 blanc en debut de ligne plus un <NL> *- N.B. *- ADVFIC [POS + LEN (LOOK) + 5, LEN (ADVFIC)] *- n'est pas la même chose que *- ADVFIC = ADVFIC [POS + LEN (LOOK) + 5] ADVFIC = ADVFIC [POS + LEN (LOOK<I>) + 5, LEN (ADVFIC)] CASE I <> 1 ADVFIC = ADVFIC [POS + LEN (LOOK<I>), LEN (ADVFIC)] END CASE * *- Extraire les valeurs necessaires BEGIN CASE CASE I = 2 *- Catch "predicted resize block size" [[PREDICTED_RESIZE_BLOCK_SIZE]] = FIELD (ADVFIC, " ", 1) CASE I = 3 *- Catch "predicted resize modulo" [[PREDICTED_RESIZE_MODULO]] = FIELD (ADVFIC, " ", 1) CASE I = 4 *- Catch "current block size" [[CURRENT_BLOCK_SIZE]] = FIELD (ADVFIC, " ", 1) END CASE NEXT I * *- [[UniData]] Commands Reference *- block.size.multiplier *- An integer between 0 and 16, that determines block size: *- 0 512 bytes *- 1 1,024 bytes *- 2 2,048 bytes *- 4 4,096 bytes *- 8 8,192 bytes *- 16 or greater *- 16 bytes *- Pour "16 bytes" j'ai lu "16 kbytes" BEGIN CASE CASE [[PREDICTED_RESIZE_BLOCK_SIZE]] < 1024 [[BLOCK_SIZE_MULTIPLIER]] = 0 CASE [[PREDICTED_RESIZE_BLOCK_SIZE]] > 8192 [[BLOCK_SIZE_MULTIPLIER]] = 16 CASE [[PREDICTED_RESIZE_BLOCK_SIZE]] = UNDEFINED [[BLOCK_SIZE_MULTIPLIER]] = UNDEFINED CASE TRUE *- Calcul de base, voir tableau ci-dessus [[BLOCK_SIZE_MULTIPLIER]] = [[PREDICTED_RESIZE_BLOCK_SIZE]] / 1024 END CASE * RETURN * *== Sous-programme pour execution de la commande guide GUIDE: OSERRFIC = '/tmp[[/CTRLFIC_]]':FICHIER:'.LIS' OSDELETE OSERRFIC OSFIXFIC = '/tmp[[/CTRLFIC_]]':FICHIER:'.DAT' OSDELETE OSFIXFIC OSADVFIC = '/tmp[[/CTRLFIC_]]':FICHIER:'.ADV' OSDELETE OSADVFIC COMMAND = '! guide -ns -a':OSADVFIC:' -e':OSERRFIC:' -f':OSFIXFIC:' "':FICHIER:'"' *- *-- Debut modification DI00090 *- Ajoute CAPTURING RESULTAT car des messages suivants apparaissent lors *- de l'execution de guide *- one "*" represents 2000 groups *- ** EXECUTE COMMAND CAPTURING RESULTAT *-- Fin modification DI00090 *- IF @SYSTEM.RETURN.CODE < 0 THEN SORTIE.ECRAN := "Erreur lors de l'execution de : guide":NL SORTIE.ECRAN := "Message d'erreur : ":RESULTAT : NL RC = [[ERR_KO]] GOSUB AFFICHAGE END OSREAD ERRFIC FROM OSERRFIC ELSE SORTIE.ECRAN := "Pb lecture resultat de guide":NL SORTIE.ECRAN := "Message d'erreur : ":RESULTAT : NL RC = [[ERR_KO]] GOSUB AFFICHAGE END * RETURN * *== Sous-programme pour l'analyse du fichier OSADVDIC contenant des consignes *== pour optimiser FICHIER ANALYSE: *- Analyse ADVFIC * *- Est-ce qu'il s'agit d'un RESIZE ou d'un REBUILD ? *- Qu'est-ce qu'il y avait avant "may improve *- performance" ? LOOK = "Resizing this file " *- Chercher LOOK a partir de POS moins la longeuer de *- LOOK, on doit tomber a 1 *- N.B. INDEX sur une chaine sans fin ne marche pas! *- "INDEX (ADVFIC [POS - LEN(LOOK) - 1], LOOK, 1) = 0" IF INDEX (ADVFIC [POS - LEN(LOOK), LEN (ADVFIC)], LOOK, 1) = 1 THEN *- Il s'agit de: "Resizing this file may improve *- performance" *- ATTENTION Il ne faut plus ce servir de ADVFIC *- apres EXTRAIRE et ceci jusqu'a la prochaine boucle ADVFIC = ADVFIC [POS - LEN(LOOK) - 1, LEN (ADVFIC)] * *- Extraire les valeurs pour la commande RESIZE GOSUB EXTRAIRE IF RC = [[ERR_KO]] THEN RETURN * *- Ce Qu'il Faut Faire IF [[PREDICTED_RESIZE_BLOCK_SIZE]] = UNDEFINED OR [[PREDICTED_RESIZE_MODULO]] = UNDEFINED OR [[CURRENT_BLOCK_SIZE]] = UNDEFINED THEN *- Pas de preconisations trouvees [[NBL_CQFF]] += 1 CQFF <NBL_CQFF> = "RESIZE ":DICT:FICHIER END ELSE IF [[PREDICTED_RESIZE_BLOCK_SIZE]] = [[CURRENT_BLOCK_SIZE]] THEN *- Pas besoin de redimensionner *- le [[BLOCK_SIZE]] [[NBL_CQFF]] += 1 CQFF <NBL_CQFF> = "RESIZE " : DICT : FICHIER : " " : [[PREDICTED_RESIZE_MODULO]] END ELSE *- Redimensionner le [[BLOCK_SIZE]] [[NBL_CQFF]] += 1 CQFF <NBL_CQFF> = "RESIZE " : DICT : FICHIER : " " : [[PREDICTED_RESIZE_MODULO]] : "," : [[BLOCK_SIZE_MULTIPLIER]] END END END ELSE *- Pareil que pour "Resizing this file ..." ci-dessus LOOK = "Running REBUILD.FILE " IF INDEX (ADVFIC [POS - LEN(LOOK), LEN (ADVFIC)], LOOK, 1) = 1 THEN [[NBL_CQFF]] += 1 CQFF <NBL_CQFF> = "REBUILD.FILE ":DICT:FICHIER END ELSE *- On a trouve "may improve performance" *- mais on n'a pas reconnu ce qu'il y a *- avant SORTIE.ECRAN := "Erreur inattendue" : NL RC = [[ERR_KO]] GOSUB AFFICHAGE * RETURN END END * RETURN * *== Sous programme pour message d'erreur dans file d'erreur FIXFILE: IF ERRFLAG = 0 THEN ; *- Deuxieme appel de GETUSR, affiche sur ERRFILN (l'entête y *- sera egalement initialise) *- On sais deja combien il y a d'utilisateurs mais on affiche la *- mise en garde a nouveau GOSUB GETUSR END * ERRFLAG = ERRFLAG + 1 SORTIE.ERR := "====================================================================" : NL SORTIE.ERR := TIMEDATE(): NL SORTIE.ERR := "Erreur(s) detectee(s) lors du controle du fichier ":FICHIER: NL SORTIE.ERR := ERRFIC: NL * FINDSTR "No files were processed!" IN ERRFIC SETTING F,V,S THEN SORTIE.ECRAN := "Fichier ":FICHIER:" a analyser mais physiquement introuvable" : NL RC = [[ERR_VOC]] END ELSE SORTIE.ERR := "Le fichier ":OSFIXFIC:" devrait aider a reparer le fichier ":FICHIER:"." : NL SORTIE.ERR := "Apres avoir sauvegarde le fichier ":FICHIER:" et s'etre assure que" : NL SORTIE.ERR := "personne n'y accede, on pourra utiliser la commande" : NL SORTIE.ERR := "fixfile -f -d/tmp[[/RECUP_]]":FICHIER:" -i":OSFIXFIC : NL SORTIE.ERR := "====================================================================" : NL SORTIE.ECRAN := " Des erreurs ont ete trouvees pour le fichier ":FICHIER : NL SORTIE.ECRAN := " Contacter l'Assistance " : NL SORTIE.ECRAN := " lui fournissant la file ":SFILES<3> : NL RC = [[ERR_FIXFILE]] END * GOSUB AFFICHAGE * RETURN * *== Sous-programme de compte-rendu de CTRLFIC [[COMPTE_RENDU]]: IF RC = [[ERR_KO]] THEN IF FICHIER <> "" THEN SORTIE.ECRAN := "Erreur lors de l'analyse du fichier ":FICHIER : NL SORTIE.ECRAN := "Contacter l'Assistance" : NL SORTIE.ECRAN := "avec le message d'erreur ci-dessus" : NL END * IF NBFIC <> 0 THEN SORTIE.MSG := NL SORTIE.MSG := TIMEDATE():" Il y a eu ":ERRFLAG:" fichier(s) errone(s), ":ADVFLAG:" optimisable(s), sur ":FICFLAG:" controle(s)" : NL END * IF ERRFLAG <> 0 THEN SORTIE.MSG := " Contacter l'Assistance" : NL SORTIE.MSG := " lui fournissant la file ":SFILES<3> : NL SORTIE.ERR := NL SORTIE.ERR := TIMEDATE():" Il y a eu ":ERRFLAG:" fichier(s) errone(s), ":ADVFLAG:" optimisable(s), sur ":FICFLAG:" controle(s)" : NL SORTIE.ERR := "======= FIN DES TRAITEMENTS =======" : NL EXECUTE "SP.CLOSE ":ERRFILN IF (MFLAG = "-M" OR MFLAG = "M") THEN GOSUB SENDMAIL ; *-- Envoi d'un mail END * *- Ce Qu'il Faut Faire IF [[NBL_CQFF]] > 0 THEN SORTIE.MSG := NL SORTIE.MSG := "Pour optimiser les performances executer les commandes suivantes :" : NL FOR I = 1 TO [[NBL_CQFF]] SORTIE.MSG := CQFF <I> : NL NEXT I END * *- Dernier affichage GOSUB AFFICHAGE * RETURN
========= Subroutines =============
*========================================================================== *= Programme : SLUNION-LIST *= Version 1.1 *= Date de mise à jour : 96/04/25 *= Date de génération : 01/02/14 *=========================================================================== *= L'instruction suivante permet de connaître le numéro de version du *= programme compilé sous unix par la commande : what _[[NomProgramme]] *= [[NumeroDeVersionDuProgramme]] = "@(#)[SLUNION-LIST 1.1 96/04/25]" *= *=========================================================================== *---------------------------------------------------------------------------- *-- PORTAGE *-- ESD : Remplace LIST.UNION pour les Procs *-- Creation : 11:04:13 06 Dec 1994 *-- Version : 1.0 *-- Date de MAJ : *-- MAJ : *-- Compile : *---------------------------------------------------------------------------- * ATTENTION : * . le programme se compile en type 'U' * . le programme se met en type UNIDATA pour utiliser MERGE-LIST *---------------------------------------------------------------------------- * Differences entre ESD et UNIDATA * . la syntaxe generale est differente * . les listes peuvent se trouver dans un fichier autre que POINTER-FILE *---------------------------------------------------------------------------- * SYNTAXE : SLUNION-LIST nom.fichier list1 list2 * ======= TO : {(nnom.fichier} list3 * . nom.fichier : nom du fichier ou sont stockees les listes * . list1 : premiere liste * . list2 : seconde liste * . nnom.fichier : nom du fichier ou ecrire la liste resultat * si pas de nom de fichier alors c'est celui de depart * . list3 : liste resultat *---------------------------------------------------------------------------- * ATTENTION : si le fichier n'est pas SAVEDLISTS * . copie des listes dans le fichier SAVEDLISTS * . execution de la commande MERGE-LIST de UNIDATA * . recopie de la liste resulat dans le bon fichier * . suppression des listes dans SAVEDLISTS *---------------------------------------------------------------------------- * Initialisation des variables * PROMPT "" * Liste des messages d'anomalies LMSG = "" LMSG<1> = "0":@VM:"Impossible d'ouvrir le fichier --> " * OPEN "SAVEDLISTS" TO FLIS ELSE NOMSG = 1 ; MSGC = "SAVEDLISTS" ; GOSUB 9999 END *---------------------------------------------------------------------------- * Lecture , analyse et reconstitution des donnees de depart * PHRASEDEP = @SENTENCE PHRASEDEP = TRIM(PHRASEDEP) * Nom du fichier DNOMFIC = FIELD(PHRASEDEP," ",2) LISTE1 = FIELD(PHRASEDEP," ",3) LISTE2 = FIELD(PHRASEDEP," ",4) OPTION = FIELD(PHRASEDEP," ",5) * si le fichier n'est pas SAVEDLIST alors copier les listes * dans le fichier SAVEDLISTS, exec IF DNOMFIC # "SAVEDLISTS" THEN ITLIS1 = "$":LISTE1:"$" ITLIS2 = "$":LISTE2:"$" OPEN DNOMFIC TO FDEP ELSE NOMSG = 1 ; MSGC = DNOMFIC ; GOSUB 9999 READ WDEP FROM FDEP,LISTE1 ELSE WDEP = "" READU EXIST FROM FLIS,ITLIS1:"000" ELSE NULL WRITE WDEP ON FLIS,ITLIS1:"000" READ WDEP FROM FDEP,LISTE2 ELSE WDEP = "" READU EXIST FROM FLIS,ITLIS2:"000" ELSE NULL WRITE WDEP ON FLIS,ITLIS2:"000" END ELSE ITLIS1 = LISTE1 ITLIS2 = LISTE2 END *---------------------------------------------------------------------------- * Lecture des donnees d'arrivee * INPUT PHRASEARR: PHRASEARR = TRIM(PHRASEARR) IF PHRASEARR[1,1] = "(" THEN ANOMFIC = FIELD(PHRASEARR," ",1) ANOMFIC = ANOMFIC[2,LEN(ANOMFIC)-1] LISTE3 = FIELD(PHRASEARR," ",2) END ELSE ANOMFIC = DNOMFIC LISTE3 = FIELD(PHRASEARR," ",1) END IF ANOMFIC # "SAVEDLISTS" THEN ITLIS3 = "$":LISTE3:"$" OPEN ANOMFIC TO FARR ELSE NOMSG = 1 ; MSGC = ANOMFIC ; GOSUB 9999 END ELSE ITLIS3 = LISTE3 END *---------------------------------------------------------------------------- * Appel de MERGE-LIST de UNIDATA --> se mettre en type UNIDATA * EXECUTE "GET.LIST ":ITLIS1:" TO 1" EXECUTE "GET.LIST ":ITLIS2:" TO 2" EXECUTE "MERGE.LIST 1 UNION 2 TO 3" EXECUTE "SAVE.LIST ":ITLIS3:" FROM 3" *---------------------------------------------------------------------------- * Suppression des lignes a vides dans SAVEDLISTS * READU WARR FROM FLIS,ITLIS3:"000" ELSE WARR = "" IFIN = DCOUNT(WARR,@AM) I = 1 10 IF I > IFIN THEN GO 20 IF WARR<I> = "" THEN WARR = DELETE(WARR,I) ; IFIN = IFIN - 1 END ELSE I = I + 1 END GO 10 20 WRITE WARR ON FLIS,ITLIS3:"000" *---------------------------------------------------------------------------- * Si le fichier resultat # SAVEDLIST, mise a jour de la liste resultat * IF ANOMFIC # "SAVEDLISTS" THEN READU WARR FROM FLIS,ITLIS3:"000" ELSE WARR = "" READU EXIST FROM FARR,LISTE3 ELSE NULL IF WARR = "" THEN DELETE FARR,LISTE3 END ELSE WRITE WARR ON FARR,LISTE3 END DELETE FLIS,ITLIS3:"000" END ELSE READU WARR FROM FLIS,ITLIS3:"000" ELSE WARR = "" IF WARR = "" THEN DELETE FLIS,ITLIS3:"000" END ELSE RELEASE FLIS,ITLIS3:"000" END END *---------------------------------------------------------------------------- * Si le fichier de depart # SAVEDLIST, mise a jour de SAVEDLISTS * IF DNOMFIC # "SAVEDLISTS" THEN READU EXIST FROM FLIS,ITLIS1:"000" ELSE NULL DELETE FLIS,ITLIS1:"000" READU EXIST FROM FLIS,ITLIS2:"000" ELSE NULL DELETE FLIS,ITLIS2:"000" END *---------------------------------------------------------------------------- 99 STOP *---------------------------------------------------------------------------- 9999 PRINT PRINT "[ ":NOMSG:" ] ":LMSG<NOMSG,2>:MSGC PRINT IF LMSG<NOMSG,1> = 0 THEN ABORT ELSE RETURN
SUBROUTINE SLIMPRIMANTE(SLFIL) *========================================================================== *= Programme : SLIMPRIMANTE *= Version 1.1 *= Date de mise à jour : 96/04/25 *= Date de génération : 01/02/14 *=========================================================================== *= L'instruction suivante permet de connaître le numéro de version du *= programme compilé sous unix par la commande : what _[[NomProgramme]] *= [[NumeroDeVersionDuProgramme]] = "@(#)[SLIMPRIMANTE 1.1 96/04/25]" *= *=========================================================================== *---------------------------------------------------------------------------- *-- PORTAGE *-- UDT : Assignation des imprimantes dans un programme *-- Creation : 17:02:10 16 Jan 1995 par ERG *-- Version : 1.0 *-- Date de MAJ : 22 mai 1995 *-- MAJ : ajout de la mise a jour du fichier [[SO_HOLD_]] *-- Compile : *---------------------------------------------------------------------------- * SLFIL : liste des files a initialiser en MA hormis la 19 *---------------------------------------------------------------------------- PROMPT "" LTAMPON = @DATA IFIN = DCOUNT(SLFIL,@AM) * Recherche si entree verrouillee ou non THOLD = 0 FOR I = 1 TO IFIN IF SLFIL<I> # 0 THEN THOLD = 1 ; GO 10 NEXT I 10 NULL *---------------------------------------------------------------------------- * Modif du 22 mai 1995 SOHOLD = 1 OPEN "DICT _HOLD_" TO FDHOLD ELSE SOHOLD = 0 OPEN "[[SO_HOLD_]]" TO FSOHOLD ELSE SOHOLD = 0 **** Fin modif du 22 mai 1995 *---------------------------------------------------------------------------- * Selection de l'imprimante si pas verrouillee IF NOT(THOLD) THEN XDEST = ",DEST imp1" ELSE XDEST = "" * Assignation des lignes CPT = 0 FOR I = 1 TO IFIN XNOF = I - 1 ; MSF = SLFIL<I> * Recherche si verrouillee ou non IF THOLD THEN XHOLD = 3 ELSE XHOLD = 1 * Recherche si BANNER UNIQUE avec message IF MSF # 0 THEN XBANNER = " ":MSF ELSE XBANNER = "" * Preparation de la phrase PHRASE = 'SETPTR ':XNOF:',,,,,':XHOLD:',BANNER UNIQUE':XBANNER PHRASE = PHRASE:',NOHEAD':XDEST:',BRIEF' * Envoi de l'initialisation EXECUTE PHRASE **** Modif du 22 mai 1995 IF SOHOLD = 1 AND XHOLD = 3 THEN READV NUM FROM FDHOLD,"NEXT.HOLD",1 ELSE NUM = 1 NUM = NUM - 1 IF XBANNER = "" THEN ITSOHOLD = "P_0000" ELSE ITSOHOLD = XBANNER[2,40] ITSOHOLD = ITSOHOLD:"_":NUM "R%4" WSOHOLD = @DATE:@AM:@TIME:@AM:@LOGNAME:@AM:"N" READU EXIST FROM FSOHOLD,ITSOHOLD ELSE NULL WRITE WSOHOLD ON FSOHOLD,ITSOHOLD END **** Fin modif du 22 mai 1995 NEXT I * Assignation de la file 19 EXECUTE 'SETPTR 19,,,,,3,BANNER UNIQUE 19,NOHEAD,BRIEF' **** Modif du 22 mai 1995 IF SOHOLD = 1 THEN READV NUM FROM FDHOLD,"NEXT.HOLD",1 ELSE NUM = 1 NUM = NUM - 1 ITSOHOLD = "19_":NUM "R%4" WSOHOLD = @DATE:@AM:@TIME:@AM:@LOGNAME:@AM:"N" READU EXIST FROM FSOHOLD,ITSOHOLD ELSE NULL WRITE WSOHOLD ON FSOHOLD,ITSOHOLD END **** Fin modif du 22 mai 1995 * Remise en forme des tampons NBTAMPON = DCOUNT(LTAMPON,CHAR(13)) - 1 FOR I = 1 TO NBTAMPON DATA FIELD(LTAMPON,CHAR(13),I) NEXT I * RETURN