Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス COBOL言語編


1.3.2 XATMIインタフェース用スタブの作成方法

XATMIインタフェース用のスタブの作成方法について説明します。XATMIインタフェースの通信をするUAPの場合は,クライアントUAPとサーバUAPの両方に,スタブが必要です。

スタブを作成するときは,XATMIインタフェース定義を格納したファイル(XATMIインタフェース定義ファイル)を作成して,スタブを生成するコマンドを実行します。スタブを生成するコマンドを,次に示します。

作成したスタブのソースファイルは,C言語のコンパイラで翻訳して,UAPのオブジェクトファイルに結合させます。

XATMIインタフェース用スタブの作成手順を次の図に示します。

図1‒9 XATMIインタフェース用スタブの作成手順(TCP/IP通信,OSI TP通信)

[図データ]

〈この項の構成〉

(1) XATMIインタフェース定義(クライアントUAP用)

クライアントUAP(SUP,またはSPP)用のXATMIインタフェース定義の形式について説明します。

形式
called_servers = { "サーバの定義ファイル名"
                         〔,"サーバの定義ファイル名"〕…};
機能

サーバUAPのXATMIインタフェース定義のファイル名を,すべて指定します。サーバUAPのXATMIインタフェース定義ファイル名を指定することで,サーバUAPで定義されているレコード型は,クライアントUAPでも使えるようになります。

パラメタ
  • サーバの定義ファイル名

    サーバUAPのXATMIインタフェース定義ファイルのファイル名を指定します。定義ファイル名は,サフィックスが ".def" のファイルです。

    一つのcalled_servers文の括弧 { } の中に,複数の定義ファイル名を指定できます。また,一つのXATMIインタフェース定義ファイルに複数のcalled_servers文を記述することもできます。

指定例

サーバUAP1とサーバUAP2とXATMIインタフェースの通信をするクライアントUAPの定義(サーバUAP1の定義ファイル名をserv1.def,サーバUAP2の定義ファイル名をserv2.def とします)。

形式1
called_servers = { "serv1.def","serv2.def"};
形式2
called_servers = { "serv1.def"};
called_servers = { "serv2.def"};

(2) XATMIインタフェース定義(サーバUAP用)

サーバUAPのXATMIインタフェース定義に指定する項目を次に示します。指定は順不同です。

(a) 通信で使うレコード型の定義

形式
   タイプ名 サブタイプ名{
              データ型 データ名;
            〔データ型 データ名;〕
                     :
                     :
            };
機能

サーバUAPで使うレコード型のタイプ名,サブタイプ名,およびレコードを定義します。サーバUAPから ほかのサーバUAPプロセスのサービスを呼び出す場合,呼び出すプロセスで使えるレコード型はすべて自プロセスでも使えます。そのため,ここでは自プロセス内のサービスプログラムが入出力として使うレコード型だけを定義します。

X_OCTETは定義しなくても常に認識されます。X_OCTETを定義した場合,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)の実行時にエラーとなります。

X_C_TYPEはCOBOL言語のAPIでは使えません。X_C_TYPEを定義した場合,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)に -bオプションを付けて実行するとエラーとなります。

パラメタ
  • タイプ名

    サーバUAPで使うレコード型の,タイプ名を指定します。

  • サブタイプ名

    サーバUAPで使うレコード型の,サブタイプ名を指定します。

  • データ型

    サーバUAPで使うレコード型の,データ型を指定します。

  • データ名

    サーバUAPで使うレコード型の,データ名を指定します。

タイプで使えるデータ型の一覧

タイプで使えるデータ型の一覧を次の表に示します。識別子とはXATMIインタフェース定義に記述するデータ型を示し,COBOL言語のデータとは実際にスタブに定義される型付きレコードを示します。OpenTP1以外のシステムと通信するためにデータ型を変換する場合は,変換する識別子をXATMIインタフェース定義に指定します。

表1‒6 タイプで使えるデータ型の一覧

タイプ

識別子

COBOL言語のデータ

通信プロトコル

備考

TCP/IP

OSI TP

X_OCTET

※1

※1

なし

X_COMMON

short a

PIC S9(4) COMP-5

なし

short a[n]

PIC S9(4) COMP-5

OCCURS n TIMES

なし

long a

PIC S9(9) COMP-5

なし

long a[n]

PIC S9(9) COMP-5

OCCURS n TIMES

なし

char a※2

PIC X

無変換配列

octet a

PIC X

無変換配列

tchar a

PIC X

変換配列

char a[n]※2

PIC X(n)

無変換配列

octet a[n]

PIC X(n)

無変換配列

tchar a[n]

PIC X(n)

変換配列

X_C_TYPE

※3

※3

×

×

なし

(凡例)

○:該当する通信プロトコルで使えます。

×:該当する通信プロトコルでは使えません。

−:変換の識別子でも,無変換としてそのまま処理されます。

注※1

X_OCTETは,定義しなくても自動的に認識されます。XATMIインタフェース定義にX_OCTETを指定した場合は,スタブを生成するコマンドを実行したときにエラーになります。

注※2

この識別子も使えますが,新規で作成する場合は次に示す識別子を使うことをお勧めします。

X_COMMONの場合:octetまたはtchar

X_C_TYPEの場合:strまたはtstr

注※3

X_C_TYPEは,COBOL言語のAPIでは使えません。X_C_TYPEを定義した場合,スタブを生成するコマンドに-bオプションを指定して実行するとエラーになります。

指定例
 X_COMMON subtype1 {
                    char  name[8];
                    long  data[10];
                    long  flags;
                    };

(b) サービスプログラム名とレコード型の定義

形式
service サービスプログラム名{
                 (タイプ名 〔サブタイプ名〕)|(ALL)|(〔void〕)};
機能

サーバUAPにある,サービスプログラムのプログラム名と,渡されるレコード型のタイプ名とサブタイプ名を指定します。

X_OCTETの場合はサブタイプ名がないので,タイプ名だけを指定します。また,サービスプログラム内でレコード型を一度も使わない処理の場合は,サービスプログラムのあとに何も指定しないか,voidを指定します。

TPCALL,TPACALL,TPCONNECTは,型付きレコードを送信しないで,サービスプログラムを呼び出せます。ただし,サービスプログラムでレコード型を明示的に参照したくない場合は,データ領域に何も設定しないか,空白を設定します。このように指定したサービスプログラムを呼び出すには,クライアント側のTPCALL,TPACALL,TPCONNECTが送信する型付きレコードに,空白を設定してください。ただし,X_OCTETの場合は,データ領域が空白でなくても,送信データの長さが0の場合でも,サービスを要求できます。

データ領域として受け取るレコード型を限定しない指定をする場合は,ALL を指定します。ALL を指定して定義したサービスプログラムは,自プロセスで認識できるレコード型であれば,どの型でも受信できます。

パラメタ
  • サービスプログラム名

    サーバUAPにある,プログラム名を指定します。

  • タイプ名

    APIのデータ領域に指定した,タイプ名を指定します。

  • サブタイプ名

    APIのデータ領域に指定した,サブタイプ名を指定します。

指定例
例1
 service svc_func1(X_COMMON subtype1);
例2(タイプ名がX_OCTETの場合)
 service svc_func2(X_OCTET);
例3(型付きレコードを受信しないサービスプログラムの場合)
 service svc_func3(void);  または  service svc_func3();
例4(レコード型を限定しないサービスプログラムの場合)
 service svc_func4(ALL);

(c) サーバUAPから,さらに別のサーバUAPを呼び出す場合

クライアントUAPのXATMIインタフェース定義(called_servers文)を指定します。

(3) XATMIインタフェース定義ファイルの名称

ファイル名には,XATMIインタフェース定義ファイルを示すサフィックス ".def" を必ず付けてください。XATMIインタフェース定義ファイルを格納するディレクトリは,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)が探せるパスであれば,特に制限はありません。

XATMIインタフェース定義ファイルのファイル名の長さは,最大255文字です。ただし,OSの制限で255文字まで指定できないことがあります。

スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)を実行したあと,スタブのソースファイルはXATMIインタフェース定義ファイルとは別の名称で作成されます。そのため,OpenTP1の稼働中にはXATMIインタフェース定義ファイルは使われません。

(4) 定義ファイルのインクルード

異なるプロセスで同じレコード型を使うときは,共通のレコード型の定義ファイルを一つ作成して,それを各プロセスの定義ファイルにインクルードできます。

インクルードする文は,C言語と同じ書式です。次のように記述します。

    #include <ファイル名>  または  #include "ファイル名"

インクルードファイルは,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)の-iオプションで指定したサーチパスから読み込まれます。サーチパス内に該当するファイルがない場合は,最後にカレントディレクトリを探します。

インクルードするファイルの名称は任意です(サフィックスが .h でなくてもかまいません)。ただし,そのファイルをXATMIインタフェース定義ファイルとして直接 スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)に指定する場合は,その定義の名称規則に従ってください。

インクルードするファイルの内容は,XATMIインタフェース定義ファイルと同じです。ただし,名称が重複することもありますので,自プロセス内のサービス関数の定義は含めないことをお勧めします。

(5) 名称の付け方の注意

  1. サービスプログラム名,サブタイプ名は,OpenTP1で規定する条件に従ってください。

    • "dc","DC","CBLDC","tx","TX","tp","TP" で始まる名称は使えません。

    • サービスプログラム名は,20文字以内で指定してください。

    • サブタイプ名の最大長は32文字です。そのうち16文字までが有効になります。重複があるかどうかは,16文字までの範囲でチェックしています。

    • 型付きレコードの中で使うデータのデータ名の最大長は,32文字です。

  2. 同じプロセス内では,サービスプログラム名が重複しないようにしてください。

  3. 同じプロセス内でサブタイプ名が重複した場合は,そのタイプおよび構造が一致するときは許可されます。不一致のときは,スタブを生成するコマンド(stbmakeコマンドまたはtpstbmkコマンド)がエラーリターンします。

  4. 異なるプロセス内では,サービスプログラム名やサブタイプ名は同じものを許可します。ただし,サーバとして異なるプロセスにあっても,一つのクライアントから呼ばれる場合,クライアント側からは同じプロセスと見なされます。