IFS

34. IFSの存在検査をするCHKIFS

以前に「25.RPGでストリーム・ファイルの存在を簡単にチェックするには?」というのを
紹介したが実際に製品内部で使われているCHKIFSというコマンドを
紹介する。
_

[コマンド: CHKIFS ]

ソースはこちらから

0001.00              CMD        PROMPT('IFS 検査 ')                        
0002.00              PARM       KWD(DIR) TYPE(*CHAR) LEN(256) CASE(*MIXED) 
0003.00                           PROMPT(' 登録簿 (/)')        


             

[コンパイル]

CRTCMD OBJLIB/CHKIFS PGM(OBJLIB/CHKIFSCL) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)

[ CLP : CHIFSCL ]

ソースはこちらから

0001.00              PGM        PARM(&DIR)                                        
0002.00 /*----------------------------------------------------------------*/      
0003.00 /*   CHKIFS  :  IFS ストリーム・ファイルの存在検査                */      
0004.00 /*                                                                */      
0005.00 /*   SRCTYPE : CLLE                                               */      
0006.00 /*                                                                */      
0007.00 /*   CRTCLMOD  QTEMP/CHKIFSCL SRCFILE(MYSRCLIB/QCLSRC)            */      
0008.00 /*             AUT(*ALL)                                          */      
0009.00 /*   CRTPGM    MYLIB/CHKIFSCL MODULE(QTEMP/CHKIFSCL)              */      
0010.00 /*             BNDSRVPGM(QSYS/QP0LLIB1) ACTGRP(*NEW)              */      
0011.00 /*             AUT(*ALL)                                          */      
0012.00 /*----------------------------------------------------------------*/      
0013.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                    
0014.00              DCL        VAR(&DIR) TYPE(*CHAR) LEN(256)                    
0015.00              DCL        VAR(&PATH) TYPE(*CHAR) LEN(256)                   
0016.00              DCL        VAR(&PATH_PTR) TYPE(*PTR) ADDRESS(&PATH 0)        
0017.00              DCL        VAR(&RES) TYPE(*INT) LEN(4)                       
0018.00              DCL        VAR(&RES_PTR) TYPE(*PTR) ADDRESS(&RES 0)          
0019.00              DCL        VAR(&TRUE) TYPE(*INT) VALUE(0)                    
0020.00              DCL        VAR(&FALSE) TYPE(*INT) VALUE(-1)                  
0021.00              DCL        VAR(&O_RDONLY) TYPE(*INT) LEN(4) VALUE(1)         
0022.00              DCL        VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')        
0023.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                     
0024.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))    
0025.00                                                                    
0026.00              RTVJOBA    TYPE(&TYPE)                                
0027.00              CHGVAR     VAR(&PATH) VALUE(&DIR *TCAT &NULL)         
0028.00              CALLPRC    PRC('open') PARM((&PATH_PTR *BYVAL) +      
0029.00                           (&O_RDONLY *BYVAL) (*OMIT)) RTNVAL(&RES) 
0030.00              IF         COND(&RES *EQ &FALSE) THEN(DO)             
0031.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) +             
0032.00                           MSGDTA(' ファイル ' *CAT &DIR *TCAT +    
0033.00                           ' が見つかりません。 ') MSGTYPE(*ESCAPE) 
0034.00              ENDDO                                                 
0035.00              RETURN                                                
0036.00                                                                    
0037.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)          
0038.00  SNDMSG:                                                           
0039.00              IF         COND(&TYPE *EQ '0') THEN(DO)               
0040.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)   
0041.00              ENDDO                                                 
0042.00              ELSE       CMD(DO)                                    
0043.00              SNDPGMMSG  MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)   
0044.00              ENDDO                                                 
0045.00              ENDPGM  


                                               

[ソース・タイプ]

このCLPはOPMのCLPではなくILE-CLPであるのでソース・タイプはCLPではなく CLLE にしておくこと。

[コンパイル]

CRTCLMOD MODULE(QTEMP/CHKIFSCL) SRCFILE(R610SRC/QCLSRC) AUT(*ALL) DBGVIEW(*SOURCE)
CRTPGM PGM(OBJLIB/CHKIFSCL) MODULE(QTEMP/CHKIFSCL) BNDSRVPGM((QSYS/QP0LLIB1)) ACTGRP(*NEW) AUT(*ALL)

[解説]

CHKIFSは検査するIFSストリー・ファイルが存在していなければCPF9800をエラー・メッセージとして
呼出し元に戻す。
従って呼出し元では MONMSG CPF9800 で監視していれば存在を確かめることができる。

またCHKIFSCLはC言語の関数: open を使ってエラーを検査しているので
openというC言語関数をEXPORTしているサービス・プログラム : QSYS/QP0LLIB1 をバインドして
コンパイルする必要がある。
_