RPG

375. 公開API とシステム・プログラムとのちがい

IBM i には API(=Application Programming Interface)と呼ばれるプログラム(*PGM)が
公開されていてユーザーでも使用することができる。
APIはシステム・ライブラリー(QSYS)に保管されているプログラムである。
APIは旧リリースでも存在しているプログラムであり公開されていなくても
使用できる場合もある。
このため新しいリリースのマニュアルで公開されたAPIは旧リリースでも
使用可能な場合がある。

それではユーザーでも勝手にQSYSのプログラムをCALLで呼び出して使用すれば
立派なAPIとして使えるではないかという疑問がある。
例えば WRKOUTQコマンドを実行しているプログラムは
DSPCMD で調べると

                              コマンド情報の表示                             
                                                                             
 コマンド . . . . . . . :   WRKOUTQ       ライブラリー . . . . . :   QSYS    
                                                                             
 コマンドを処理するプログラム . . . . . :   QSPDSPQ                          
   ライブラリー . . . . . . . . . . . . :     QSYS                           
   プログラムを呼び出すために使用される                                      
     状態 . . . . . . . . . . . . . . . :     *SYSTEM                        
 ソース・ファイル . . . . . . . . . . . :   S000014846                       
   ライブラリー . . . . . . . . . . . . :     QTEMP                          
 ソース・ファイル・メンバー . . . . . . :   WRKOUTQ                          
 妥当性検査プログラム . . . . . . . . . :   *NONE                            
 有効なモード . . . . . . . . . . . . . :   *PROD                            
                                            *DEBUG                           
                                            *SERVICE                         
 実行可能な環境 . . . . . . . . . . . . :   *IMOD      *BMOD      *IREXX     
                                            *BREXX     *BPGM      *IPGM      
                                            *EXEC      *INTERACT  *BATCH     
                                                                             
                                                                       続く ...
 続行するには,実行キーを押してください。                                    
                                                                             
 F3= 終了   F12= 取り消し                                                    
 (C) COPYRIGHT IBM CORP. 1980, 2007.                                         

WRKOUTQが呼び出しているプログラムは QSYS/QSPDSPQ であることがわかる。
それでは自分で独自のWRKOUTQと良く似たコマンドを作成して実行を
プログラム : QSYS/QSPDSPQ にやらせることができるかというとそれはできない。

保護違反となってユーザーがQSYSのプログラムを実行することは許されない。

この仕組みは DSPOBJD QSYS/QSPDSPQ *PGM を見てみると

                        オブジェクト記述の表示-明細                          
                                                           ライブラリー 1 の 1
オブジェクト . . . . :   QSPDSPQ         属性 . . . . . . . . :               
  ライブラリー . . . :     QSYS          所有者 . . . . . . . :   QSPL        
 ライブラリー ASP 装置  . :   *SYSBAS          ライブラリー ASP グループ  :   *SYSBAS     
タイプ . . . . . . . :   *PGM            1 次グループ . . . . :   *NONE       
                                                                              
ユーザー定義の情報 :                                                          
  属性 . . . . . . . . . . . . . . . . :                                      
  テキスト . . . . . . . . . . . . . . :                                      
                                                                              
作成情報 :                                                                    
  作成日/時刻 . . . . . . . . . . . . :   08/12/19  11:24:17                 
  作成ユーザー . . . . . . . . . . . . :   *IBM                               
  作成システム . . . . . . . . . . . . :   00000000                           
  オブジェクト定義域 . . . . . . . . . :   *SYSTEM                            
                                                                              
                                                                              
                                                                              
                                                                      続く ...
続行するには,実行キーを押してください。                                      
                                                                              
F3= 終了   F12= 取り消し                                                      

のようになっていて

 オブジェクト定義域なるものが *SYSTEM となっている。

一方、API として公開されている例えばAPI: QUSLOBJD を DSPOBJD *PGM で見てみると

                        オブジェクト記述の表示-明細                          
                                                           ライブラリー 1 の 1
オブジェクト . . . . :   QUSROBJD        属性 . . . . . . . . :               
  ライブラリー . . . :     QSYS          所有者 . . . . . . . :   QSYS        
 ライブラリー ASP 装置  . :   *SYSBAS          ライブラリー ASP グループ  :   *SYSBAS     
タイプ . . . . . . . :   *PGM            1 次グループ . . . . :   *NONE       
                                                                              
ユーザー定義の情報 :                                                          
  属性 . . . . . . . . . . . . . . . . :                                      
  テキスト . . . . . . . . . . . . . . :                                      
                                                                              
作成情報 :                                                                    
  作成日/時刻 . . . . . . . . . . . . :   07/09/30  14:35:39                 
  作成ユーザー . . . . . . . . . . . . :   *IBM                               
  作成システム . . . . . . . . . . . . :   00000000                           
  オブジェクト定義域 . . . . . . . . . :   *USER                              
                                                                              
                                                                              
                                                                              
                                                                      続く ...
続行するには,実行キーを押してください。                                      
                                                                              
F3= 終了   F12= 取り消し                                                      
(C) COPYRIGHT IBM CORP. 1980, 2007.                                           

のようになっていて
 
オブジェクト定義域 は *USER と表示されている。

一般に私達ユーザーがコンパイルして作成するプログラムやファイルのオブジェクト定義域はすべて *USER である。
しかしユーザーが作成するコマンドとパネル・グループのオブジェクト定義域は *SYSTEM となる。
コンパイラーでこれらのオブジェクト定義域を指定することはできない。

 

・ユーザーがオブジェクト定義域が *SYSTEM となっているプログラムを呼出して実行することはできない。

    ...これがAPIと通常のシステム・プログラムとの違いである。
       APIは *USER であるのでユーザーでも呼び出して使用することができるが
       *SYSTEM であるシステム・プログラムを呼び出すことはできない。

・機密保護レベル(QSECURITY)が40以上では*SYSTEMであるオブジェクトを直接読むことはできない。

(しかしダンプ・リストは可能である)

[結論]

システム・プログラムはオブジェクト定義域が *SYSTEMであるのでユーザーが勝手に呼び出して使用することはできないが
API は *USER であるのでユーザーが呼び出すことができる。