サービス関数の作成(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の実行環境を設定する方法を次に示します。
-
TP1/Server Baseの場合
ユーザサービス定義で指定します。
-
TP1/LiNKの場合
UAPの環境を設定するコマンドを実行して,対話形式で指定します。
引数の指定
サービス関数には,次の値が引数として渡されます。これはクライアントUAPがdc_rpc_call関数で指定した値です。
-
入力パラメタ(in)
-
入力パラメタ長(in_len)
-
応答の長さ(out_len)
入力パラメタと入力パラメタの長さはクライアントUAPで設定した値が,文字コードや数字の表現形式などを変換しないでサービス関数にそのまま渡されます。応答の長さには,クライアントUAPで設定した長さが渡されます。
サービス関数では,次の値を引数に設定します。
-
サービス関数の応答(out)
-
サービス関数の応答の長さ(out_len)
サービス関数は,outに応答を設定して,その長さをout_lenに設定してからリターンしてください。
サービスのクライアントUAPへの応答は,サービス関数がトランザクションとして実行したかどうか,またはコミットしたかロールバックしたかには無関係に送信されます。必要であればサービス関数でクライアントUAPにエラーを知らせる応答を作成してください。
クライアントUAPから値が渡される引数
●in
クライアントUAPで設定した,入力パラメタが渡されます。
●in_len
クライアントUAPで設定した,入力パラメタの長さが渡されます。
●out_len
クライアントUAPで設定した,応答の長さが渡されます。
UAPで値を設定する引数
●out
サービス関数からの応答を設定します。サービス関数の処理では,outにサービス関数での処理結果を設定してからリターンしてください。
●out_len
サービス関数からの,実際の応答の長さを設定します。クライアントUAPから渡されたout_lenの値以下の数値を設定してください。
サービス関数の処理での注意
-
非応答型RPC(flagsにDCRPC_NOREPLYを指定)のdc_rpc_call関数(flagsにEERPC_NOREPLYを指定)で呼び出したサービス関数では,outとout_lenは参照できません。
-
サービス関数をC言語で記述した場合は,static変数には前回のサービス要求時の値が残っているので,必要であれば初期化してから使用してください。
-
サービス関数から使えない関数を次に示します。使った場合のUAPの動作は保証しません。
-
dc_rpc_open()
-
dc_rpc_close
-
dc_rpc_mainloop()
-
子プロセスを生成する関数(fork(),system()など)
-
プロセスが終了する関数(exit()など)
-
-
SPPのサービス関数からメッセージ送受信の関数(dc_mcf_〜)を呼び出す場合は,メイン関数で dc_mcf_open関数と dc_mcf_close関数を呼び出しておいてください。
-
SPPのサービス関数からは,dc_mcf_receive関数は呼び出せません。
-
inに渡された入力パラメタに対して,in_lenに渡された入力パラメタ長の領域を超える操作や参照などはしないでください。操作や参照などをした場合の動作は保証しません。プロセスが異常終了する場合があります。
トランザクションとサービス関数の関係
サービス関数のUAPがトランザクション属性を指定していて,クライアントUAPがトランザクションとして実行している場合,サービス関数はサービスを要求された時点でトランザクションブランチとして実行されます。この場合は,サービス関数でdc_trn_begin関数を使わないでください。
グローバルトランザクションのサービス全体は,コミットするかロールバックとなるかのどちらかが保証されています。トランザクションブランチとして実行されるサービス関数がリターン(return)することで,そのトランザクションブランチの正常終了を要求したと見なされます。
UAPにトランザクション属性を指定していても,クライアントUAPがトランザクションとして実行されてない場合は,サービス関数はトランザクションとして実行されません。このサービス関数の処理をトランザクションとしたい場合は,サービス関数から任意の時点でdc_trn_begin関数とdc_trn_unchained_commit関数を使って,トランザクションの開始と同期点取得をします。
UAPにトランザクション属性なしを指定したときは,サービス関数でdc_trn_begin関数を呼び出していても,サービス関数はトランザクションとして実行できません。
リターン値
リターン値はありません。return()で指定した値はクライアントUAPには返りません。OpenTP1でもリターン値を参照しません。リターン値として-1を指定しても,ロールバックを要求したことにはなりません。