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

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

7.8.4 シーケンス型

(1)IDLマッピング

 IDL言語でシーケンス型sequenceを指定した場合、COBOLでは以下の構造体(シーケンス構造体)をデータ宣言します。また、シーケンス構造体の領域獲得関数(関数名は"CORBA-SEQUENCE-データ型-ALLOC"、以降XX-ALLOC関数と呼ぶ)と、シーケンスデータ域の獲得関数(関数名は"CORBA-SEQUENCE-データ型-ALLOCBUF"、以降XX-ALLOCBUF関数と呼ぶ)がIDLコンパイラで生成されます。

     01 CORBA-SEQUENCE. 
  * シーケンス配列の最大個数
     03  SEQ-MAXIMUM   PIC  S9(9) COMP-5. 
  * シーケンス配列の使用個数
     03  SEQ-LENGTH    PIC  S9(9) COMP-5. 
  * シーケンスのデータ域へのポインタ
     03  SEQ-BUFFER    USAGE POINTER.

 以降では、以下のIDL定義例をもとに説明します。

IDL言語

  module ODsample{
      interface  seqtest{
          typedef sequence<long>  sampleseq; 
          sampleseq op1(in sampleseq seq1, out sampleseq seq2, 
                        inout sampleseq seq3 ); 
      };
  };

COBOL

    01 ODSAMPLE-SEQTEST-SAMPLESEQ. 
  * シーケンスの最大長
     02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM. 
  * シーケンスの長さ
     02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH. 
  * シーケンスのデータ
     02 SEQ-BUFFER USAGE IS POINTER.

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

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

パラメタ

サーバへ渡すパラメタ

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

in

シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。

シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。

inout

シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。

シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。

リリースフラグにCORBA-TRUE-VALUEを設定する場合、データ部の領域はスタブにより解放されます。
リリースフラグにCORBA-FALSE-VALUEを設定する、またはリリースフラグを設定しない場合、スタブではデータ域の解放を行いません。この場合、アプリケーション内で領域を保持し、不要になった段階で解放処理を実施してください。

領域はスタブで自動的に獲得されます(各メンバも設定されます)。
この際、獲得した領域にはリリースフラグにCORBA-TRUE-VALUEが設定されています。

out
復帰値

(inoutパラメタと同じ)

注意事項

 クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA-FREE関数で解放する必要があります。このとき、データ域の領域(XX-ALLOCBUF関数で獲得)を解放するかどうかを、リリースフラグで指定します。

 リリースフラグの参照と設定は、以下の関数/フラグを使用します。

[関数]
  CALL "CORBA-SEQUENCE-GET-RELEASE" USING
        BUFFER
        RET-VAL.
  CALL "CORBA-SEQUENCE-SET-RELEASE" USING 
        BUFFER
        CORBA-TRUE-VALUE.
[フラグ]
  CORBA-TRUE-VALUE : CORBA-FREE関数発行時、SEQ-BUFEERの指す領域も解放される
  CORBA-FALSE-VALUE: CORBA-FREE関数発行時、SEQ-BUFEERの指す領域は解放されない(デフォルト)

 なお、スタブで獲得されたoutパラメタ、復帰値のリリースフラグは、CORBA-TRUE-VALUEに設定されます。

 以下にクライアントアプリケーションでの処理例を示します。

   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 SEQ1. 
       02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM. 
       02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH. 
       02 SEQ-BUFFER USAGE IS POINTER. 
    01 SEQ2 USAGE POINTER. 
    01 SEQ3-P USAGE POINTER. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY I. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LONG-V.
    01 BUF-IN-P USAGE POINTER.
    01 LONG-IN-P USAGE POINTER.
    01 BUF-IO-P USAGE POINTER.
    01 LONG-IO-P USAGE POINTER.
  LINKAGE SECTION.
    01 SEQ3.
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
        02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
        02 SEQ-BUFFER USAGE IS POINTER.

   PROCEDURE DIVISION. 

  * inパラメタの処理
    MOVE 2 TO SEQ-MAXIMUM OF SEQ1. 
    MOVE 2 TO SEQ-LENGTH OF SEQ1. 
    CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING 
          SEQ-LENGTH OF SEQ1
          SEQ-BUFFER OF SEQ1.
    MOVE 10 TO LONG-V.
    MOVE FUNCTION ADDR (SEQ1) TO BUF-IN-P.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ1
          COMPUTE LONG-V = 20 + LONG-V
          MOVE FUNCTION ADDR(LONG-V) TO LONG-IN-P
          CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
                                      BUF-IN-P
                                      I
                                      LONG-IN-P
    END-PERFORM
  * inoutパラメタの処理
    CALL "CORBA-SEQUENCE-LONG-ALLOC" USING
        SEQ3-P. 
    SET ADDRESS OF SEQ3 TO SEQ3-P. 
    MOVE 3 TO SEQ-MAXIMUM OF SEQ3. 
    MOVE 3 TO SEQ-LENGTH OF SEQ3.
    CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING 
          SEQ-LENGTH OF SEQ3
          SEQ-BUFFER OF SEQ3.
    MOVE 5 TO LONG-V.
    MOVE FUNCTION ADDR (SEQ3) TO BUF-IO-P.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ3
          COMPUTE LONG-V = 30 + LONG-V
          MOVE FUNCTION ADDR(LONG-V) TO LONG-IO-P
          CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
                                      BUF-IO-P
                                      I
                                      LONG-IO-P
    END-PERFORM
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
          SEQ3-P
          CORBA-TRUE-VALUE. 
    CALL "ODSAMPLE-SEQTEST-OP1" USING
        OBJ
        SEQ1
        SEQ2
        SEQ3-P
        ENV
        SEQ0. 
    CALL "CORBA-FREE" USING 
        SEQ0. 
    CALL "CORBA-FREE" USING 
        SEQ-BUFFER OF SEQ1. 
    CALL "CORBA-FREE" USING 
        SEQ2. 
    CALL "CORBA-FREE" USING 
        SEQ3-P.

(3)サーバアプリケーションで扱うパラメタ

 シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。
 シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。

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

パラメタ

クライアントから渡されたパラメタ

クライアントへ渡すパラメタ

in

各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得/解放されます。

inout

各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得されます。
この際、リリースフラグの設定には、CORBA-TRUE-VALUEが設定されています。

inoutデータの領域を更新する場合には、以下の処理を実施してください。
SEQ-BUFFER域をCORBA-FREE関数で一度解放し、XX-ALLOCBUF関数で再獲得します。

リリースフラグにCORBA-TRUE-VALUEを設定する、またはリリースフラグを設定しない場合、領域はスケルトンで自動的に解放されます。
リリースフラグにCORBA-FALSE-VALUEを設定する場合、スケルトンでは領域の解放を行いません。この場合、C言語などの他言語と連携させて領域を保持し、不要になった段階で解放処理を実施してください。

out
復帰値

シーケンス構造体/SEQ-BUFFER域をXX-ALLOC関数/XX-ALLOCBUF関数で獲得します。

リリースフラグにCORBA-TRUE-VALUEを設定する場合、領域はスケルトンで自動的に解放されます。
リリースフラグにCORBA-FALSE-VALUEを設定する、またはリリースフラグを設定しない場合、スケルトンでは領域の解放を行いません。この場合、C言語などの他言語と連携させて領域を保持し、不要になった段階で解放処理を実施してください。

 以下にサーバアプリケーションでの処理例を示します。

  IDENTIFICATION DIVISION. 
  PROGRAM-ID. "ODSAMPLE-SEQTEST-OP1".
  ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SPECIAL-NAMES. 
      SYMBOLIC CONSTANT
      COPY SYMBOL-CONST IN CORBA. 
      . 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
    COPY CONST IN CORBA. 
    01 STR  USAGE POINTER. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    01 STR-WORK PIC X(30). 
     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 COPY LONG IN CORBA REPLACING CORBA-LONG BY I. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM. 
    01 LONG-OUT-P USAGE POINTER.
    01 LONG-IO-P  USAGE POINTER.
    01 LONG-RET-P USAGE POINTER.
    01 BUF-OUT-P  USAGE POINTER.
    01 BUF-IO-P   USAGE POINTER.
    01 BUF-RET-P  USAGE POINTER.
   LINKAGE SECTION.
    01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
    01 SEQ. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH. 
      02 SEQ-BUFFER USAGE POINTER. 
    01 SEQ1. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH. 
      02 SEQ-BUFFER USAGE POINTER. 
    01 SEQ2. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH. 
      02 SEQ-BUFFER USAGE POINTER. 
    01 SEQ3. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM. 
      02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH. 
      02 SEQ-BUFFER USAGE POINTER. 
    01 SEQ1-P USAGE POINTER. 
    01 SEQ2-P USAGE POINTER. 
    01 SEQ3-P USAGE 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. 
    01 SEQ-P USAGE POINTER. 
  PROCEDURE DIVISION USING
        OBJ
        SEQ1
        SEQ2-P
        SEQ3-P
        ENV
        SEQ-P. 

  MAIN. 
  * outパラメタの処理
    CALL "CORBA-SEQUENCE-LONG-ALLOC" USING
        SEQ2-P
    SET ADDRESS OF SEQ2 TO SEQ2-P. 
    MOVE 4 TO SEQ-MAXIMUM OF SEQ2. 
    MOVE 4 TO SEQ-LENGTH OF SEQ2. 
    CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING 
          SEQ-LENGTH OF SEQ2
          SEQ-BUFFER OF SEQ2. 
    MOVE FUNCTION ADDR (SEQ2) TO BUF-OUT-P.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ2
          COMPUTE NUM = I * 100
          MOVE FUNCTION ADDR(NUM) TO LONG-OUT-P
          CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
               BUF-OUT-P
               I
               LONG-OUT-P
    END-PERFORM
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
        SEQ2-P
          CORBA-TRUE-VALUE. 

  * inoutパラメタの処理
    SET ADDRESS OF SEQ3 TO SEQ3-P.
    CALL "CORBA-FREE" USING
          SEQ-BUFFER OF SEQ3. 
    MOVE 5 TO SEQ-MAXIMUM OF SEQ3. 
    MOVE 5 TO SEQ-LENGTH OF SEQ3. 
    CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING
          SEQ-LENGTH OF SEQ3
          SEQ-BUFFER OF SEQ3. 
    MOVE FUNCTION ADDR (SEQ3) TO BUF-IO-P.
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ3
          COMPUTE NUM = I * 1000
          MOVE FUNCTION ADDR(NUM) TO LONG-IO-P
          CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
              BUF-IO-P
              I
              LONG-IO-P
    END-PERFORM
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
        SEQ3-P
          CORBA-TRUE-VALUE. 

  * 復帰値の処理
    CALL "CORBA-SEQUENCE-LONG-ALLOC" USING
        SEQ-P. 
    SET ADDRESS OF SEQ TO SEQ-P. 
    MOVE 6 TO SEQ-MAXIMUM OF SEQ. 
    MOVE 6 TO SEQ-LENGTH OF SEQ. 
    MOVE FUNCTION ADDR(SEQ) TO BUF-RET-P.
    CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING 
          SEQ-LENGTH OF SEQ
          SEQ-BUFFER OF SEQ. 
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ
          COMPUTE NUM = I * 10000
          MOVE FUNCTION ADDR(NUM) TO LONG-RET-P
          CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
              BUF-RET-P
              I
              LONG-RET-P
    END-PERFORM
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
        SEQ-P
          CORBA-TRUE-VALUE. 
    MAIN-END. 
   END PROGRAM "ODSAMPLE-SEQTEST-OP1".

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

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