![]() ![]() ![]() ![]() |
この節で示す VIEWS の使用例は、この章の後半にある FML プログラムの使用例とは無関係です。
以下は、ソース VIEW 記述 custdb
を含む VIEW ファイルの例です。
# BEGINNING OF VIEWFILE
VIEW custdb
# /* コメント行 */
# /* これもコメント行 */
#TYPE CNAME FBNAME COUNT FLAG SIZE NULL
carray bug BUG_CURS 4 - 12 "no bugs"
long custid CUSTID 2 - - -1
short super SUPER_NUM 1 - - 999
long youid ID 1 - - -1
float tape TAPE_SENT 1 - - -.001
char ch CHR 1 - - "0"
string action ACTION 4 - 20 "no action"
END
#END OF VIEWFILE
以下は、前の節で示した VIEW のコンパイルに必要なフィールド テーブルの例です。
# name number type flags comments
CUSTID 2048 long - -
VERSION_RUN 2055 string - -
ID 2056 long - -
CHR 2057 char - -
TAPE_SENT 2058 float - -
SUPER_NUM 2066 short - -
ACTION 2074 string - -
BUG_CURS 2085 carray - -
以下は、VIEW コンパイラによって生成されたヘッダ ファイルです。viewc
に対する入力として、前の節の VIEW ファイルを使用しています。
struct custdb {
char bug[4][12]; /* null="no bugs" */
long custid[2]; /* null=-1 */
short super; /* null=999 */
long youid; /* null=-1 */
float tape; /* null=-0.001000 */
char ch; /* null="0" */
char action[4][20]; /* null="no action" */
};
以下は、mkfldhdr
によってフィールド テーブル ファイルから生成されたヘッダ ファイルです。mkfldhdr
に対する入力として、前の例のフィールド定義を格納したフィールド テーブル ファイルを使用しています。
/* mkfldhdr を使ってフィールド テーブルから生成された custdb.flds.h */
/* fname fldid */
/* ----- ----- */
#define ACTION ((FLDID)43034) /* 番号: 2074 型: string */
#define BUG_CURS ((FLDID)51237) /* 番号: 2085 型: carray */
#define CUSTID ((FLDID)10240) /* 番号: 2048 型: long */
#define SUPER_NUM ((FLDID)2066) /* 番号: 2066 型: short */
#define TAPE_SENT ((FLDID)26634) /* 番号: 2058 型: float */
#define VERSION_RUN ((FLDID)43015) /* 番号: 2055 型: string */
#define ID ((FLDID)10248) /* 番号: 2056 型: long */
#define CHR ((FLDID)18441) /* 番号: 2057 型: char */
以下は、viewc
で -C
コマンドライン オプションを指定して作成された COBOL COPY ファイル、CUSTDB.cbl
です。
* VIEWFILE: "t.v"
* VIEWNAME: "custdb"
05 BUG OCCURS 4 TIMES PIC X(12).
* NULL="no bugs"
05 CUSTID OCCURS 2 TIMES PIC S9(9) USAGE IS COMP-5.
* NULL=-1
05 SUPER PIC S9(4) USAGE IS COMP-5.
* NULL=999
05 FILLER PIC X(02).
05 YOUID PIC S9(9) USAGE IS COMP-5.
* NULL=-1
05 TAPE USAGE IS COMP-1.
* NULL=-0.001000
05 CH PIC X(01).
* NULL='0'
05 ACTION OCCURS 4 TIMES PIC X(20).
* NULL="no action"
05 FILLER PIC X(03).
viewc -C
を使用して作成した COBOL COPY ファイルを含む COBOL プログラムの例については、『COBOL を使用した Oracle Tuxedo アプリケーションのプログラミング』を参照してください。
以下は、VIEW を使用して構造体とフィールド化バッファをマッピングするプログラムの例です。このプログラムが正しく動作するには、「FML および VIEWS の環境設定」で説明した環境変数を正しく設定する必要があります。
FML プログラムのコンパイル方法については、『Oracle Tuxedo のファイル形式とデータ記述方法』の「compilation(5)」リファレンス ページを参照してください。
/* VIEW プログラムの例 */
#include stdio.h>
#include "fml.h"
#include "custdb.flds.h" /* 「viewc によって生成されるヘッダ ファイル */
/* の例」のフィールド ヘッダ ファイル */
#include "custdb.h" /* 「フィールド テーブルの例」の viewc で */
/* 作成された C 構造体ヘッダ ファイル */
#define NF 800
#define NV 400
extern Ferror;
main()
{
/* 必要なプログラム変数と FML 関数の宣言 */
FBFR *fbfr,*Falloc();
void F_error();
char *str, *cstruct, buff[100];
struct custdb cust;
/* フィールド化バッファの割り当て */
if ((fbfr = Falloc(NF,NV)) == NULL) {
F_error("sample.program");
exit(1);
}
/* buff を指すように str ポインタを初期化し、 */
/* 文字列を buff にコピーし、 */
/* fbfr バッファのいくつかのフィールドに値を Fadd で追加 */
str =
strcpy(str,"13579");
if (Fadd(fbfr,ACTION,str,(FLDLEN)6) < 0)
F_error("Fadd");
strcpy(str,"act11");
if (Fadd(fbfr,ACTION,str,(FLDLEN)6) < 0)
F_error("Fadd");
strcpy(str,"This is a one test.");
if (Fadd(fbfr,BUG_CURS,str,(FLDLEN)19) < 0)
F_error("Fadd");
strcpy(str,"This is a two test.");
if (Fadd(fbfr,BUG_CURS,str,(FLDLEN)19) < 0)
F_error("Fadd");
strcpy(str,"This is a three test.");
if (Fadd(fbfr,BUG_CURS,str,(FLDLEN)21) < 0)
F_error("Fadd");
/* fbfr の現在の内容を出力 */
printf("fielded buffer before:¥n"); Fprint(fbfr);
/* C 構造体に値を代入 */
cust.tape = 12345;
cust.super = 999;
cust.youid = 80;
cust.custid[0] = -1; cust.custid[1] = 75;
str = cust.bug[0][0];
strncpy(str,"no bugs12345",12);
str = cust.bug[1][0];
strncpy(str,"yesbugs01234",12);
str = cust.bug[2][0];
strncpy(str,"no bugsights",12);
str = cust.bug[3][0];
strncpy(str,"no bugsysabc",12);
str = cust.action[0][0];
strcpy(str,"yesaction");
str = cust.action[1][0];
strcpy(str,"no action");
str = cust.action[2][0];
strcpy(str,"222action");
str = cust.action[3][0];
strcpy(str,"no action");
cust.ch = '0';
cstruct = (char *)&cust;
/* custdb VIEW 記述を使用して、 */
/* C 構造体の値で fbfr バッファを更新 */
if (Fvstof(fbfr,cstruct,FUPDATE,"custdb") < 0) {
F_error("custdb");
Ffree(fbfr);
exit(1);
}
/* 次のコードがデータを */
/* fbfr から cstruct に移す */
/*
if (Fvftos(fbfr,cstruct,"custdb") < 0) {
F_error("custdb");
Ffree(fbfr);
exit(1);
} */
/* C 構造体と */
/* fbfr バッファの値を出力 */
printf("cstruct contains:¥en");
printf("action=:%s:¥n",cust.action[0][0]);
printf("action=:%s:¥n",cust.action[1][0]);
printf("action=:%s:¥n",cust.action[2][0]);
printf("action=:%s:¥n",cust.action[3][0]);
printf("custid=%ld¥n",cust.custid[0]);
printf("custid=%ld¥n",cust.custid[1]);
printf("youid=%ld¥n",cust.youid);
printf("tape=%f¥n",cust.tape);
printf("super=%d¥n",cust.super);
printf("bug=:%.12s:¥n",cust.bug[0][0]);
printf("bug=:%.12s:¥n",cust.bug[1][0]);
printf("bug=:%.12s:¥n",cust.bug[2][0]);
printf("bug=:%.12s:¥en",cust.bug[3][0]);
printf("ch=:%c:¥n¥n",cust.ch);
printf("fielded buffer after:¥n");
Fprint(fbfr);
Ffree(fbfr);
exit(0);
}
bankapp
は、Oracle Tuxedo システムに同梱されるサンプル アプリケーションです。このアプリケーション プログラムには、VIEWS 構造を使用した 2 つのファイルが組み込まれています。サンプル内の構造体は、FML バッファにマッピングされない構造体なので、構造体メンバへのデータの入出力に FML 関数は使用されていません。
$TUXDIR/apps/bankapp/audit.c
は、コマンドライン オプションを使って、型付きバッファ VIEW
にサービス要求を設定する方法を決定するクライアント プログラムです。
サーバ $TUXDIR/apps/bankapp/BAL.ec
のコードは、サービス要求を受け付け、ESQL 文の公式化に使用される VIEW
バッファからのフィールドを示します。
bankapp
は、Oracle Tuxedo システムに同梱されるサンプル アプリケーションです。
ACCT.ec
BTADD.ec
TLR.ec
上記のサーバでは、FML 型付きバッファ (bankapp クライアントである bankclt
からサーバに渡される) のデータを操作するための FML 関数が使用されています。
これらのサーバでは、FML 関数の Falloc、Falloc32(3fml) および Frealloc、Frealloc32(3fml) の代わりに、ATMI 関数の tpalloc(3c) および tprealloc(3c) を使用してメッセージ バッファを割り当てます。
![]() ![]() ![]() |