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