5.4 サービスの定義
すべてのサービス・ルーチンは、TPSVCINFO
構造体を指すポインタで構成される1つの引数を受け取る関数として定義する必要があります。TPSVCINFO
構造体は、atmi.h
ヘッダー・ファイルに定義され、次の情報が含まれています。
char name[32];
long flags;
char *data;
long len;
int cd;
int appkey;
CLIENTID cltid;
次の表は、TPSVCINFO
データ構造体をまとめたものです。
表5-1 TPSVCINFOデータ構造体
フィールド | 説明 |
---|---|
name
|
リクエスト元プロセスがサービスの呼出しに使用する名前をサービス・ルーチンに対して指定します。 |
flags
|
サービスがトランザクション・モードであるかどうか、または呼出し側が応答を要求しているかどうかをサービスに通知します。サービスをトランザクション・モードにする各方法については、9-1ページの「グローバル・トランザクションのコーディング」を参照してください。
|
data
|
main() 内でtpalloc() によってすでに割り当てられているバッファを指すポインタ。このバッファは、リクエスト・メッセージの受信に使用されます。ただし、応答メッセージの返信やリクエスト・メッセージの転送にも、このバッファを使用することをお薦めします。
|
len
|
data フィールドによって参照されるバッファ内のリクエスト・データの長さを格納します。
|
cd
|
会話型通信の場合は、接続記述子を指定します。 |
appkey
|
アプリケーションで使用するために予約された値。アプリケーション固有の認証が設計に含まれている場合、クライアントがアプリケーションに参加するときに呼び出されるアプリケーション固有の認証サーバーによって、認証の成功または失敗を示す値、およびクライアント認証キーが戻される必要があります。Oracle Tuxedoシステムは、appkey をクライアントのために保持し、このフィールドに情報を格納して以降のサービス・リクエストに渡します。appkey がサービスに渡されたときは、クライアントの認証は終了しています。ただし、サービス内でappkey フィールドを使用して、サービスを呼び出したユーザー、またはそのユーザーに関するその他のパラメータを識別できます。
このフィールドが使用されていない場合は、デフォルト値の |
cltid
|
クライアントの識別子の保持に使用されるCLIENTID 型の構造体。この構造体は変更できません。
|
プロセスがTPSVCINFO
構造体のdata
フィールドにアクセスする場合、次のバッファ・タイプが合致する必要があります:
- 呼出し側のプロセスによって渡されるリクエスト・バッファのタイプ
- 呼び出されたサービスに定義された対応するバッファ・コードのタイプ
- 呼び出されたサービスに対して構成ファイルに定義された対応するバッファのタイプ
次のリストは、一般的なサービス定義を示しています。このコードは、Oracle Tuxedoソフトウェアで提供される銀行業務アプリケーションのABAL
(残高照会)サービス・ルーチンから引用したものです。ABAL
はBAL
サーバーの一部です。
一般的なサービス定義のリスト
#include <stdio.h> /* UNIX */
#include <atmi.h> /* ORACLE Tuxedo System */
#include <sqlcode.h> /* ORACLE Tuxedo System */
#include "bank.flds.h" /* bankdb fields */
#include "aud.h" /* BANKING view defines */
EXEC SQL begin declare section;
static long branch_id; /* branch id */
static float bal; /* balance */
EXEC SQL end declare section;
/*
* Service to find sum of the account balances at a SITE
*/
void
#ifdef __STDC__
ABAL(TPSVCINFO *transb)
#else
ABAL(transb)
TPSVCINFO *transb;
#endif
{
struct aud *transv; /* view of decoded message */
/* Set pointer to TPSVCINFO data buffer */
transv = (struct aud *)transb->data;
set the consistency level of the transaction
/* Get branch id from message, do query */
EXEC SQL declare acur cursor for
select SUM(BALANCE) from ACCOUNT;
EXEC SQL open acur; /* open */
EXEC SQL fetch acur into :bal; /* fetch */
if (SQLCODE != SQL_OK) { /* nothing found */
(void)strcpy (transv->ermsg,"abal failed in sql aggregation");
EXEC SQL close acur;
tpreturn(TPFAIL, 0, transb->data, sizeof(struct aud), 0);
}
EXEC SQL close acur;
transv->balance = bal;
tpreturn (TPSUCCESS, 0, transb->data, sizeof(struct aud), 0);
}
前述の例では、アプリケーションがクライアント側にリクエスト・バッファを割り当てるために、tpalloc()の呼出しでtype
パラメータにVIEW
、subtype
にaud
が設定されています。ABAL
サービスは、VIEW
型付きバッファをサポートするサービスとして定義されています。ABAL
にはBUFTYPE
パラメータは指定されず、デフォルト値のALL
が使用されます。ABAL
サービスはVIEW
型のバッファを割り当て、このバッファへのポインタにABAL
サブルーチンが渡されたTPSVCINFO
構造体のdata
メンバーを割り当てます。ABAL
サーバーは、前述のサンプル・コードに示してあるように、対応するdata
メンバーにアクセスして適切なデータ・バッファを取得します。
ノート:
このバッファが取得された後、データベースへの最初のアクセスを行う前に、サービスでトランザクションの整合性レベルを指定する必要があります。トランザクションの整合性レベルの詳細は、「グローバル・トランザクションのコーディング」を参照してください。