目次 前 次 PDF


フィールドの定義と使用

フィールドの定義と使用
このトピックには次の項が含まれます:
FMLおよびVIEWSを使用するための準備
FMLフィールド化バッファを操作したり、VIEWS関数を使用して構造体とフィールド化バッファ間でフィールドを移動するには、次の準備作業が必要です。
フィールドを定義します。
フィールド定義をアプリケーション・プログラムで使用できるようにします。実行時にフィールド表ファイルおよびマッピング関数を使用するか、またはコンパイル時にCヘッダー・ファイルを使用します。
ソースVIEW記述をオブジェクトVIEW記述にコンパイルし、対応するCヘッダー・ファイルおよびCOBOL COPYファイルを生成します。
この章では、これらの内容と、関連する処理について説明します。
FMLおよびVIEWSのフィールドの定義
このトピックには次の項が含まれます:
フィールド名とフィールド識別子を定義する
フィールド識別子(fieldid)は、typedefによりFLDID (FML32の場合はFLDID32)として定義されます。フィールド識別子は、フィールド型とフィールド番号で構成されます。フィールド番号は、フィールドを識別するための一意の番号です。
フィールド番号は、次の範囲内の番号でなければなりません。
FMLの場合: 1 - 8191
FML32の場合: 1 - 33,554,431
フィールド番号0および対応するフィールド識別子0は、不正なフィールド識別子(BADFLDID)を示すために予約されています。フィールド機能を備えた別のソフトウェアを使用してFMLを操作する場合は、フィールド番号に関する別の制約が適用されることがあります。
Oracle Tuxedoシステムは、フィールド番号に関する以下の規則に従っています。
 
FMLのフィールド番号
FML32のフィールド番号
予約済
使用可能
予約済
使用可能
1-100
101-8191
1-3,999,
6,000-10,000,
30,000,001-33,554,431
4,000-5,999,
10,001-30,000,000
Oracle Tuxedoシステムでは予約されている番号の使用を強制的に制限していませんが、アプリケーションでは予約番号を使用しないようにしてください。
フィールド識別子とフィールド名のマッピング情報は、フィールド表ファイルまたはフィールド・ヘッダー・ファイルに取り込まれます。フィールド表ファイルを使用する場合は、この後で説明するマッピング関数を使用してCプログラム内のフィールド名の参照を変換する必要があります。フィールド・ヘッダー・ファイルを使用すると、プログラムのコンパイル時にCプリプロセッサ(UNIXリファレンス・マニュアルのcpp(1)を参照)によってフィールド名からフィールド識別子へのマッピングが行われます。
フィールド表にアクセスするための関数およびプログラムでは、FLDTBLDIR環境変数およびFIELDTBLS環境変数を使用して、使用するソース・ディレクトリとフィールド表ファイルを指定します。(FLDTBLDIR32およびFIELDTBLS32は、 FML32と同じ目的で使用されます)環境変数の設定方法については、「FMLおよびVIEWSの環境設定」を参照してください。
複数のフィールド表を使用すると、複数のフィールド・グループに対して別々のディレクトリやファイルを設定できます。ただし、フィールド名およびフィールド番号は、すべてのフィールド表を通して一意でなければなりません。フィールド表がCヘッダー・ファイルに変換されて同じフィールド番号が複数回発生すると、予測できない結果が発生する可能性があるためです。
フィールド表ファイルを作成する
フィールド表ファイルは、viなどの標準的なテキスト・エディタを使用して作成します。このファイルの形式は、次のとおりです。
#で始まる行および空白行は無視されます。
$で始まる行は、マッピング関数では無視されますが、mkfldhdrで生成されたヘッダー・ファイルに渡されます。このとき$は除去されます。(詳細は、『Oracle Tuxedoコマンド・リファレンス』mkfldhdr、mkfldhdr32(1)に関する項を参照してください。)マッピング関数で行を無視させる機能は、Cコメントやwhat文字列を、アプリケーション側からCヘッダー・ファイルに渡すときに便利です。
注意:
ただしCOBOLアプリケーションでは、このような行はCOBOL COPYファイルに渡されません。
文字列*baseで始まる行には、後続のフィールド番号をオフセットするためのベース値が含まれています。この機能により、関連するフィールドのセットをグループ化し、簡単に番号を付け直すことができます。
上記以外のすべての行の形式は、次のとおりです。
name rel-number type flag comment
説明:
nameは、フィールドの識別子です。識別子は、Cプリプロセッサの識別子の制約に準拠しています(つまり、英数字とアンダースコア文字のみを含む必要があります)。nameは、内部で30文字以降が切り捨てられるので、nameの最初の30文字は一意でなければなりません。
rel-numberは、フィールドの相対番号を示す数値です。*baseが指定されている場合、この数値を現在の基数に加算すると、フィールドのフィールド番号を取得できます。
typeは、フィールドの型を示します。指定できる型は、shortlongfloatdoublecharstringcarraymbstringptrfml32、またはview32のいずれかです。
flagフィールドは、将来使用するために予約されています。このフィールドにはダッシュ(-)を指定してください。
commentは、フィールドの内容を説明するためのオプションのフィールドです。
エントリは、空白文字またはタブで区切ってください。
フィールド表の例
次のリストは、基数が500から700にシフトするフィールド表の例です。基数が500のグループの場合、最初のフィールド番号は501です。基数が700のグループの場合、最初のフィールド番号は701です。
リスト5-1 システム・フィールド表ファイル
# following are fields for EMPLOYEE service
# employee ID fields are based at 500
*base 500
#name rel-number type flags comment
#---- ---------- ---- ------ -------
EMPNAME 1 string - emp name
EMPID 2 long - emp id
EMPJOB 3 char - job type
SRVCDAY 4 carray - service date
*base 700
# all address fields are now relative to 700
EMPADDR 1 string - street address
EMPCITY 2 string - city
EMPSTATE 3 string - state
EMPZIP 4 long - zip code
 
フィールド名からフィールド識別子にマッピングする
実行時のマッピングは、Fldid()関数およびFname()関数を使用して行います。これらの関数は、FLDTBLDIR環境変数およびFIELDTBLS環境変数で指定されたフィールド表ファイルのセットを参照します。(FML32が使用されている場合、Fldid32()関数とFname32()関数は、FLDTBLDIR32環境変数およびFIELDTBLS32環境変数を参照します。)
Fldidは、引数(フィールド名)をfieldidにマッピングします。次のコードを参照してください。
char *name;
extern FLDID Fldid();
FLDID id;
...
id = Fldid(name);
Fnameは、その引数(fieldid)をフィールド名にマッピングすることにより、逆の処理を行います(次のコードを参照):
extern char *Fname();
name = Fname(id);
. . .
フィールド識別子からフィールド名へのマッピングは、ほとんど使用されません。フィールド識別子がわかっており、その識別子から対応する名前を確認するケースはほとんどないためです。フィールド識別子からフィールド名へのマッピングを行う例は、バッファの出力ルーチンです。バッファの出力ルーチンでは、フィールド化バッファの内容を、理解できる形式で表示する必要があります。
関連項目
Oracle Tuxedo ATMI FML関数リファレンスFldid、Fldid32(3fml)
Oracle Tuxedo ATMI FML関数リファレンスFname、Fname32(3fml)
フィールド表をロードする
Fldid()を最初に呼び出すと、フィールド表ファイルがロードされ、必要な検索が実行されます。フィールド表ファイルは、その後もロードされたまま残ります。Fldid()は、成功時にその引数に対応するフィールド識別子を返し、失敗時にはFBADNAMEに設定したFerrorと共に、BADFLDIDを返します。(FML32を使用している場合は、Ferror32がかわりに設定されます。)
Fldid()でロードしたフィールド表が占有するデータ領域を回復するには、Fnmid_unload()関数を呼び出してファイルをすべてアンロードする必要があります。
Fname()関数は、Fldid()と同じように動作しますが、処理の内容は、フィールド識別子からフィールド名へのマッピングです。ロード対象のフィールド表は同じ環境変数を使用して指定しますが、マッピング表の別のセットが生成されます。Fname()が成功すると、fldid引数に指定された名前を含む文字列へのポインタが返されます。失敗するとNULLが返されます。
注意:
ポインタは、表がロードされている限り有効です。
Fldid()の障害は、フィールド表が見つからないかまたはオープンできない(FFTOPEN)、フィールド表の構文が間違っている(FFTSYNTAX)、フィールド表内にノーヒット条件が存在する(FBADFLD)、などが原因で発生します。Fname()で作成したマッピング表が占有する表領域は、Fidnm_unload()関数を呼び出して回復できます。
実行時のマッピングを使用するマッピング関数およびその他のFML関数には、FIELDTBLS環境変数およびFLDTBLDIR環境変数を正しく設定しておく必要があります。そうでない場合は、デフォルト値が使用されます。(これらの環境変数のデフォルト値については、「FMLおよびVIEWSの環境設定」を参照してください。)
関連項目
Oracle Tuxedo ATMI FML関数リファレンスFldid、Fldid32(3fml)
Oracle Tuxedo ATMI FML関数リファレンスFnmid_unload、Fnmid_unload32(3fml)
Oracle Tuxedo ATMI FML関数リファレンスFname、Fname32(3fml)
Oracle Tuxedo ATMI FML関数リファレンスFidnm_unload、Fidnm_unload32(3fml)
フィールド表からヘッダー・ファイルに変換する
すでに説明したとおり、mkfldhdr (またはmkfldhdr32)コマンドを実行すると、フィールド表がCコンパイラ処理に対応したヘッダー・ファイルに変換されます。生成されたヘッダー・ファイルの各行の形式は、次のとおりです。
#define fname fieldid
fnameにはフィールド名を指定し、fieldidにはフィールド識別子を指定します。フィールド識別子は、エンコードされたフィールド型とフィールド番号で構成されます。フィールド番号は絶対数、つまりbaserel-numberを足した数です。生成されたファイルは、Cプログラムに組み込むことができます。
「フィールドをC構造体およびCOBOLレコードにマッピングする」で説明するとおり、実行時のマッピング関数を使用する場合、ヘッダー・ファイルを使用する必要はありません。
コンパイル時にファイル名を識別子にマッピングすると、処理を高速化でき、データ領域が少なくて済むという利点があります。逆に、サービス・ルーチンのコンパイル後にフィールド名と識別子のマッピングが変更されると、サービス・ルーチンに伝播されないという欠点があります。(このような場合、サービス・ルーチンはコンパイル済のマッピングを使用します。)
mkfldhdrコマンドを実行すると、FIELDTBLS環境変数で指定された各フィールド表が、対応するヘッダー・ファイルに変換されます。ヘッダー・ファイル名は、フィールド表名に.hという接尾辞を付けて指定します。生成されたヘッダー・ファイルは、デフォルトでカレント・ディレクトリに保存されます。別のディレクトリに保存したい場合は、mkfldhdrコマンドで-dオプションを使用して、保存先ディレクトリを指定します。詳細は、『Oracle Tuxedoコマンド・リファレンス』mkfldhdr、mkfldhdr32(1)に関する項を参照してください。
フィールド表からヘッダー・ファイルへの変換例
例1および2は、環境変数を設定してmkfldhdr(1)コマンドを実行する方法を示しています。ここでは、3つのフィールド表ファイル(${FLDTBLDIR}/maskftbl${FLDTBLDIR}/DBftbl${FLDTBLDIR}/miscftbl)が処理され、3つのインクルード・ファイル(maskftbl.hDBftbl.hmiscftbl.h)がカレント・ディレクトリに生成されます。詳細は、『Oracle Tuxedoコマンド・リファレンス』mkfldhdr、mkfldhdr32(1)に関する項を参照してください。
例1
FLDTBLDIR=/project/fldtbls
FIELDTBLS=maskftbl,DBftbl,miscftbl
export FLDTBLDIR FIELDTBLS
mkfldhdr
例2
FLDTBLDIR32=/project/fldtbls
FIELDTBLS32=maskftbl,DBftbl,miscftbl
export FLDTBLDIR32 FIELDTBLS32
mkfldhdr32
例3
例3は例1と同じですが、出力ファイル(maskftbl.hDBftbl.hmiscftbl.h)が${FLDTBLDIR}で指定されたディレクトリに保存される点だけが異なります。
FLDTBLDIR=/project/fldtbls
FIELDTBLS=maskftbl,DBftbl,miscftbl
export FLDTBLDIR FIELDTBLS
mkfldhdr -d${FLDTBLDIR}
mkfldhdr -d${FLDTBLDIR}
環境変数をオーバーライドしてmkfldhdrを実行する
mkfldhdrのコマンド行でフィールド表の名前を指定し、環境変数をオーバーライドする(または環境変数を設定しない)ことができます。
ただし、この方法は実行時マッピングの関数に対しては適用できません。実行時マッピングの関数が使用されている場合、FLDTBLDIRがカレント・ディレクトリと見なされ、FIELDTBLSはユーザーがコマンド行で指定したパラメータの一覧と見なされます。たとえば、次のコマンド:
mkfldhdr myfields
は、フィールド表ファイルmyfieldsをフィールド・ヘッダー・ファイルmyfields.hに変換し、そのヘッダー・ファイルをカレント・ディレクトリに格納します。
詳細は、『Oracle Tuxedoコマンド・リファレンス』mkfldhdr、mkfldhdr32(1)に関する項を参照してください。
フィールドをC構造体およびCOBOLレコードにマッピングする
このトピックには次の項が含まれます:
VIEWS機能とは
FML VIEWSは、フィールド化バッファとC構造体、またはフィールド化バッファとCOBOLレコードの間でデータを交換するためのメカニズムです。この機能は、時間のかかるデータ操作を、C関数を使用してC構造体で行うために用意されています。この方が、FML関数を使用してフィールド化バッファでデータを操作するより効率的です。また、VIEWSを使用して、COBOLプログラムでFMLフィールド化レコードを扱うCプログラムとメッセージを送受信する方法としても使用できます。
この項では、VIEWSを使用してフィールド化バッファとC構造体をマッピングする方法を説明します。
VIEWSの構造
次の図は、VIEWSの構成要素とそれらの相互関係を示しています。
図5-1 VIEWS機能の構成要素
VIEWファイルを作成する
ソースVIEWファイルは、viなどの任意のテキスト・エディタで作成する標準テキスト・ファイルです。このファイルには、1つまたは複数のソースVIEW記述(フィールドから構造体への実際のマッピング情報)が格納されています。
VIEWコンパイラの最も重要な役割は、オブジェクトVIEWファイルを生成することです。このファイルには、コンパイル済のオブジェクトVIEW記述が含まれています。オブジェクトVIEWファイルは逆に、VIEW逆アセンブラ(viewdisまたはviewdis32)での入力として使用できます。VIEW逆アセンブラを使用すると、オブジェクトVIEW記述をソース形式に戻し、内容を検証したり、編集することができます。詳細は、『Oracle Tuxedoコマンド・リファレンス』viewdis、viewdis32(1)に関する項を参照してください。
ソースVIEW記述を作成および編集し、viewdisの出力を編集することができます。コンパイル済のVIEW記述(バイナリ形式)を直接読み取ることはできません。
VIEWファイルには、VIEW記述のほかに#または$で始まるコメント行を格納できます。#で始まる空白行は、VIEWコンパイラによって無視されますが、$で始まる行は、VIEWコンパイラが生成するヘッダー・ファイルに渡すことができます。この規則によって、Cのコメントなどのwhatの文字列をVIEWコンパイラが生成するCヘッダー・ファイルに渡すことができます。
注意:
この規則は、COBOLには適用されません。したがって、$で始まる行はCOBOL COPYファイルには渡されません。
VIEW記述を作成する
ソースVIEWファイル内の各ソースVIEW記述は、次の3つの部分で構成されています。
キーワードVIEWで始まり(接尾辞「32」は付かない)、続いてVIEW記述の名前が指定された行。この名前は、英数字とアンダースコアで構成されます。viewcに指定できる最大文字数は33文字ですが、tpalloc(3c)が受け付けるサブタイプの最大文字数が16文字であるため、実際に指定できる最大文字数は16文字です。
メンバー記述の一覧
キーワードENDで始まる行
VIEW記述の最初の行は、「VIEW」というキーワードで始まり、続いてVIEW記述の名前が指定されます。メンバー記述(マッピング・エントリ)は、C構造体またはCOBOLレコードのメンバーに関する情報を含む行です。キーワードENDで始まる行は、VIEW記述の最後の行です。
次のリストは、一般的なソースVIEW記述の内容です。
リスト5-2 VIEW記述のソース
VIEW vname
# type cname fbname count flag size null
# ---- ----- ------ ----- ---- ---- ----
--------------member descriptions-------------------
.
.
.
END
 
前記のリストでは:
vnameには、VIEW記述の名前を指定します。この名前は、C構造体の名前としても使用されるので、有効なC識別名を指定する必要があります。アンダースコアは、COBOL COPYファイルでは自動的にダッシュ(-)にマッピングされます。
typeは、メンバーの型を示します。指定できる型は、intshortlongcharfloatdoublestringcarray、またはdec_tのいずれかです。typeの値が「-」の場合、デフォルトであるfbnameの値が使用されます。
cnameには、構造体メンバーの識別子を指定します。これは、C構造体メンバーの名前なので、有効なC識別名にする必要があります。cnameは内部で30文字以降が切り捨てられるので、cnamesの最初の30文字が一意でなければなりません。アンダースコアは、COBOL COPYファイルでは自動的にダッシュ(-)にマッピングされます。
fbnameには、フィールド化バッファのフィールド名を指定します。フィールド表ファイルにある名前を指定します。
countには、割り当てる要素の数(このメンバーに格納されるオカレンスの最大数)を指定します。FMLでは65,535以下、FML32では2,147,483,647以下の数値を指定します。
flagには、カンマで区切ったオプションのリスト、または「-」(オプションが設定されていない場合)を指定します。詳細は、「VIEW記述でのフラグ・オプションを指定する」を参照してください。
sizeには、タイプがstringcarray、またはdec_tである場合のメンバーのサイズを指定します。その他のフィールド・タイプでは、「-」を指定します。この場合はVIEWコンパイラがサイズを計算します。
stringまたはcarrayの場合、sizeの値には、FMLでは65,535以下、FML32では2,147,483,647以下の数値を指定します。
typeがdec_tの場合、sizeには、カンマで区切って指定した2つの数値を指定します。最初の数字は小数値のバイト数を表します。0より大きく10より小さくする必要があります。2番目の数字は小数点の右側の小数の位置を表します。0よりも大きく、バイト数の2倍から1を引いた数字よりも小さくする必要があります。
nullには、ユーザーが定義したNULL値を指定します。「-」を指定すると、該当するフィールドのデフォルトのNULL値に設定されます。詳細は、「VIEWSでNULL値を使用する」を参照してください。
VIEW記述でのフラグ・オプションを指定する
以下は、VIEW記述内のメンバー記述のflag要素として指定できるオプションです。
C
このオプションは、メンバー記述で記述された構造体メンバーに加えて、連想カウント・メンバー(ACM: Associated Count Member)と呼ばれる構造体メンバーの生成をリクエストします。
フィールド化バッファから構造体へのデータ転送時には、構造体内の各ACMは対応する構造体メンバーに転送されたオカレンスの数に設定されます。
ACMの値0は、対応する構造体メンバーにフィールドが転送されなかったことを示します。
正の値は、構造体メンバーの配列に実際に転送されたフィールドの数を示します。
負の値は、構造体メンバーの配列に転送できる数以上のフィールドがバッファ内にあったことを示します。この場合、ACMの絶対値と構造体に転送されないフィールド数は同じです。
構造体メンバーの配列からフィールド化バッファへのデータ転送時には、ACMを使用して転送すべき配列要素の数を指定します。たとえば、あるメンバーのACMがNに設定されている場合は、最初のN個のNULL以外のフィールドがフィールド化バッファに転送されます。Nが配列のサイズより大きい場合、Nはデフォルトで配列のサイズに設定されます。どちらの場合も、転送後、ACMはフィールド化バッファに転送される配列のメンバーの実際の数に設定されます。
ACMの型は、FMLではshort型、FML32ではlong型としてCヘッダー・ファイルで宣言され、C_cnameという名前が生成されます。cnameは、ACMが宣言されたcnameエントリです。たとえば、partsという名前のメンバーのACMは、次のように宣言されます。
short C_parts;
COBOL COPYファイルでは、C-cnameという名前が生成され、型は次のように宣言されます。
FMLの場合: PIC S9(4) USAGE COMP-5
FML32の場合: PIC S9(9) USAGE COMP-5
注意:
生成されたACM名と接頭辞C_で始まる名前の構造体メンバーが競合する場合があります。VIEWコンパイラは、このような競合を致命的なエラーとして報告します。たとえば、構造体メンバーのC_partsという名前は、メンバーpartsに対して生成されるACM名と競合します。
F
このオプションは、構造体からフィールド化バッファへの一方向のマッピングを指定します。このオプションによるメンバーのマッピングは、構造体からフィールド化バッファへのデータ転送時のみ有効です。このオプションは、-nコマンド行オプションを指定した場合は無視されます。
L
このオプションは、carray型またはstring型のメンバー記述に対してのみ使用され、これらのフィールドが可変長の場合に転送されるバイト数を示します。carrayフィールドまたはstringフィールドを常に固定長データ項目として使用する場合、このオプションを指定する利点はありません。
Lオプションは、carray型またはstring型の構造体メンバーに対応する連想長メンバー(ALM: Associated Length Member)を生成します。フィールド化バッファから構造体へのデータ転送時には、ALMは、対応する転送フィールドの長さに設定されます。フィールド化バッファ内のフィールドの長さがマッピングされた構造体メンバーに割り当てられた領域を超える場合は、割り当てられたバイト数のみが転送されます。対応するALMは、フィールド化バッファ項目のサイズに設定されます。したがって、ALMが構造体メンバーの配列サイズより大きい場合、フィールド化バッファ情報は転送時に切り捨てられます。
構造体メンバーからフィールド化バッファのフィールドにデータを転送する場合、そのフィールドがcarray型であれば、ALMを使用してフィールド化バッファに転送するバイト数を指定します。string型のフィールドの場合、ALMは転送時に無視されますが、転送後、転送されたバイト数に設定されます。carrayフィールドには長さ0も指定できます。ALMが0の場合は、関連する構造体メンバーの値がNULL値でない限り、フィールド化バッファに長さ0のフィールドが転送されます。
ALMの型は、FMLではunsigned short型、FML32ではunsigned long型としてCヘッダー・ファイルで定義され、L_cnameという名前が生成されます。cnameは、ALMが宣言された構造体の名前です。
ALMが宣言されたメンバーのオカレンス数が1の場合(またはデフォルトが1の場合)、ALMは次のように宣言されます。
unsigned short L_cname;
一方、オカレンス数が1より大きい場合(N)、ALMは次のように宣言されます。
unsigned short L_cname[N];
これはALM配列と呼ばれます。このような場合は、ALM配列内の各要素は構造体メンバー(またはフィールド)の対応するオカレンスを参照します。COBOL COPYファイルでは、FMLはPIC 9(4) USAGE COMP-5型、FML32はPIC 9(9) USAGE COMP-5型として宣言され、L-cnameという名前が生成されます。メンバーが複数回発生する場合は、COBOLのOCCURS句を使用して複数のオカレンスを定義します。
注意:
生成されたALM名と接頭辞L_で始まる名前の構造体メンバーが競合する場合があります。VIEWコンパイラは、このような競合を致命的なエラーとして報告します。たとえば、構造体メンバーのL_partsという名前は、メンバーpartsに対して生成されるALM名と競合します。
N
ゼロ方向マッピングを指定します。C構造体にフィールド化バッファはマッピングされません。このオプションは、C構造体またはCOBOLレコードに充填文字を割り当てるときに使用することができます。このオプションは、-nコマンド行オプションが指定された場合は無視されます。
P
このオプションは、string型およびcarray型の構造体メンバーのNULL値としてVIEWが解釈する内容を指定します。このオプションを指定しない場合、構造体メンバーの値がユーザー指定のnull値と等しいと(後続のnull文字は考慮しない)、構造体メンバーがnullになります。
一方、このオプションを指定した場合は、ユーザー指定のnull値と構造体メンバーの値が等しく、さらに最後の文字が完全な長さまで及んでいると(後続のnull文字は考慮しない)、構造体メンバーがnullになります。
C構造体またはCOBOLレコードからフィールド化バッファへデータを転送する場合、値がNULLのメンバーは転送先のバッファに送信されません。たとえば、構造体のメンバーTESTcarray[25]型で、ユーザー定義のNULL値「abcde」が指定されているとします。Pオプションを設定しない場合、最初の5文字が順にabcdeであれば、TESTはNULLと見なされます。Pオプションを指定した場合、最初の4文字が順にabcdで、かつcarrayの残りの文字がすべて「e」であれば(eが21個)、TESTはNULLと見なされます。
このオプションは、-nコマンド行オプションを指定した場合は無視されます。
S
このオプションは、フィールド化バッファから構造体への一方向のマッピングを指定します。このオプションを指定したメンバーのマッピングは、フィールド化バッファから構造体へのデータ転送時のみ有効です。このオプションは、-nコマンド行オプションを指定した場合は無視されます。
VIEWSでNULL値を使用する
VIEWSのNULL値は、C構造体またはCOBOLレコードのメンバーが空であることを示すために使用されます。NULL値はデフォルト値として提供されていますが、独自に定義することもできます。
デフォルトのNULL値は、数値型の場合はすべて0 (dec_tの場合は0.0)、char型の場合は “\0"、string型とcarray型の場合は “ “ です。
null値を指定するためにエスケープ規則定数を使用することもできます。VIEWコンパイラで認識されるエスケープ定数は、\ddd (dは8進数)、\0\n\t\v\b\r\f\\\'、および\"です。
string型、carray型、およびchar型のNULL値は、二重引用符または一重引用符で囲みます。VIEWコンパイラは、ユーザー定義のnull値の内部のエスケープされていない引用符は受け付けません。
要素は、値がその要素のNULL値と同じであればNULLになりますが、以下の例外があります。
構造体メンバーにPオプションが設定されており、構造体メンバーの型がstring型またはcarray型である場合。Pオプションの詳細は、前の項を参照してください。
メンバーの型がstring型の場合。メンバーの値はNULL値と同じ文字列でなければなりません。
メンバーの型がcarray型であり、NULL値の長さがNの場合。文字配列内の最初のN個の文字はNULL値と同じでなければなりません。
VIEW記述のnullフィールドにキーワード “NONE"を指定することもできます。これは、そのメンバーに対するnull値がないことを意味します。
string型および文字配列(carray)型のメンバーのデフォルトの最大サイズは、2660文字です。
注意:
string型のメンバーは通常「\0」で終了するため、ユーザー定義のNULL値の最後の文字として「\0」を指定する必要はありません。
VIEWファイルをコンパイルする
FMLではviewc、FML32ではviewc32がVIEWコンパイラ・プログラムです。これらのプログラムは、ソースVIEWファイルを取り込み、オブジェクトVIEWファイルを生成します。生成されたオブジェクトVIEWファイルは実行時に解釈され、データの実際のマッピングに影響を与えます。実行時には、viewcに対してCコンパイラを使用する必要があります。コマンド行は、次のようになります。
viewc [-n] [-d viewdir] [-C] viewfile [viewfile . . . ]
このコマンド行のviewfileは、ソースVIEW記述を含むソースVIEWファイルの名前です。コマンド行には、1つまたは複数のviewfileを指定できます。
-Cオプションを指定すると、viewfileで定義した各VIEWに対してCOBOL COPYファイルが1つ作成されます。これらのコピー・ファイルはカレント・ディレクトリに作成されます。
-nオプションを使用すると、FMLバッファにマップしないC構造体またはCOBOLレコードのVIEW記述ファイルをコンパイルできます。
デフォルトでは、viewfileのすべてのVIEWがコンパイルされ、複数のファイルが作成されます。つまり、VIEWファイルごとにオブジェクトVIEWファイル(接尾辞「V」)とヘッダー・ファイル(接尾辞「h」)が作成されます。VIEWSの構成要素については、「VIEWS機能の構成要素」の図を参照してください。
オブジェクトVIEWファイルの名前はviewfile.Vとなります。それは、カレント・ディレクトリに作成されます。-dオプションを指定して別のディレクトリを指定することもできます。ヘッダー・ファイルは、カレント・ディレクトリ内に作成されます。
注意:
Windowsのように、大文字と小文字を区別しないオペレーティング・システムの場合、オブジェクトVIEWファイルには.vvという接尾辞が付きます。
詳細は、『Oracle Tuxedoコマンド・リファレンス』viewc、viewc32(1)に関する項を参照してください。
viewcを使ってコンパイルしたヘッダー・ファイルを使用する
VIEWコンパイラ(viewc)を使用して作成したヘッダー・ファイルを任意のCアプリケーション・プログラム内で使用すると、VIEWで記述したC構造体を宣言できます。たとえば、次のようなVIEW記述:
VIEW test
#TYPE CNAME FBNAME COUNT FLAG SIZE NULL
int empid EMPID 1 - - -1
float salary EMPPAY 1 - - 0
long phone EMPPHONE 4 - - 0
string name EMPNAME 1 - 32 "NO NAME"
END
は、次のようなCヘッダー・ファイルを作成します:
struct test {
long empid; /* null=-1 */
float salary; /* null=0.000000 */
long phone[4]; /* null=0 */
char name[32]; /* null="NO NAME" */
};
詳細は、『Oracle Tuxedoコマンド・リファレンス』viewc、viewc32(1)に関する項を参照してください。
VIEWコンパイラを使って作成したCOBOL COPYファイルを使用する
-Cオプションを使用してVIEWコンパイラで作成したCOBOL COPYファイルを任意のCOBOLアプリケーション・プログラムで使用すると、VIEWで記述したCOBOLレコードを宣言できます。たとえば、前の項に示したVIEW記述のCOBOL COPYファイルは、TEST.cblファイルでは次のようになります。
* VIEWFILE: "test.v"
* VIEWNAME: "test"
05 EMPID PIC S9(9) USAGE IS COMP-5.
05 SALARY USAGE IS COMP-1.
05 PHONE OCCURS 4 TIMES PIC S9(9) USAGE IS COMP-5.
05 NAME PIC X(32).
COPYファイルの名前は、VIEWコンパイラによって自動的に大文字に変換されます。COPYファイルは、次のようにCOBOLプログラムに組み込まれます。
01 MYREC COPY TEST.
COPYファイルの出力の詳細は、『COBOLを使用したOracle Tuxedo ATMIアプリケーションのプログラミング』を参照してください。
コンパイル後にVIEWファイルの情報を表示する
VIEW逆アセンブラであるviewdisは、VIEWコンパイラで生成されたオブジェクトVIEWファイルを逆アセンブルし、ソースVIEWファイルの形式でVIEW情報を表示します。また、対応する構造体メンバーのオフセットも表示します。
この形式の情報を参照できると、オブジェクトVIEW記述が正確かどうかを検証するのに役立ちます。
VIEW逆アセンブラを実行するには、次のコマンドを入力します。
viewdis objviewfile . . .
デフォルトでは、カレント・ディレクトリ内のobjviewfileが逆アセンブルされます。このファイルをカレント・ディレクトリで検索できないと、エラー・メッセージが表示されます。コマンド行には、1つまたは複数のオブジェクトVIEWファイルを指定できます。
viewdisの出力は、元のソース表示の記述に似ているように見えます。編集可能で、viewcに再入力できます。viewdisの出力に表示される行の順序は、元のソースVIEW記述の順序と異なる場合がありますが、順序が違ってもオブジェクトVIEWファイルの正確性とは関係ありません。
詳細は、『Oracle Tuxedoコマンド・リファレンス』viewdis、viewdis32(1)に関する項を参照してください。

Copyright ©1994, 2017,Oracle and/or its affiliates. All rights reserved