テーブルのインデックス使用情報の取得 (RPG で API を使用して)

テーブルについているインデックスのリストと評価 (V5R2/V5R3 以降)」で紹介した、iSeries ナビゲーターを利用した、テーブルに付属するインデックスとその使用頻度の表示を、System API を使用してできないか、ということで、ちょっとしたテストプログラムを書いてみました。

QUSRMBRD という System API の MBRD0400 というフォーマットを使用します。

と、いってもですね、なんか参考になるコーディング例はないか探していたら、System i Network の中の「How to Call an API Without Worrying About the 64 KB Limit」という記事にあった例が大変すばらしく、とても感銘を受けたので骨格をほぼそのまま使用しています。(I really impressed! Thank you, Scott!!)
解説は上記の記事を参照してください。

ちょっとだけの注意点ですが、インデックス名を格納するために IdxName という名前の変数を定義してありますが、DSPLY 命令の表示可能領域にあわせた 30 桁に切り詰めています。
合成元の情報 (IdxInfo というデータ構造のライブラリー名/ファイル名/メンバー名) のサイズを考えると、本当はもっと大きくないといけないわけですね。

     H DFTACTGRP(*NO)                                                                               
                                                                                                    
     D RtvIdxInf       PR                                                          
     D   File                        10A   const                                                    
     D   Library                     10A   const                                                    
     D   Member                      10A   const                                                    
     D RtvIdxInf       PI                                                                           
     D   pFile                       10A   const                                                    
     D   pLibrary                    10A   const                                                    
     D   pMember                     10A   const                                                    
                                                                                                    
     D GetIdxInfo      PR                  ExtPgm('QUSRMBRD')                                       
     D   RcvVar                   65535A   options(*varsize)                                        
     D   RcvVarLen                   10I 0 const                                                    
     D   Format                       8A   const                                                    
     D   QualFile                    20A   const                                                    
     D   Member                      10A   const                                                    
     D   Ovrd                         1A   const                                                    
     D   ErrorCode                32767A   options(*varsize:*nopass)                                
     D   FindMbr                      1A   const options(*nopass)                                   
                                                                                                    
     D ErrorCode       ds                  qualified                                                
     D   BytesProv                   10I 0 inz(%size(ErrorCode))                                    
     D   BytesAvail                  10I 0 inz(0)                                                   
     D   MsgID                        7A                                                            
     D                                1A                                                            
     D   MsgDta                    1024A                                                            
                                                                                                    
     D MBRD0400        ds                  qualified                                                
     D                                     based(p_RcvVar)                                          
     D   BytesRtn                    10I 0                                                          
     D   BytesAvail                  10I 0                                                          
     D   Count                       10I 0                                                          
     D   Offset                      10I 0                                                          
                                                                                                    
     D IdxInfo         DS                  Based(p_IdxInfo)                                         
     D                                     qualified                                                
     D   Liblen                       5i 0                                                          
     D   Library                    258a                                                            
     D   Filelen                      5i 0                                                          
     D   File                       258a                                                            
     D   Memberlen                    5i 0                                                          
     D   Member                     258a                                                            
     D   CstType                     11a                                                            
     D                                9a                                                            
     D   isValid                      1a                                                            
     D   isHeld                       1a                                                            
     D                                6a                                                            
     D   CrtDate                     14a                                                            
     D   RBldDate                    14a                                                            
     D   LastQryUse                  14a                                                            
     D   LastStatUse                 14a                                                            
     D   UseCount                    20i 0                                                          
     D   StatUseCount                20i 0                                                          
     D   Sta2UseCount                20i 0                                                          
     D   Keys                        20i 0                                                          
     D   Size                        20i 0                                                          
     D   Key1Unq                     20i 0                                                          
     D   Key2Unq                     20i 0                                                          
     D   Key3Unq                     20i 0                                                          
     D   Key4Unq                     20i 0                                                          
     D   EstRBldSec                  10i 0                                                          
     D   DlydKeys                    10i 0                                                          
     D   OvFlCount                   10i 0                                                          
     D   CodeSize                    10i 0                                                          
     D   LFRdReqs                    20i 0                                                          
     D   PFRdReqs                    20i 0                                                          
     D   DaysUsed                    10i 0                                                          
     D   LastUsedDate                14a                                                            
     D   ResetDate                    8a                                                            
     D                               30a                                                            
     D   Sparse                       1a                                                            
     D   DrvdKey                      1a                                                            
     D   Partitioned                  1a                                                            
     D   Maint                        1A                                                            
     D   Recovery                     1a                                                            
     D   Type                         1a                                                            
     D   Unique                       1a                                                            
     D   SRTSeq                       1a                                                            
     D   SRTLib                      10a                                                            
     D   SRTTbl                      10a                                                            
     D   SRTLang                      3a                                                            
     D   SRTWeight                    1a                                                            
     D   PageSize                    10i 0                                                          
     D   KeyLen                      10i 0                                                          
     D   KeyCount                    10i 0                                                          
     D                               82a                                                            
     D   KeyLst                    1024a   Varying                                                  
                                                                                                    
     D varSize         S             10I 0                                                          
     D I               S             10I 0                                                          
     D IdxName         S             30a                                                            
     D*IdxName         S            774a                                                            
                                                                                                    
      /free                                                                                         
                                                                                                    
          *inlr = *on;                                                                              
                                                                                                    
          dou ( varSize >= MBRD0400.BytesAvail );                                                   
                                                                                                    
             if (p_RcvVar = *NULL);                                                                 
                varSize = %size(MBRD0400);                                                          
             else;                                                                                  
                varSize = MBRD0400.BytesAvail;                                                      
                dealloc p_RcvVar;                                                                   
             endif;                                                                                 
                                                                                                    
             p_RcvVar = %alloc(varSize);                                                            
                                                                                                    
             GetIdxInfo( MBRD0400                                                                   
                      : varSize                                                                     
                      : 'MBRD0400'                                                                  
                      : pFile + pLibrary                                                            
                      : pMember                                                                     
                      : *ON                                                                         
                      : ErrorCode );                                                                
                                                                                                    
             if (ErrorCode.BytesAvail > 0);                                                         
                return;                                                                             
             endif;                                                                                 
          enddo;                                                                                    
                                                                                                    
          for i = 1 to MBRD0400.Count;                                                              
              p_IdxInfo = p_RcvVar + MBRD0400.Offset +                                              
                        (i-1) * %size(IdxInfo);                                                     
                                                                                                    
              IdxName = %trimR(%subst(idxInfo.Library:1:idxInfo.Liblen)) +                          
                  '/' + %trimR(%subst(idxInfo.FIle:1:idxInfo.Filelen)) ;                            
              dsply (%trimR(IdxName) + 'の情報です:');                                                   
              dsply ('Date last used:' + idxInfo.LastUsedDate);                                     
              dsply ('Days used count:' + %char(idxInfo.DaysUsed));                                 
              dsply ('Query use count:' + %char(idxInfo.UseCount));                                 
              dsply ('Query stats use count:' +                                                     
                                              %char(idxInfo.StatUseCount));                         
              dsply ('Query stats second use count:' +                                              
                                              %char(idxInfo.Sta2UseCount));                         
              dsply ('Last query use:' + idxInfo.LastQryUse);                                       
              dsply ('Last query stats use:' + idxInfo.LastStatUse);                                
                                                                                                    
          endfor;                                                                                   
                                                                                                    
          dealloc p_RcvVar;                                                                         
          return;                                                                                   
                                                                                                    
      /end-free

実行例はこんなかんじです。

別のテーブルでの実行例です。

[Top Pageに戻る]

Ads by TOK2