C/400

91. API: QUSROBJD : オブジェクトの属性の検索

QUSROBJD は API の中でもかなり使用頻度が高い API であり、C/400 開発者が最初に使う API かも
知れないと思うほどポピュラーな API である。
QUSROBJD は DSPOBJD コマンドとほぼ同じ情報を提供する。
もちろん API であるので DSPOBJD より詳しい情報を高速で得ることができる。
今回のサンプルはライブラリー SPOOLWTR の最終変更日と時刻を QUSROBJD によって
取得するというものである。

オブジェクト記述の検索(QUSROBJD)API

パラメータ

必須パラメータ・グループ:

1.レシーバー変数出力Char(*)
2.レシーバー変数長入力Binary(4)
3.形式名入力Binary(4)
4.オブジェクト修飾名入力Char(10)の配列(*)
5.オブジェクト・タイプ入出力Char(*)

任意選択パラメータ:

6.エラー・コード入出力Char(*)

【解説】

レシーバー変数 と レシーバー変数長 は形式名によって異なる。

形式名 は、

OBJD0100 形式・・・・・・基本情報(最高速)
OBJD0200 形式・・・・・・PDM によって表示される情報に良く似た情報
OBJD0300 形式・・・・・・保守情報
OBJD0400 形式・・・・・・全情報(最低速)
レシーバー変数の構造

[参照メンバー] QSYSINC/H(QUSROBJD)

■ OBJD0100 形式

オフセットタイプフィールド
10進数16進数
00BINARY(4)返されるバイト数
44BINARY(4)使用可能なバイト数
88CHAR(10)オブジェクト名
1812CHAR(10)オブジェクト・ライブラリー名    
281CCHAR(10)オブジェクト・タイプ
3826CHAR(10)戻りライブラリー
4830BINARY(4)補助記憶域プール
5234CHAR(10)オブジェクト所有者
623ECHAR(2)オブドェクト・ドメイン
6440CHAR(13)作成日時
7740CHAR(13)オブジェクト変更日時

■ OBJD0200 形式

オフセットタイプフィールド
10進数16進数
00OBJD0100 形式からのすべての情報
905ACHAR(10)オブジェクトの拡張属性
10064CHAR(50)テキスト記述
15096CHAR(10)ソース・ファイル名
160A0CHAR(10)ソース・ファイル・ライブラリー名
170AACHAR(10)ソース・ファイル・メンバー名

■ OBJD0300 形式

オフセットタイプフィールド
10進数16進数
00OBJD0200 形式からのすべての情報  
180B4CHAR(13)ソース・ファイルの更新日時
193C1CHAR(13)オブジェクト保管日時
206CECHAR(13)オブジェクト復元日時
219DBCHAR(10)作成者のユーザー・プロフィール
229E5CHAR(8)オブジェクトが作成されたシステム
237EDCHAR(7)リセット日付
244F4BINARY(4)保管サイズ
248F8BINARY(4)保管順序番号
252FCCHAR(10)記憶域
262106CHAR(10)保管コマンド
272110CHAR(71)保管ボリュームID
343157CHAR(10)保管装置
353161CHAR(10)保管ファイル名
36316BCHAR(10)保管ファイル・ライブラリー名
373175CHAR(17)保管ラベル
390186CHAR(9)システム・レベル
39918FCHAR(16)コンパイラー
41519FCHAR(8)オブジェクト・レベル
4231A7CHAR(1)ユーザーの変更
4241A8CHAR(16)ライセンス・プログラム
4401B8CHAR(10)プログラム一時修正(PTF)
4501C2CHAR(10)プログラム診断依頼書(APAR)

■ OBJD0400 形式

オフセットタイプフィールド
10進数16進数
00OBJD0300 形式からのすべての情報
4601CCCHAR(7)最終使用日付
4671D3CHAR(1)使用状況の更新
4681D4BINARY(4)使用日数カウント
4721D8BINARY(4)オブジェクト・サイズ
4761DCBINARY(4)オブジェクト・サイズの乗数
4801E0CHAR(1)オブジェクト圧縮状況
4811E1CHAR(1)プログラムによる変更許可<
4821E2CHAR(1)プログラムによる変更
4831E3CHAR(10)ユーザー定義属性
4931EDCHAR(1)オブジェクト ASP オーバーフロー標識  
4941EECHAR(13)SAVACT 保管日時
5071FBCHAR(10)オブジェクト監査値
517205CHAR(10)1次グループ
0001.00 #include <stdio.h>                                                               
0002.00 #include <stdlib.h>                                                              
0003.00 #include <string.h>                                                              
0004.00 #include <QUSROBJD.h>                                                            
0005.00                                                                                  
0006.00 #define TRUE         0                                                           
0007.00 #define FALSE       -1                                                           
0008.00 typedef struct {                                                                 
0009.00    int  BYTESPRO;                                                                
0010.00    int  BYTESAVL;                                                                
0011.00    char MSGID[7];                                                                
0012.00    char RESRVD;                                                                  
0013.00    char EXCPDATA[100];                                                           
0014.00 } ERRSTRUCTURE;     /* Define the error return structure            */           
0015.00 ERRSTRUCTURE  errcode;/* Error Code Structure for RCVMSG      */                 
0016.00                                                                                  
0017.00 void main(void){                                                                 
0018.00   Qus_OBJD0100_t objd0100;                                                       
0019.00   char date_time[14], year[4], DATE[11], TIME[9];                                
0020.00 typedef struct {                                                                 
0021.00   char year[5];                                                                  
0022.00   char month[3];                                                                 
0023.00   char day[3];                                                                   
0023.00   char day[3];                                                                   
0024.00 } DATE_;                                                                         
0025.00 DATE_ date;                                                                      
0026.00 typedef struct {                                                                 
0027.00   char hour[3];                                                                  
0028.00   char minute[3];                                                                
0029.00   char second[3];                                                                
0030.00 } TIME_;                                                                         
0031.00 TIME_ time;                                                                      
0032.00                                                                                  
0033.00   printf("** TESTLIBDAT:  最終更新日付の検索 **\n");                             
0034.00   getchar();                                                                     
0035.00   errcode.BYTESPRO = 160;                                                        
0036.00   errcode.BYTESAVL  = 0;                                                         
0037.00   QUSROBJD(&objd0100, sizeof(Qus_OBJD0100_t),"OBJD0100", "SPOOLWTR  *LIBL     ", 
0038.00            "*LIB      ", &errcode);                                              
0039.00   memcpy(date_time, objd0100.Change_Date_Time, 13);                              
0040.00   date_time[13] = 0x00;                                                          
0041.00   printf("SPOOLWTR(*LIB) date_time = [%s]\n", date_time);                        
0042.00   memcpy(year, "20", 2);                                                         
0043.00   memcpy(&year[2], &date_time[1], 2);                                            
0044.00   memcpy(date.year, year, 4);                                                    
0045.00   date.year[4] = 0x00;                                                           
0046.00   memcpy(date.month, &date_time[3], 2);                                          
0047.00   date.month[2] = 0x00;                                                          
0048.00   memcpy(date.day, &date_time[5], 2);                                            
0049.00   date.day[2] = 0x00;                                                            
0050.00   sprintf(DATE, "%s/%s/%s", date.year, date.month, date.day);                    
0051.00   printf("DATE = [%s]\n", DATE);                                                 
0052.00   memcpy(time.hour, &date_time[7], 2);                                           
0053.00   time.hour[2] = 0x00;                                                           
0054.00   memcpy(time.minute, &date_time[9], 2);                                         
0055.00   time.minute[2] = 0x00;                                                         
0056.00   memcpy(time.second, &date_time[11], 2);                                        
0057.00   time.second[2] = 0x00;                                                         
0058.00   sprintf(TIME, "%s:%s:%s", time.hour, time.minute, time.second);                
0059.00   printf("time = [%s]\n", TIME);                                                 
0060.00   getchar();                                                                     
0061.00 }                                                                                
【解説】

0037.00   QUSROBJD(&objd0100, sizeof(Qus_OBJD0100_t),"OBJD0100", "SPOOLWTR  *LIBL     ", 
0038.00            "*LIB      ", &errcode);                                              

によって戻り値の構造体

0018.00 Qus_OBJD0100_t objd0100;

の値を受け取っている。

0039.00   memcpy(date_time, objd0100.Change_Date_Time, 13);                              
0040.00   date_time[13] = 0x00;                                                          

によって 13 桁の 変更日付・時刻 を date_time に受け取ってから後で 日付 と 時刻 に分解して
処理しているだけである。
ここで何故、ライブラリーの 更新日付 と 時刻 を検索しているのかというと
そのライブラリー内に含まれるオブジェクトの最新の更新された 日付・時刻 が同時に
ライブラリー自身の 更新日付・時刻 でもあるからである。