サービス関数の作成(SPP)
形式
ANSI C ,C++ の形式
void 関数名(char *in,DCULONG *in_len,char *out,DCULONG *out_len)
{
サービスの処理
}
K&R版 C の形式
void 関数名(in,in_len,out,out_len)
char *in;
DCULONG *in_len;
char *out;
DCULONG *out_len;
{
サービスの処理
}
機能
サービスを実行して結果を返すSPPのサービス関数です。クライアントUAPのdc_rpc_call関数で呼ばれます。サービス関数は,上記の形式で任意に作成してください。
サービス関数名は,サービス関数のエントリポイント(入り口点)の名称に対応します。この対応づけは,UAPの実行環境を設定するときに指定します。UAPの実行環境を設定する方法を次に示します。
引数の指定
サービス関数には,次の値が引数として渡されます。これはクライアントUAPがdc_rpc_call関数で指定した値です。
サービス関数では,次の値を引数に設定します。
サービスのクライアントUAPへの応答は,サービス関数がトランザクションとして実行したかどうか,またはコミットしたかロールバックしたかには無関係に送信されます。必要であればサービス関数でクライアントUAPにエラーを知らせる応答を作成してください。
クライアントUAPから値が渡される引数
●in
クライアントUAPで設定した,入力パラメタが渡されます。
●in_len
クライアントUAPで設定した,入力パラメタの長さが渡されます。
●out_len
クライアントUAPで設定した,応答の長さが渡されます。
UAPで値を設定する引数
●out
サービス関数からの応答を設定します。サービス関数の処理では,outにサービス関数での処理結果を設定してからリターンしてください。
●out_len
サービス関数からの,実際の応答の長さを設定します。クライアントUAPから渡されたout_lenの値以下の数値を設定してください。
サービス関数の処理での注意
トランザクションとサービス関数の関係
サービス関数のUAPがトランザクション属性を指定していて,クライアントUAPがトランザクションとして実行している場合,サービス関数はサービスを要求された時点でトランザクションブランチとして実行されます。この場合は,サービス関数でdc_trn_begin関数を使わないでください。
グローバルトランザクションのサービス全体は,コミットするかロールバックとなるかのどちらかが保証されています。トランザクションブランチとして実行されるサービス関数がリターン(return)することで,そのトランザクションブランチの正常終了を要求したと見なされます。
UAPにトランザクション属性を指定していても,クライアントUAPがトランザクションとして実行されてない場合は,サービス関数はトランザクションとして実行されません。このサービス関数の処理をトランザクションとしたい場合は,サービス関数から任意の時点でdc_trn_begin関数とdc_trn_unchained_commit関数を使って,トランザクションの開始と同期点取得をします。
UAPにトランザクション属性なしを指定したときは,サービス関数でdc_trn_begin関数を呼び出していても,サービス関数はトランザクションとして実行できません。
リターン値
リターン値はありません。return()で指定した値はクライアントUAPには返りません。OpenTP1でもリターン値を参照しません。リターン値として-1を指定しても,ロールバックを要求したことにはなりません。