BEA Logo BEA Tuxedo Release 8.0

  BEA ホーム  |  イベント  |  ソリューション  |  パートナ  |  製品  |  サービス  |  ダウンロード  |  ディベロッパ・センタ  |  WebSUPPORT

 

   Tuxedo ホーム   |   FML を使用した BEA Tuxedo アプリケーションのプログラミング   |   先頭へ   |   前へ   |   次へ   |   目次

 


バッファを更新する関数

この節では、バッファ内の個々のフィールドではなく、フィールド化バッファ全体にアクセスし、内容を更新する関数を説明します。これらの関数では、最大 3 つのパラメータしか使用されません。

Fconcat

Fconcat は、ソース・バッファのフィールドを、既存の宛先バッファのフィールドに追加します。

int
Fconcat(FBFR *dest, FBFR *src)

宛先バッファ内のオカレンスは保持されます。つまり、このオカレンスは変更されません。新しいオカレンス、つまり、ソース・バッファから取得されたオカレンスには、宛先フィールドの既存のオカレンス番号より大きい番号が設定され、宛先バッファに追加されます。フィールドは、フィールド識別子の順序で保持されます。

次の例を参照してください。

FBFR *src, *dest;
. . .
if(Fconcat(dest,src) < 0)
F_error("pgm_name");

dest に 2 つのフィールド (A、B) と 2 つのオカレンスを持つフィールド C があり、src に 3 つのフィールド (A、C、D) があるとします。この結果、dest には、2 つのオカレンスを持つフィールド A (宛先のフィールド A とソースのフィールド A)、フィールド B、3 つのオカレンスを持つフィールド C (dest の 2 つのオカレンスと src のオカレンス)、およびフィールド Dが設定されます。

新しいフィールドを格納できるだけの領域がない場合 (FNOSPACE が返された場合)、この処理は失敗し、宛先バッファは変更されません。

詳細については、『BEA Tuxedo FML リファレンス』の「Fconcat、Fconcat32(3fml)」を参照してください。

Fjoin

Fjoin は、フィールド識別子とオカレンスの組み合わせに基づき、2 つのフィールド化バッファを結合します。

int
Fjoin(FBFR *dest, FBFR *src)

フィールド識別子とオカレンスの組み合わせが一致するフィールド間では、宛先バッファの値がソース・バッファの値で更新されます。ソース・バッファ内に、対応するフィールド識別子とオカレンスの組み合わせがない場合、宛先バッファのフィールドは削除されます。宛先バッファ内に、対応するフィールド識別子とオカレンスの組み合わせがない場合、ソース・バッファ内のフィールドは、宛先バッファに追加されません。次の例を参照してください。

if(Fjoin(dest,src) < 0)
F_error("pgm_name");

Fconcatの例で使用した入力バッファを使用すると、ソース・フィールド値 A とソース・フィールド値 C を持つ宛先バッファが生成されます。新しい値が古い値より大きい場合は、この関数は領域の不足のために失敗することがあります (FNOSPACE)。その場合、宛先バッファは変更されていると予測されます。ただし、この事態が発生した場合、Frealloc関数と Fjoin関数を繰り返し使用すると、宛先バッファを再割り当てできます (宛先バッファが部分的に更新されてしまった場合でも、これらの関数を繰り返し使用すると、正しい結果が得られます)。

バッファの結合によってポインタ・フィールド (FLD_PTR) が削除されると、ポインタが参照するメモリ領域は、変更も解放もされません。

詳細については、『BEA Tuxedo FML リファレンス』の「Fjoin、Fjoin32(3fml)」を参照してください。

Fojoin

FojoinFjoinと似ていますが、ソース・バッファ内に対応する フィールド識別子とオカレンスの組み合わせがない宛先バッファのフィールドの削除は行いません。

int
Fojoin(FBFR *dest, FBFR *src)

宛先バッファ内に対応する フィールド識別子とオカレンスの組み合わせがないソース・バッファ内のフィールドは、宛先バッファに追加されません。次の例を参照してください。

if(Fojoin(dest,src) < 0)
F_error("pgm_name");

Fjoinの例で使用した入力バッファを使用すると、この呼び出しの結果の dest には、ソース・フィールド値 A、宛先フィールド値 B、ソース・フィールド値 C が含まれます。Fjoinの場合のように、Fojoin関数は、領域の不足のために失敗する場合があり (FNOSPACE)、その場合は、領域をさらに割り当てた後で関数を再発行すると、処理を完了できます。

バッファの結合によってポインタ・フィールド (FLD_PTR) が削除されると、ポインタが参照するメモリ領域は、変更も解放もされません。

詳細については、『BEA Tuxedo FML リファレンス』の「Fojoin、Fojoin32(3fml)」を参照してください。

Fproj

Fproj は、目的のフィールドのみが保存されるように、バッファの適切な箇所を更新します(つまり、結果として、指定されたフィールドのプロジェクションが行われます)。バッファの更新によってポインタ・フィールド (FLD_PTR) が削除されると、ポインタが参照するメモリ領域は、変更も解放もされません。

int
Fproj(FBFR *fbfr, FLDID *fieldid)

これらのフィールドは、この関数に渡されるフィールド識別子の配列で指定されます。更新は、フィールド化バッファ内で直接実行されます。次の例を参照してください。

#include "fldtbl.h"
FBFR *fbfr;
FLDID fieldid[20];
. . .
fieldid[0] = A; /* フィールドAのためのフィールド識別子 */
fieldid[1] = D; /* フィールドDのためのフィールド識別子 */
fieldid[2] = BADFLDID; /* 標識値 */
if(Fproj(fbfr, fieldid) < 0)
F_error("pgm_name");

バッファに A、B、C の各フィールドがある場合は、上記の例の結果として、フィールド A とフィールド D のオカレンスのみを含むバッファが生成されます。ただし、フィールド識別子の配列内のエントリは、特定の順序で並べる必要はありませんが、フィールド識別子 0 (BADFLDID) がフィールド識別子の配列の最後の値でなければなりません。

詳細については、『BEA Tuxedo FML リファレンス』の「Fproj、Fproj32(3fml)」を参照してください。

Fprojcpy

FprojcpyFproj と似ていますが、目的のフィールドは宛先バッファに配置されます。バッファの更新によってポインタ・フィールド (FLD_PTR) が削除されると、ポインタが参照するメモリ領域は、変更も解放もされません。

int
Fprojcpy(FBFR *dest, FBFR *src, FLDID *fieldid)

まず、宛先バッファ内のすべてのフィールドが削除され、ソース・バッファでのプロジェクションの結果が宛先バッファにコピーされます。上記の例を使って、次のコードではプロジェクションの結果が宛先バッファに格納されます。

if(Fprojcpy(dest, src, fieldid) < 0)
F_error("pgm_name");

フィールド識別子の配列内のエントリは、再配置される場合があります。つまり、フィールド識別子の配列は、それらのエントリが番号順になっていないとソートされます。

詳細については、『BEA Tuxedo FML リファレンス』の「Fprojcpy、Fprojcpy32(3fml)」を参照してください。

Fupdate

Fupdate、ソース・バッファ内のフィールド値で宛先バッファを更新します。

int
Fupdate(FBFR *dest, FBFR *src)

フィールド識別子とオカレンスの組み合わせが一致するフィールドの場合、フィールド値は、ソース・バッファ内の値によって宛先バッファ内で更新されます (Fjoinと同じ)。ソース・バッファに対応するフィールドがない宛先バッファのフィールドは、変更されません (Fojoinと同様)。宛先バッファに対応するフィールドのないソース・バッファのフィールドは、宛先バッファに追加されます (Fconcatと同じ)。次の例を参照してください。

if(Fupdate(dest,src) < 0)
F_error("pgm_name");

src バッファにフィールド A、C、D という 3 つのフィールドがあり、dest バッファにフィールド A、B という 2 つのフィールドと、フィールド C の 2 つのオカレンスがある場合、結果はソース・フィールド A、宛先フィールド B、ソース・フィールド C、2 つ目の宛先フィールド C、 およびソース・フィールド D になります。

ポインタの場合、Fupdate32 はポインタ値を格納します。FLD_PTR フィールドが指すバッファは、tpalloc(3c) を呼び出して割り当てます。埋め込み型の FML32 バッファの場合、Fupdate32 は、インデックスを除くすべての FLD_FML32 フィールド値を格納します。埋め込み型の VIEW32 バッファの場合、Fupdate32FVIEWFLD 型の構造体に対するポインタを格納します。FVIEWFLD 型の構造体には、vflags (現在未使用で 0 に設定されているフラグ・フィールド)、vname (VIEW 名を含む文字配列)、および data (C 構造体として格納される VIEW データに対するポインタ) が含まれています。アプリケーションは、Fupdate32vname および data を提供します。FVIEWFLD 構造体は、次のとおりです。

typedef struct {
TM32U vflags; /* フラグ - 現在未使用 */
char vname[FVIEWNAMESIZE+1]; /* VIEW の名前 */
char *data; /* VIEW 構造体に対するポインタ */
} FVIEWFLD;

詳細については、『BEA Tuxedo FML リファレンス』の「Fupdate、Fupdate32(3fml)」を参照してください。

 

先頭へ戻る 前のトピックへ 次のトピックへ