| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第7章 アプリケーションの開発(COBOL) | > 7.8 データ型に対するマッピング |
IDL言語で共用体unionを指定した場合、COBOLではデータ型を識別する弁別情報Dと共用体Uから構成される構造体をデータ宣言します。また、構造体の領域獲得関数(関数名は"モジュール名-インタフェース名-構造体名-ALLOC"、以降XX-ALLOC関数と呼ぶ)がIDLコンパイラで生成されます。
以降では、以下のIDL定義例をもとに説明します。
module ODsample{
union samplefix switch(long){ // 共用体(固定長)
case 1: long para1;
case 2: long para2;
};
union samplevar switch(long){ // 共用体(可変長)
case 1: long para1;
case 2: string para2;
};
interface uniontest{
samplefix op2(
in samplefix uni1,
out samplefix uni2,
inout samplefix uni3
);
samplevar op1(
in samplevar uni1,
out samplevar uni2,
inout samplevar uni3
);
};
};
* 共用体(固定長)
01 ODSAMPLE-SAMPLEFIX.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
* 共用体(可変長)
01 ODSAMPLE-SAMPLEVAR.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
02 FILLER REDEFINES U.
03 PARA2 USAGE IS POINTER.
共用体(固定長)のパラメタ(in,out,inout)を扱う場合、領域の獲得/解放を行う必要はありません。弁別情報にデータ型識別値、データ域にデータを設定します。
以下にクライアントアプリケーションでの処理例を示します。
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY CONST IN CORBA.
01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV.
01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ.
01 UNI1.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI2.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI3.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI0.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY L-SIZE.
01 STR-WORK PIC X(10).
PROCEDURE DIVISION.
* inパラメタの弁別子の設定
MOVE 2 TO D OF UNI1.
* inパラメタの値の設定
MOVE 100 TO PARA2 OF UNI1.
* inoutパラメタの弁別子の設定
MOVE 2 TO D OF UNI3.
* inoutパラメタの値の設定
MOVE 200 TO PARA2 OF UNI3.
CALL "ODSAMPLE-UNIONTEST-OP2" USING
OBJ
UNI1
UNI2
UNI3
ENV
UNI0.
クライアントアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
サーバへ渡すパラメタ |
サーバから渡されたパラメタ |
|
in |
構造体領域/可変長データ域を獲得する場合、XX-ALLOC関数/データ領域獲得関数を用います。 |
− |
|
inout |
(inパラメタと同じ) |
領域はスタブで自動的に獲得されます。 |
|
out |
− |
(inoutパラメタと同じ) |
クライアントおよびスタブで動的に獲得した領域は、不要になった時点でCORBA-FREE関数で解放する必要があります。CORBA-FREE関数を発行することで可変長データ域も解放されます。
以下にクライアントアプリケーションでの処理例を示します。
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY CONST IN CORBA.
01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV.
01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ.
01 UNI1.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 PARA2 USAGE IS POINTER.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI2 USAGE POINTER.
01 UNI3 USAGE POINTER.
01 UNI0 USAGE POINTER.
01 STR-WORK PIC X(30).
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE.
LINKAGE SECTION.
01 UNI-P.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 PARA2 USAGE IS POINTER.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
PROCEDURE DIVISION.
* inパラメタの弁別子の設定
MOVE 1 TO D OF UNI1.
* inパラメタの値の設定
MOVE 10 TO PARA1 OF UNI1.
*inoutパラメタの領域獲得
CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING
UNI3.
SET ADDRESS OF UNI-P TO UNI3.
* inoutパラメタの弁別子の設定
MOVE 2 TO D OF UNI1-P.
* inoutパラメタの値の設定
MOVE 12 TO LSIZE.
MOVE "INOUT:para2" TO STR-WORK.
MOVE FUNCTION LENG(STR-WORK) TO LSIZE
CALL "CORBA-STRING-SET" USING
PARA2 OF UNI-P
LSIZE
STR-WORK.
CALL "ODSAMPLE-UNIONTEST-OP1" USING
OBJ
UNI1
UNI2
UNI3
ENV
UNI0.
* outパラメタの領域の解放
CALL "CORBA-FREE" USING
UNI2.
* inoutパラメタの領域の解放
CALL "CORBA-FREE" USING
UNI3.
* 復帰値の領域の解放
CALL "CORBA-FREE" USING
UNI0.
共用体(固定長)のパラメタ(in,out,inout)を扱う場合、構造体領域はスケルトンで自動的に獲得/解放されます。out、inoutパラメタをクライアントアプリケーションに渡す場合、処理結果を構造体メンバに設定します。
以下にサーバアプリケーションでの処理例を示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. "ODSAMPLE-UNIONTEST-OP2".
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY CONST IN CORBA.
LINKAGE SECTION.
01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ.
01 UNI1.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
01 UNI2.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
01 UNI3.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
01 ENV.
03 MAJOR PIC 9(9) COMP-5.
88 CORBA-NO-EXCEPTION VALUE 0.
88 CORBA-USER-EXCEPTION VALUE 1.
88 CORBA-SYSTEM-EXCEPTION VALUE 2.
03 IDL-ID USAGE POINTER.
03 MINOR PIC 9(9) COMP-5.
03 IDL-STATUS PIC 9(9) COMP-5.
03 PARAM USAGE POINTER.
03 MAGIC PIC 9(9) COMP-5.
01 UNI.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2.
PROCEDURE DIVISION USING
OBJ
UNI1
UNI2
UNI3
ENV
UNI.
MAIN SECTION.
* outパラメタの処理
MOVE 1 TO D OF UNI2.
MOVE 10 TO PARA1 OF UNI2.
* inoutパラメタの処理
MOVE 1 TO D OF UNI3.
MOVE 30 TO PARA1 OF UNI3.
* 復帰値の処理
MOVE 1 TO D OF UNI.
MOVE 100 TO PARA1 OF UNI.
MAIN-END.
END PROGRAM "ODSAMPLE-UNIONTEST-OP2".
サーバアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
クライアントからのパラメタ領域 |
クライアントへのパラメタ領域 |
|
in |
構造体領域/可変長データ域はスケルトンで自動的に獲得/解放されます。 |
− |
|
inout |
構造体領域/可変長データ域はスケルトンで自動的に獲得されます。 |
可変長データ域をCORBA-FREE関数で一度解放し、データ域獲得関数で再獲得します。 |
|
out |
− |
構造体/可変長データ域をXX-ALLOC関数/データ域獲得関数で獲得します。 |
以下にサーバアプリケーションでの処理例を示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. "ODSAMPLE-UNIONTEST-OP1".
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY CONST IN CORBA.
01 STR-WORK PIC X(30).
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE.
01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ.
LINKAGE SECTION.
01 UNI1.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 PARA2 USAGE IS POINTER.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI2-P.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 PARA2 USAGE IS POINTER.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI2 USAGE IS POINTER.
01 UNI3-P.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 PARA2 USAGE IS POINTER.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI3 USAGE IS POINTER.
01 ENV.
03 MAJOR PIC 9(9) COMP-5.
88 CORBA-NO-EXCEPTION VALUE 0.
88 CORBA-USER-EXCEPTION VALUE 1.
88 CORBA-SYSTEM-EXCEPTION VALUE 2.
03 IDL-ID USAGE POINTER.
03 MINOR PIC 9(9) COMP-5.
03 IDL-STATUS PIC 9(9) COMP-5.
03 PARAM USAGE POINTER.
03 MAGIC PIC 9(9) COMP-5.
01 UNI-P.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D.
02 U.
03 PARA2 USAGE IS POINTER.
02 FILLER REDEFINES U.
03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
01 UNI USAGE POINTER.
PROCEDURE DIVISION USING
OBJ
UNI1
UNI2
UNI3
ENV
UNI.
MAIN SECTION.
* outパラメタの処理
CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING
UNI2.
SET ADDRESS OF UNI2-P TO UNI2.
MOVE 2 TO D OF UNI2-P.
MOVE 10 TO LSIZE.
MOVE "OUT:param" TO STR-WORK.
MOVE FUNCTION LENG(STR-WORK) TO LSIZE.
CALL "CORBA-STRING-SET" USING
PARA2 OF UNI2-P
LSIZE
STR-WORK.
* inout復帰値の処理
SET ADDRESS OF UNI3-P TO UNI3.
EVALUATE D OF UNI3-P
WHEN 2
CALL "CORBA-FREE" USING
PARA2 OF UNI3-P
END-EVALUATE.
MOVE 1 TO D OF UNI3-P.
MOVE 10 TO PARA1 OF UNI3-P.
* 復帰値の処理
CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING
UNI.
SET ADDRESS OF UNI-P TO UNI.
MOVE 1 TO D OF UNI-P.
MOVE 30 TO PARA1 OF UNI-P.
MAIN-END.
END PROGRAM "ODSAMPLE-UNIONTEST-OP1".
目次
索引
![]()
|