FMLフィールド化バッファを操作したり、VIEWS関数を使用して構造体とフィールド化バッファ間でフィールドを移動するには、次の準備作業が必要です。
この章では、これらの内容と、関連する処理について説明します。
フィールド識別子(fieldid
)は、typedef
によりFLDID
(FML32の場合はFLDID32
)として定義されます。フィールド識別子は、フィールド型とフィールド番号で構成されます。フィールド番号は、フィールドを識別するための一意の番号です。
フィールド番号0および対応するフィールド識別子0は、不正なフィールド識別子(BADFLDID
)を示すために予約されています。フィールド機能を備えた別のソフトウェアを使用してFMLを操作する場合は、フィールド番号に関する別の制約が適用されることがあります。
Oracle Tuxedoシステムは、フィールド番号に関する以下の規則に従っています。
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
は、フィールドの型を示します。指定できる型は、short
、long
、float
、double
、char
、string
、carray
、mbstring
、ptr
、fml32
、またはview32
のいずれかです。flag
フィールドは、将来使用するために予約されています。このフィールドにはダッシュ(-
)を指定してください。comment
は、フィールドの内容を説明するためのオプションのフィールドです。次のリストは、基数が500から700にシフトするフィールド表の例です。基数が500のグループの場合、最初のフィールド番号は501です。基数が700のグループの場合、最初のフィールド番号は701です。
# 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);
. . .
フィールド識別子からフィールド名へのマッピングは、ほとんど使用されません。フィールド識別子がわかっており、その識別子から対応する名前を確認するケースはほとんどないためです。フィールド識別子からフィールド名へのマッピングを行う例は、バッファの出力ルーチンです。バッファの出力ルーチンでは、フィールド化バッファの内容を、理解できる形式で表示する必要があります。
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の環境設定」を参照してください。)
すでに説明したとおり、mkfldhdr
(またはmkfldhdr32
)コマンドを実行すると、フィールド表がCコンパイラ処理に対応したヘッダー・ファイルに変換されます。生成されたヘッダー・ファイルの各行の形式は、次のとおりです。
#definefname
fieldid
fname
にはフィールド名を指定し、fieldid
にはフィールド識別子を指定します。フィールド識別子は、エンコードされたフィールド型とフィールド番号で構成されます。フィールド番号は絶対数、つまりbase
にrel-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.h
、DBftbl.h
、miscftbl.h
)がカレント・ディレクトリに生成されます。詳細は、『Oracle Tuxedoコマンド・リファレンス』の「mkfldhdr、mkfldhdr32(1)」を参照してください。
FLDTBLDIR=/project/fldtbls
FIELDTBLS=maskftbl,DBftbl,miscftbl
export FLDTBLDIR FIELDTBLS
mkfldhdr
FLDTBLDIR32=/project/fldtbls
FIELDTBLS32=maskftbl,DBftbl,miscftbl
export FLDTBLDIR32 FIELDTBLS32
mkfldhdr32
例3は例1と同じですが、出力ファイル(maskftbl.h
、DBftbl.h
、miscftbl.h
)が${FLDTBLDIR}
で指定されたディレクトリに保存される点だけが異なります。
FLDTBLDIR=/project/fldtbls
FIELDTBLS=maskftbl,DBftbl,miscftbl
export FLDTBLDIR FIELDTBLS
mkfldhdr -d${FLDTBLDIR}
mkfldhdr -d${FLDTBLDIR}
mkfldhdr
のコマンド行でフィールド表の名前を指定し、環境変数をオーバーライドする(または環境変数を設定しない)ことができます。
ただし、この方法は実行時マッピングの関数に対しては適用できません。実行時マッピングの関数が使用されている場合、FLDTBLDIR
がカレント・ディレクトリと見なされ、FIELDTBLS
はユーザーがコマンド行で指定したパラメータの一覧と見なされます。たとえば、次のコマンド:
mkfldhdr myfields
は、フィールド表ファイルmyfields
をフィールド・ヘッダー・ファイルmyfields.h
に変換し、そのヘッダー・ファイルをカレント・ディレクトリに格納します。
詳細は、『Oracle Tuxedoコマンド・リファレンス』の「mkfldhdr、mkfldhdr32(1)」を参照してください。
FML VIEWSは、フィールド化バッファとC構造体、またはフィールド化バッファとCOBOLレコードの間でデータを交換するためのメカニズムです。この機能は、時間のかかるデータ操作を、C関数を使用してC構造体で行うために用意されています。この方が、FML関数を使用してフィールド化バッファでデータを操作するより効率的です。また、VIEWSを使用して、COBOLプログラムでFMLフィールド化レコードを扱うCプログラムとメッセージを送受信する方法としても使用できます。
この項では、VIEWSを使用してフィールド化バッファとC構造体をマッピングする方法を説明します。
次の図は、VIEWSの構成要素とそれらの相互関係を示しています。
ソース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記述は、次の3つの部分で構成されています。
VIEW
で始まり(接尾辞「32」
は付かない)、続いてVIEW記述の名前が指定された行。この名前は、英数字とアンダースコアで構成されます。viewc
に指定できる最大文字数は33文字ですが、tpalloc(3c)が受け付けるサブタイプの最大文字数が16文字であるため、実際に指定できる最大文字数は16文字です。END
で始まる行 各VIEW
記述の最初の行は、「VIEW」というキーワードで始まり、続いてVIEW記述の名前が指定されます。メンバー記述(マッピング・エントリ)は、C構造体またはCOBOLレコードのメンバーに関する情報を含む行です。キーワードEND
で始まる行は、VIEW記述の最後の行です。
VIEW vname
# type cname fbname count flag size null
# ---- ----- ------ ----- ---- ---- ----
--------------member descriptions-------------------
.
.
.
END
vname
には、VIEW記述の名前を指定します。この名前は、C構造体の名前としても使用されるので、有効なC識別名を指定する必要があります。アンダースコアは、COBOL COPYファイルでは自動的にダッシュ(-)にマッピングされます。type
は、メンバーの型を示します。指定できる型は、int
、short
、long
、char
、float
、double
、string
、carray
、または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
には、タイプがstring
、carray
、またはdec_t
である場合のメンバーのサイズを指定します。その他のフィールド・タイプでは、「-」
を指定します。この場合はVIEWコンパイラがサイズを計算します。 null
には、ユーザーが定義したNULL値を指定します。「-」
を指定すると、該当するフィールドのデフォルトのNULL値に設定されます。詳細は、「VIEWSでNULL値を使用する」を参照してください。 以下は、VIEW記述内のメンバー記述のflag
要素として指定できるオプションです。
C
このオプションは、メンバー記述で記述された構造体メンバーに加えて、連想カウント・メンバー(ACM: Associated Count Member)と呼ばれる構造体メンバーの生成をリクエストします。
フィールド化バッファから構造体へのデータ転送時には、構造体内の各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
という名前が生成され、型は次のように宣言されます。
PIC S9(4) USAGE COMP-5
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のメンバーは転送先のバッファに送信されません。たとえば、構造体のメンバーTEST
がcarray[25]
型で、ユーザー定義のNULL値「abcde」
が指定されているとします。P
オプションを設定しない場合、最初の5文字が順にa
、b
、c
、d
、e
であれば、TEST
はNULLと見なされます。P
オプションを指定した場合、最初の4文字が順にa
、b
、c
、d
で、かつcarray
の残りの文字がすべて「e」
であれば(e
が21個)、TEST
はNULLと見なされます。
このオプションは、-n
コマンド行オプションを指定した場合は無視されます。
S
このオプションは、フィールド化バッファから構造体への一方向のマッピングを指定します。このオプションを指定したメンバーのマッピングは、フィールド化バッファから構造体へのデータ転送時のみ有効です。このオプションは、-n
コマンド行オプションを指定した場合は無視されます。
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になりますが、以下の例外があります。
VIEW記述のnullフィールドにキーワード “NONE
"を指定することもできます。これは、そのメンバーに対するnull値がないことを意味します。
string
型および文字配列(carray
)型のメンバーのデフォルトの最大サイズは、2660文字です。
注: | string 型のメンバーは通常「\0」 で終了するため、ユーザー定義のNULL値の最後の文字として「\0」 を指定する必要はありません。 |
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)」を参照してください。
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
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)」を参照してください。
-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逆アセンブラであるviewdis
は、VIEWコンパイラで生成されたオブジェクトVIEWファイルを逆アセンブルし、ソースVIEWファイルの形式でVIEW情報を表示します。また、対応する構造体メンバーのオフセットも表示します。
この形式の情報を参照できると、オブジェクトVIEW記述が正確かどうかを検証するのに役立ちます。
VIEW逆アセンブラを実行するには、次のコマンドを入力します。
viewdis objviewfile . . .
デフォルトでは、カレント・ディレクトリ内のobjviewfile
が逆アセンブルされます。このファイルをカレント・ディレクトリで検索できないと、エラー・メッセージが表示されます。コマンド行には、1つまたは複数のオブジェクトVIEWファイルを指定できます。
viewdis
の出力は、元のソース表示の記述に似ているように見えます。編集可能で、viewc
に再入力できます。viewdis
の出力に表示される行の順序は、元のソースVIEW記述の順序と異なる場合がありますが、順序が違ってもオブジェクトVIEWファイルの正確性とは関係ありません。
詳細は、『Oracle Tuxedoコマンド・リファレンス』の「viewdis、viewdis32(1)」を参照してください。