ユーザー定義関数における、C言語関数のリンクと呼出しシーケンスを、以下の図に示します。
連結処理において、C言語関数名:Defuncとした場合の例です。
図7.5 ユーザー定義関数の呼出し(C API利用時)
AsisLoadFunction関数を呼び出したとき、指定されたライブラリをロードします。
各機能の実行API(AsisExecuteReplace関数など)を呼び出したとき、最初に、指定されたすべてのユーザー定義関数に対して、対応するC言語関数を呼び出し種別「DE_USER_FUNCTION_THREAD_OPEN」で呼び出します。
その後、使用されているユーザー定義関数に対して、対応するC言語関数を呼出し種別「DE_USER_FUNCTION_EXEC」および呼び出し種別「DE_USER_FUNCTION_FREE」で呼び出します。最後に、すべてのユーザー定義関数に対して、対応するC言語関数を呼び出し種別「DE_USER_FUNCTION_CLOSEDE_USER_FUNCTION_THREAD_CLOSE」で呼び出します。
AsisUnloadFunction関数を呼び出したとき、ライブラリをアンロードします。
C API利用時の注意事項
Data Effectorでは処理を最適化しています。式や仮想項目に指定したcall関数は、指定した順序や条件通りに呼び出されるとは限りません。必要に応じて呼出しの有無の判断や呼出し順序の変更を行います。
ユーザー定義関数は参照透過性があるものとみなされ、同じ引数を与えた場合は、同じ結果が返却されると判断されます。その結果、最適化によりユーザー定義関数の呼出しが省略されることがあります。
ユーザー定義関数内でファイルやデータベースへ出力するなどの副作用のある処理は行わないでください。また、call関数の呼出し順序に依存した処理を行わないでください。
ユーザー定義関数内で行うデータ加工処理は、call関数の引数として渡される項目参照だけを使用するようにしてください。
呼び出し種別「DE_USER_FUNCTION THREAD_OPEN」で呼び出したときに返却されるハンドルは、ユーザー定義関数ごとに共有のものになります。
call関数を実行すると、ユーザー定義関数は、「変換実行(DE_USER_FUNCTION_EXEC)」と「領域解放(DE_USER_FUNCTION_FREE)」がセットで実行されます。
ユーザー定義関数内で使用しているデータは、call関数の呼出しを超えて使用することはできません。
例:終了処理で、call関数を実行した回数を取得することはできない。