Tools

63. ライブラリー QRPLOBJ の掃除

ライブラリー : QRPLOBJ とはプログラムを再コンパイルして上書きで置換えたり
RSTLIB や RSTOBJ でオブジェクトを上書きした場合に上書きされた元の
オブジェクトをシステム ( i5/OS ) が BACKUP して保管してくれるライブラリーである。
このライブラリーは IPL のときにクリーン・アップされる。
もし 24時間 365日 IPL を行わないで IBM i を点けっぱなしの状態であると
QRPLOBJ には古いオブジェクトが山のように溜まりっぱなしとなる。

DSPLIB QRPLOBJ + [実行]

で御社のライブラリー : QRPLOBJ を覗いてみればよい。
数千個のオブジェクトが存在しているとなると、HDD占有デスクを圧迫して
IBM i のパフォーマンスを低下させていることになる。
そこで STRPDM などで QRPLOBJ 内部の不要なオブジェクトを削除することに
なるが元より数千個のオブジェクトがあるわけであるから
手作業での削除では莫大な労力が必要となる。

そこでここに紹介するのが QRPLOBJ をクリヤーしてくれるコマンド:

CLRRPLOBJ : QRPLOBJ のクリヤー

である。
CLRRPLOBJ は、QRPLOBJ 内部のすべてのオブジェクトをクリヤーするわけではなく
必要なオブジェクトは削除しない。
(これはソースを見て解析して御社の事情に合うように修正してほしい)

【 コマンド: CLRRPLOBJ 】
0001.00              CMD        PROMPT('QRPLOBJ のクリヤー ')              
0002.00              PARM       KWD(CLEAR) TYPE(*CHAR) LEN(4) RSTD(*YES) + 
0003.00                           DFT(*NO) VALUES(*NO *YES) +              
0004.00                           PROMPT('QRPLOBJ のクリヤー ')            
【 解説 】
[ コンパイル ]
CRTCMD CMD(QGPL/CLRRPLOBJ) PGM(QGPL/CLRRPLOBJC) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)

CLRRPLOBJ + F4キーで実行すると

のようにして省略値は *NO であり、うかつには実行されないようになっている。
実行のときは *YES にして実行する必要がある。

【 CLP: CLRRPLOBJC 】
0001.00              PGM        PARM(&CLEAR)                                    
0002.00 /*-------------------------------------------------------------------*/ 
0003.00 /*   CLRRPLOBJC : QRPLOBJ のクリヤー                                 */ 
0004.00 /*                                                                   */ 
0005.00 /*   2018/06/30  作成                                                */ 
0006.00 /*-------------------------------------------------------------------*/ 
0007.00              DCL        VAR(&CLEAR) TYPE(*CHAR) LEN(4)                  
0008.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                  
0009.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                  
0010.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                  
0011.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)               
0012.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)               
0013.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                   
0014.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                
0015.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +             
0016.00                           VALUE('*ESCAPE   ')                           
0017.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +             
0018.00                           VALUE(X'000074') /* 2 進数  */                
0019.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                
0020.00                           VALUE(X'00000000')                            
0021.00              /*( QUSRTVUS 用の変数 )*/                                  
0022.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +               
0023.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +     
0024.00                           125 */                                        
0025.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +               
0026.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */ 
0027.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +              
0028.00                           VALUE(X'0000000000000000')                    
0029.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +            
0030.00                           2 進数 dハl q */                               
0031.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +            
0032.00                           2 進数項目数  */                              
0033.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +            
0034.00                           2 進数リストサイズ  */                        
0035.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */      
0036.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */     
0037.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */      
0038.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */ 
0039.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(256) /* +          
0040.00                            受取データ  */                               
0041.00              DCL        VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')      
0042.00              /*( 項目の変数 )*/                                         
0043.00              DCL        VAR(&OBJ) TYPE(*CHAR) LEN(10)                   
0044.00              DCL        VAR(&OBJTYPE) TYPE(*CHAR) LEN(10)               
0045.00              DCL        VAR(&OBJATTR) TYPE(*CHAR) LEN(10)               
0046.00              DCL        VAR(&STSMSG) TYPE(*CHAR) LEN(128)               
0047.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0048.00                                                                         
0049.00 /*( 環境の取得 )*/                                                      
0050.00              RTVJOBA    TYPE(&TYPE)                                     
0051.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */     
0052.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')                
0053.00              ENDDO      /*  バッチ  */                                  
0054.00              ELSE       CMD(DO) /*  対話式  */                          
0055.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')                
0056.00              ENDDO      /*  対話式  */                                  
0057.00                                                                         
0058.00 /*( パラメータの取得 )*/                                                
0059.00              IF         COND(&CLEAR *EQ '*NO ') THEN(DO)                
0060.00              RETURN                                                     
0061.00              ENDDO                                                      
0062.00                                                                         
0063.00 /*( ユーザー・スペースの作成 )*/                                        
0064.00              CALL       PGM(QUSCRTUS) PARM('QUSLOBJ   QTEMP     ' +     
0065.00                           'PF        ' 32767 ' ' '*ALL      ' +         
0066.00                           'QUSLOBJ 用ユーザー空間 ' '*YES      ' +      
0067.00                           &APIERR)                                      
0068.00              MONMSG     CPF9870                                         
0069.00              CALL       PGM(QUSLOBJ) PARM('QUSLOBJ   QTEMP     ' +      
0070.00                           'OBJL0100' '*ALL      QRPLOBJ   ' +           
0071.00                           '*ALL      ' &APIERR)                         
0072.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO)     
0073.00              SNDPGMMSG  +                                               
0074.00                           MSG('API: QUSLOBJ の実行で次のエラーが発生 +  
0075.00                            しました。 ') MSGTYPE(*DIAG)                 
0076.00              GOTO       APIERR                                          
0077.00              ENDDO                                                      
0078.00 /*( リストAPIで作成されたユーザー空間の検索 )*/                      
0079.00              CHGVAR     VAR(&STSMSG) +                                  
0080.00                           VALUE('QRPLOBJ をクリヤー中です。 ')          
0081.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STSMSG) +  
0082.00                           TOPGMQ(*EXT) MSGTYPE(*STATUS)                 
0083.00      /*( リストデータセクションのオフセットを検索 )*/                   
0084.00              CALL       PGM(QUSRTVUS) PARM('QUSLOBJ   QTEMP     ' +     
0085.00                           &STRPOS &LENDTA &RCVVAR)                      
0086.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))           
0087.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))           
0088.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))          
0089.00                                                                         
0090.00          /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/               
0091.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET)                     
0092.00              CHGVAR     VAR(&DEC08) VALUE(%BIN(&STRPOS))                
0093.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + 1)                   
0094.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                
0095.00              CHGVAR     VAR(&LENDTA) VALUE(&LSTSIZ)                     
0096.00              CHGVAR     VAR(&ADDLEN) VALUE(%BIN(&LENDTA))               
0097.00              CHGVAR     VAR(&NOENT) VALUE(%BIN(&NOENTR))                
0098.00 NXTRTV:                                                                 
0099.00              CALL       PGM(QUSRTVUS) PARM('QUSLOBJ   QTEMP     ' +     
0100.00                           &STRPOS &LENDTA &RCVDTA)                      
0101.00              /*( 処理の開始 )*/                                         
0102.00              CHGVAR     VAR(&OBJ) VALUE(%SST(&RCVDTA 1 10))             
0103.00              CHGVAR     VAR(&OBJTYPE) VALUE(%SST(&RCVDTA 21 10))        
0104.00              IF         COND(&OBJ *EQ 'AURORA_EGN') THEN(GOTO +         
0105.00                           CMDLBL(PASS))                               
0106.00              IF         COND(&OBJ *EQ 'AUTORA_EGN') THEN(GOTO +       
0107.00                           CMDLBL(PASS))                               
0108.00              IF         COND(&OBJ *EQ 'AURORA_ACC') THEN(GOTO +       
0109.00                           CMDLBL(PASS))                               
0110.00              IF         COND(&OBJ *EQ 'AURORA_ERR') THEN(GOTO +       
0111.00                           CMDLBL(PASS))                               
0112.00              IF         COND(&OBJ *EQ 'RECYCLED  ') THEN(GOTO +       
0113.00                           CMDLBL(PASS))                               
0114.00              /*( *PGM )*/                                             
0115.00              IF         COND(&OBJTYPE *EQ '*PGM      ') THEN(DO)      
0116.00              DLTPGM     PGM(QRPLOBJ/&OBJ)                             
0117.00              ENDDO                                                    
0118.00              /*( *SRVPGM )*/                                          
0119.00              IF         COND(&OBJTYPE *EQ '*SRVPGM   ') THEN(DO)      
0120.00              DLTSRVPGM  SRVPGM(QRPLOBJ/&OBJ)                          
0121.00              ENDDO                                                    
0122.00              /*( *MODULE )*/                                          
0123.00              IF         COND(&OBJTYPE *EQ '*MODULE   ') THEN(DO)      
0124.00              DLTMOD     MODULE(QRPLOBJ/&OBJ)                          
0125.00              ENDDO                                                    
0126.00              /*( *USRQ )*/                                              
0127.00              IF         COND(&OBJTYPE *EQ '*USRQ     ') THEN(DO)        
0128.00              DLTUSRQ    USRQ(QRPLOBJ/&OBJ)                              
0129.00              ENDDO                                                      
0130.00              /*( *FILE )*/                                              
0131.00              IF         COND(&OBJTYPE *EQ '*FILE     ') THEN(DO)        
0132.00              DLTF       FILE(QRPLOBJ/&OBJ)                              
0133.00              ENDDO                                                      
0134.00              /*( *CMD )*/                                               
0135.00              IF         COND(&OBJTYPE *EQ '*CMD      ') THEN(DO)        
0136.00              DLTCMD     CMD(QRPLOBJ/&OBJ)                               
0137.00              ENDDO                                                      
0138.00              /*( *MENU )*/                                              
0139.00              IF         COND(&OBJTYPE *EQ '*MENU     ') THEN(DO)        
0140.00              DLTMNU     MENU(QRPLOBJ/&OBJ)                              
0141.00              ENDDO                                                      
0142.00              /*( *USRSPC )*/                                            
0143.00              IF         COND(&OBJTYPE *EQ '*USRSPC   ') THEN(DO)        
0144.00              DLTUSRSPC  USRSPC(QRPLOBJ/&OBJ)                            
0145.00              ENDDO                                                      
0146.00              /*( 処理の終了 )*/                                         
0126.00              /*( *USRQ )*/                                              
0127.00              IF         COND(&OBJTYPE *EQ '*USRQ     ') THEN(DO)        
0128.00              DLTUSRQ    USRQ(QRPLOBJ/&OBJ)                              
0129.00              ENDDO                                                      
0130.00              /*( *FILE )*/                                              
0131.00              IF         COND(&OBJTYPE *EQ '*FILE     ') THEN(DO)        
0132.00              DLTF       FILE(QRPLOBJ/&OBJ)                              
0133.00              ENDDO                                                      
0134.00              /*( *CMD )*/                                               
0135.00              IF         COND(&OBJTYPE *EQ '*CMD      ') THEN(DO)        
0136.00              DLTCMD     CMD(QRPLOBJ/&OBJ)                               
0137.00              ENDDO                                                      
0138.00              /*( *MENU )*/                                              
0139.00              IF         COND(&OBJTYPE *EQ '*MENU     ') THEN(DO)        
0140.00              DLTMNU     MENU(QRPLOBJ/&OBJ)                              
0141.00              ENDDO                                                      
0142.00              /*( *USRSPC )*/                                            
0143.00              IF         COND(&OBJTYPE *EQ '*USRSPC   ') THEN(DO)        
0144.00              DLTUSRSPC  USRSPC(QRPLOBJ/&OBJ)                            
0145.00              ENDDO                                                      
0146.00              /*( 処理の終了 )*/                                         
0147.00  PASS:       IF         COND(&N < &NOENT) THEN(DO)                      
0148.00              CHGVAR     VAR(&N) VALUE(&N + 1)                           
0149.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))               
0150.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)             
0151.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)                
0152.00              GOTO       NXTRTV                                          
0153.00              ENDDO                                                      
0154.00              SNDPGMMSG  MSG('QRPLOBJ のクリヤーが完了しました。 ') +    
0155.00                           MSGTYPE(*DIAG)                                
0156.00              RETURN                                                     
0157.00                                                                         
0158.00  APIERR:                                                                
0159.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))            
0160.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))        
0161.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                  
0162.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')               
0163.00              GOTO       SNDMSG                                          
0164.00                                                                         
0165.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +             
0166.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +   
0167.00                           MSGFLIB(&MSGFLIB)                             
0168.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)              
0169.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0170.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)        
0171.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                
0172.00              ENDDO                                                 
0173.00              ELSE       CMD(DO)                                    
0174.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +       
0175.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +        
0176.00                           MSGTYPE(&MSGTYPE)                        
0177.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                
0178.00              ENDDO                                                 
0179.00              ENDPGM                                                
【 解説 】
[ コンパイル ]
CRTCLPGM PGM(QGPL/CLRRPLOBJC) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
0104.00              IF         COND(&OBJ *EQ 'AURORA_EGN') THEN(GOTO +         
0105.00                           CMDLBL(PASS)) 

のように削除したくないオブジェクトがあればオミットしておく。