![]() |
![]() |
|
|
field_tables(5)
名前
field_tables-フィールド名に対する FML マッピング・ファイル
機能説明
フィールド操作言語 FML の関数は、フィールド化バッファのインプリメントと管理を行います。フィールド化バッファの各フィールドには、short 整数のタグを付けます。可変長フィールド (文字列など) には、長さを示す修飾子を付けます。このように、フィールド化バッファは、数値識別子/データの組み合わせ、または数値識別子/長さ/データの組み合わせから構成されることになります。
フィールドの数値識別子をそのフィールドのフィールド識別子といい、FLDID によりそのタイプを定義します。フィールドの名前は、フィールド・テーブルの FLDID と英数字文字列 (名前) を組み合わせて指定します。
従来の FML インターフェイスは 16 ビットのフィールド識別子、フィールド長、およびバッファ・サイズをサポートします。新しい 32 ビット・インターフェイスである FML32 は、より大きい識別子、フィールドの長さ、およびバッファ・サイズをサポートします。すべてのタイプ、関数名などに、接尾辞として "32" (たとえば、フィールド識別子タイプ定義は FLDID32 です) を付けます。
フィールド識別子
FML の関数では、フィールド値のタイプを決めることができます。現在、次のタイプがサポートされています。char、string、short、long、float、double、carray (文字配列)、ptr (バッファへのポインタ)、FML32 (埋め込み型の FML32 バッファ)、および VIEW32 (埋め込み型の VIEW32 バッファ)。ptr、FML32、および VIEW32 型は、FML32 インターフェイスでのみサポートされています。各種のフィールド・タイプの定数は fml.h (FML32 では fml32.h) に定義されています。フィールド化バッファは完全な自己記述型であるため、フィールドのタイプは、FLDID でエンコードすることによりフィールドと共に渡されます。このため、FLDID は、フィールド・タイプとフィールド番号という 2 つの要素から構成されます。フィールド番号は、100 よりも大きくなければなりません。これは、1 から 100 までの番号はシステムが使用するために予約されているからです。
フィールド・マッピング
効率を考えると、コンパイル時にフィールド名からフィールド識別子への変換が行われることが望まれます。また、便利さを考えれば、この変換が実行時に行われるとよいでしょう。この双方の目的を満たすために、FML は、テキスト・ファイルにフィールド・テーブルを保持させ、また、対応する C ヘッダ・ファイルを生成するコマンドを提供しています。このため、コンパイル時のマッピングは、C プリプロセッサ cpp により通常の #define マクロを介して行われ、実行時マッピングは関数 Fldid() (FML32 では Fldid32()) により行われます。この関数は、ソース・フィールド・テーブル・ファイルを参照して、その引数 (フィールド名) をフィールド識別子にマップするものです。
フィールド・テーブル・ファイル
フィールド・テーブルを格納しているファイルの形式は以下の通りです。
name rel-numb type
ここで、
エントリは空白類 (タブとスペースを任意に組み合わせたもの) で区切ります。
フィールド・テーブルからヘッダ・ファイルへの変換
コマンド mkfldhdr (または mkfldhdr32) は、上述したように、フィールド・テーブルを C コンパイラで処理できるようなファイルに変換します。生成されたヘッダ・ファイルの各行の形式は次のようになります。
#define name fldid
ここで、name は、フィールドの名前で、fldid はそのフィールド識別子です。このフィールド識別子は、前述したように、フィールド・タイプとフィールド番号から構成されています。フィールド番号は、ベース値に相対番号を加えた絶対番号です。このようにして、C プログラムに組み込むことができるファイルが生成されます。
環境変数
フィールド・テーブルにアクセスする Fldid() などの関数と、それらを使用する mkfldhdr() および vuform() などのコマンドを使用する場合、メモリ内のフィールド・テーブルを作成するために、シェル変数 FLDTBLDIR と FIELDTBLS (FML32 では FLDTBLDIR32 と FIELDTBLS32) にそれぞれ、ソース・ディレクトリとソース・ファイルを指定しておく必要があります。FIELDTBLS は、フィールド・テーブル・ファイル名の、カンマで区切られたリストを指定します。FIELDTBLS に値がない場合は、フィールド・テーブル・ファイルの名前として fld.tbl が使用されます。FLDTBLDIR 環境変数は、コロンで区切られたディレクトリのリストであり、この中から名前が絶対パス名でないフィールド・テーブルが検索されます。(フィールド・テーブルの検索は、PATH 変数を使用する実行可能コマンドの検索とほぼ同じです)。FLDTBLDIR が定義されていない場合は、カレント・ディレクトリであるとみなされます。したがって、FIELDTBLS と FLDTBLDIR が設定されていない場合は、省略時設定としてカレント・ディレクトリから fld.tbl がとられます。
フィールドをグループ ( アプリケーションによってのみ使用されるデータベースのフィールドのグループなど) に分けるには、複数のフィールド・テーブルを使用すると便利です。ただし、フィールド・テーブルは C ヘッダ・ファイルに変換される可能性があり (mkfldhdr コマンドによって)、同一のフィールド名があるとコンパイラ名の矛盾を示す警告が出されるため、一般にフィールド名は、フィールド・テーブル全体に渡って一意であるようにします。また、関数 Fldid は、名前を FLDID にマップしますが、その際、複数のテーブルを検索します。最初に一致するものが見つかった時点で検索は終了します。
使用例
ベース値が 500 から 700 に移る場合の、フィールド・テーブルの例を以下に示します。
# employee ID fields are based at 500
*base 500
#name rel-numb type comment
#---- -------- ---- -------
EMPNAM 1 string emp's name
EMPID 2 long emp's id
EMPJOB 3 char job type:D,M,F or T
SRVCDAY 4 carray service date
# address fields are based at 700
*base 700
EMPADDR 1 string street address
EMPCITY 2 string city
EMPSTATE 3 string state
EMPZIP 4 long zip code
関連するヘッダ・ファイルは次のようになります。
#define EMPADDR ((FLDID)41661) /* number:701 type:string */
#define EMPCITY ((FLDID)41662) /* number:702 type:string */
#define EMPID ((FLDID)8694) /* number:502 type:long */
#define EMPJOB ((FLDID)16887) /* number:503 type:char */
#define EMPNAM ((FLDID)41461) /* number:501 type:string */
#define EMPSTATE ((FLDID)41663) /* number:703 type:string */
#define EMPZIP ((FLDID)8896) /* number:704 type:long */
#define SRVCDAY ((FLDID)49656) /* number:504 type:carray */
関連項目
『FML を使用した BEA Tuxedo アプリケーションのプログラミング』
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|