![]() |
![]() |
|
|
変換を行う関数
FML には、フィールド化バッファの読み取りまたは書き込み時にデータを変換する一連のルーチンが用意されています。
一般に、これらのルーチンは、対応する非変換関数と同じように動作します。ただし、バッファへの書き込み時にはユーザ型からネイティブ型へ変換を行い、バッファからの読み取り時にはネイティブ型からユーザ型への変換を行います。
フィールドのネイティブ型は、そのフィールド・テーブル・エントリ内でそのフィールドに対して指定され、そのフィールド識別子内で符号化されたデータ型です。ただし、上記の規則に対する唯一の例外として CFfindocc があります。この関数は、読み取り操作を行いますが、ユーザ型からネイティブ型に変換を行ってから Ffindocc を呼び出します。これらの関数の名前は、接頭辞「C」が付いた、対応する非変換 FML 関数と同じです。
変換を行う関数では、ポインタ (FLD_PTR)、埋め込み型の FML32 バッファ (FLD_FML32)、および埋め込み型の VIEW32 バッファ (FLD_VIEW32) はサポートされていません。FML32 変換関数の実行中にこれらのフィールド型が使用されていた場合、Ferror が FEBADOP に設定されます。
CFadd
CFadd は、バッファにユーザ指定の項目を追加して、バッファ内に新しいフィールド・オカレンスを生成します。
int
CFadd(FBFR *fbfr, FLDID fieldid, char *value, FLDLEN len, int type)
以下はパラメータの説明です。
フィールドを追加する前に、データ項目は、ユーザ指定の型からフィールドをフィールド化バッファに格納される型としてフィールド・テーブル内で指定された型に変換されます。ソースが FLD_CARRAY 型 (文字配列) である場合は、len 引数を配列の長さに設定する必要があります。次の例を参照してください。
if(CFadd(fbfr,ZIP,"12345",(FLDLEN)0,FLD_STRING) < 0)
F_error("pgm_name");
上記の例では、ZIP (郵便番号) フィールドが long 型整数としてフィールド化バッファ内に格納されている場合は、「12345」が long 型整数の表現に変換されてから、その表現が fbfr の指すフィールド化バッファに追加されます (ただし、フィールド値の長さは、関数が決定できるので 0 に指定されています。この長さは、FLD_CARRAY 型の場合のみ必要です)。以下の例は、同じ値をフィールド化バッファに格納しますが、その値を string 型としてではなく long 型として表現して格納します。
long zipval;
. . .
zipval = 12345;
if(CFadd(fbfr,ZIP,&zipval,(FLDLEN)0,FLD_LONG) < 0)
F_error("pgm_name");
ただし、C では構造体 &12345L を使用できないので、まず、値を変数に格納する必要があります。CFadd は、成功すると 1 を返し、エラーになると -1 を返します (Ferror は、適宜に設定されます)。
詳細については、『BEA Tuxedo FML リファレンス』の「CFadd、CFadd32(3fml)」を参照してください。
CFchg
CFchg は、CFadd と同じように動作しますが、指定された値の変換後、フィールド値を変更します。
int
CFchg(FBFR *fbfr, FLDID fieldid, FLDOCC oc, char *value, FLDLEN len, int type)
以下はパラメータの説明です。
たとえば、次のコードは、フィールド ZIP の最初のオカレンス (オカレンス 0) を指定された値に変更し、必要に応じて変換を行います。
FLDOCC occurrence;
long zipval;
. . .
zipval = 12345;
occurrence = 0;
if(CFchg(fbfr,ZIP,occurrence,&zipval,(FLDLEN)0,FLD_LONG) < 0)
F_error("pgm_name");
指定されたオカレンスが見つからないと、指定されたオカレンスとして値を追加できるまで、NULL オカレンスがバッファに追加されます。
詳細については、『BEA Tuxedo FML リファレンス』の「CFchg、CFchg32(3fml)」を参照してください。
CFget
CFget は、Fgetに似た変換関数です。ただし、CFgetは変換した値をユーザ指定のバッファにコピーします。
int
CFget(FBFR *fbfr, FLDID fieldid, FLDOCC oc, char *buf, FLDLEN *len, int type)
以下はパラメータの説明です。
前の例を使って、次のコードは、バッファに格納されたばかりの値 (どのような形式の値でも可) にアクセスして、その値を元の long 型整数に戻します。
FLDLEN len;
. . .
len=sizeof(zipval);
if(CFget(fbfr,ZIP,occurrence,&zipval,&len,FLD_LONG) < 0)
F_error("pgm_name");
長さのポインタが NULL の場合は、検索および変換した値の長さは返されません。
詳細については、『BEA Tuxedo FML リファレンス』の「CFget、CFget32(3fml)」を参照してください。
CFgetalloc
CFgetalloc は、Fgetalloc と同じように動作します。ただし、戻り値 (変換後の値) に対して malloc を使用して割り当てた領域は、free を使用して解放する必要があります。
char*
CFgetalloc(FBFR *fbfr, FLDID fieldid, FLDOCC oc, int type, FLDLEN *extralen)
以下はパラメータの説明です。
上記の例では、CFgetalloc の戻り値として文字ポインタのデータ型 (C の char* ) が示されています。実際に返されるポインタの型は、ポインタが指す値の型と同じです。
以下のコードを使用すると、既に格納されている値を自動的に割り当てられた領域に取り込むことができます。
char *value;
FLDLEN extra;
. . .
extra = 25;
if((value=CFgetalloc(fbfr,ZIP,0,FLD_LONG,&extra)) == NULL)
F_error("pgm_name");
関数呼び出しに値 extra を指定した場合、関数は、取り出した値に十分な領域に加えて、さらに 25 バイトを割り当てます。割り当てられた領域の総量が、この変数に返されます。
詳細については、『BEA Tuxedo FML リファレンス』の「CFgetalloc、CFgetalloc32(3fml)」を参照してください。
CFfind
CFfind は、検索対象のフィールドの値を変換し、その値に対するポインタを返します。
char*
CFfind(FBFR *fbfr, FLDID fieldid, FLDOCC oc, FLDLEN len, int type)
以下はパラメータの説明です。
上記の例では、CFfind の戻り値として、文字ポインタのデータ型 (C の char*) が示されています。実際に返されるポインタの型は、ポインタが指す値の型と同じです。
この関数が返すポインタは、Ffind の場合と同じく、読み取り専用と見なされます。たとえば、次のコードは、ZIP フィールドの最初のオカレンスの値を含む long 型に対するポインタを返します。
char *CFfind;
FLDLEN len;
long *value;
. . .
if((value=(long *)CFfind(fbfr,ZIP,occurrence,&len,FLD_LONG))== NULL)
F_error("pgm_name");
長さに対するポインタが NULL の場合、検出された値の長さは返されません。この関数の戻り値は、Ffindの場合と異なり、対応するユーザ指定の型の境界に正しく調整されます。
注記 CFfind が返すポインタは、次のバッファ操作 (破壊的でない操作も含む) が実行されるまで有効です。これは、変換後の値が 1 つのプライベート・バッファに保存されているためです。一方、Ffind の戻り値の場合は、次にバッファが変更されるまで有効です。
詳細については、『BEA Tuxedo FML リファレンス』の「CFfind、CFfind32(3fml)」を参照してください。
CFfindocc
CFfindocc は、バッファの指定されたフィールドのオカレンスを調べ、フィールド識別子の型に変換されたユーザ指定のフィールド値と一致する最初のフィールド・オカレンスのオカレンス番号を返します。
FLDOCC
CFfindocc(FBFR *fbfr, FLDID fieldid, char *value, FLDLEN len, int type)
以下はパラメータの説明です。
たとえば、次のコードは、文字列を fieldid ZIP の型 (おそらく long 型) に変換し、oc を指定された郵便番号のオカレンスに設定します。
#include "fldtbl.h"
FBFR *fbfr;
FLDOCC oc;
char zipvalue[20];
. . .
strcpy(zipvalue,"123456");
if((oc=CFfindocc(fbfr,ZIP,zipvalue,0,FLD_STRING)) < 0)
F_error("pgm_name");
フィールド値が見つからない場合は、-1 が返されます。
注記 CFfindocc は、ユーザ指定の値をネイティブ・フィールド型に変換してから、フィールド値を検証するため、正規表現は、ユーザ指定の型とネイティブ・フィールド型が両方とも FLD_STRING である場合のみ機能します。したがって、CFfindocc には、正規表現に関するユーティリティがありません。
詳細については、『BEA Tuxedo FML リファレンス』の「CFfindocc、CFfindocc32(3fml)」を参照してください。
![]() |
![]() |
![]() |
|
Copyright © 2001 BEA Systems, Inc. All rights reserved.
|