Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第7章 アプリケーションの開発(COBOL)> 7.8 データ型に対するマッピング

7.8.6 共用体

(1)IDLマッピング

 IDL言語で共用体unionを指定した場合、COBOLではデータ型を識別する弁別情報Dと共用体Uから構成される構造体をデータ宣言します。また、構造体の領域獲得関数(関数名は"モジュール名-インタフェース名-構造体名-ALLOC"、以降XX-ALLOC関数と呼ぶ)がIDLコンパイラで生成されます。
 以降では、以下の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
          ); 
      };
  };

COBOL

  * 共用体(固定長) 
   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.

(2)クライアントアプリケーションで扱うパラメタ(固定長)

 共用体(固定長)のパラメタ(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.

(3)クライアントアプリケーションで扱うパラメタ(可変長)

 クライアントアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

サーバへ渡すパラメタ

サーバから渡されたパラメタ

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.

(4)サーバアプリケーションで扱うパラメタ(固定長)

 共用体(固定長)のパラメタ(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".

(5)サーバアプリケーションで扱うパラメタ(可変長)

 サーバアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

クライアントからのパラメタ領域

クライアントへのパラメタ領域

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".

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005