7.1 C言語のコーディング例
C言語のUAP共用ライブラリのコーディング例を示します。
/* C標準ヘッダファイルのインクルード */
#include <stdio.h>
#include <string.h>
/* TP1/EE 提供ヘッダファイルのインクルード */
#include <eerpcsrv.h>
#include <eerpc.h>
#include <eelog.h>
#include <eetrn.h>
#include <eetim.h>
#include <eemem.h>
#include <eedbq.h>
/* 自作関数 ヘッダファイルのインクルード */
#include <sv_dba.h>
/*****************************************************************
** 目的 : サービストランザクション(非応答型RPC用)
** 機能 : (1)受信データから取得する情報を格納するデータ領域を確保する
(2)受信データから、必要な情報を取得する
(3)データ領域を用いて、タイマトランザクションを発行
(4)確保した領域を解放
(5)タイマトランザクション失敗時には、ロールバックする
入力データ形式
┌---------------------------------------------┐
│ データ名 │ データ型 │ 意味 │
│=============================================│
│ name_len │ unsigned int │ 名前の文字列長│
│---------------------------------------------│
│ name │ char(20) │ 名前 │
│---------------------------------------------│
│ sex_len │ unsigned int │ 性別の文字列長│
│---------------------------------------------│
│ sex │ char(4) │ 性別 │
│---------------------------------------------│
│ age_len │ unsigned int │ 年齢の文字列長│
│---------------------------------------------│
│ age │ char(4) │ 年齢 │
│---------------------------------------------│
│ sale │ int │ 売上 │
└---------------------------------------------┘
トランザクション処理に必要な情報
┌---------------------------------------------┐
│ データ名 │ データ型 │ 意味 │
│=============================================│
│ name │ char(20) │ 名前 │
│---------------------------------------------│
│ sex │ char(4) │ 性別 │
│---------------------------------------------│
│ age │ char(4) │ 年齢 │
│---------------------------------------------│
│ sale │ int │ 売上 │
│---------------------------------------------│
│ srv │ char(32) │ サービス名 │
└---------------------------------------------┘
*****************************************************************/
void SAMPLE_UAP(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
in_customer_t in_custm; /*クライアントから渡される顧客情報(44byte)*/
customer_t custm; /*トランザクションで必要な顧客情報(64byte)*/
EEULONG send_len; /*送信データ長*/
int wrc; /*関数リターンコード*/
void *seg_pt; /*確保領域の先頭アドレス*/
/**************************************/
/* データ領域の確保 */
/**************************************/
send_len = sizeof(customer_t);
wrc = ee_mem_getwkseg(EE_SEGTYPE_UAPWORK,send_len,&seg_pt,EENOFLAGS);
if(wrc != EE_OK){
wrc = ee_logprint("KFSB05200-E","SP","SERVER:領域確保に失敗しました。\n", NULL,EENOFLAGS);
return;
}
/**************************************/
/* 必要なデータ取得 */
/**************************************/
memcpy(&in_custm,in_data,*in_leng);
memcpy(custm.name,in_custm.name,20);
memcpy(custm.sex,in_custm.sex,4);
memcpy(custm.age,in_custm.age,4);
custm.sale = in_custm.sale;
memcpy(custm.srv,(trninf->service),32);
/**************************************/
/* TMトランザクション起動 */
/**************************************/
memcpy(seg_pt,&custm,send_len);
wrc = ee_tim_execap(EETIM_INST,EETIM_JUST,0,0,"srv02",EETIM_HI,(char*)seg_pt,send_len,EENOFLAGS);
/* TMトランザクション起動失敗の場合、ロールバック終了 */
if(wrc != EE_OK){
wrc = ee_logprint("KFSB05300-E","SP","SERVER:タイマトランザクション起動に失敗しました。\n",NULL,EENOFLAGS);
wrc = ee_mem_rlswkseg(seg_pt,EENOFLAGS);
wrc = ee_trn_chained_rollback(EETRN_KILL,0);
/** ロールバック失敗の場合、エラー表示して終了 **/
if(wrc != EE_OK){
wrc = ee_logprint("KFSB05400-E","SP","SERVER:ROLLBACKに失敗しました。\n",NULL,EENOFLAGS);
return;
}
}
/* 領域の解放 */
wrc = ee_mem_rlswkseg(seg_pt,EENOFLAGS);
/* DBキューに書込み */
wrc = ee_dbq_msgput("DBQ001",in_data,*in_leng,EENOFLAGS);
if(wrc != EE_OK){
wrc = ee_logprint("KFSB06000-E","SP","SERVER:DBキューのメッセージ書込みに失敗しました。\n",NULL,EENOFLAGS);
wrc = ee_trn_chained_rollback(EETRN_KILL,0);
/** ロールバック失敗の場合、エラー表示して終了 **/
if(wrc != EE_OK){
wrc = ee_logprint("KFSB05400-E","SP","SERVER:ROLLBACKに失敗しました。\n",NULL,EENOFLAGS);
return;
}
}
return;
}
/*****************************************************************
** 目的 : エラートランザクション1
** 機能 : エラートランザクション1を実行する
*****************************************************************/
void SAMPLE_E1(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB05600-E","SP","SERVER:エラートランザクション1を起動します。\n",NULL,EENOFLAGS);
return;
}
/*****************************************************************
** 目的 : エラートランザクション2
** 機能 : エラートランザクション2を実行する
*****************************************************************/
void SAMPLE_E2(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB05700-E","SP","SERVER:エラートランザクション2を起動します。\n",NULL,EENOFLAGS);
return;
}
/*****************************************************************
** 目的 : エラートランザクション3
** 機能 : エラートランザクション3を実行する
*****************************************************************/
void SAMPLE_E3(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
char rcv_data[8]; /*RPC応答格納領域*/
EEULONG rcv_len=8; /*RPC応答データ長*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB05800-E","SP","SERVER:エラートランザクション3を起動します。\n",NULL,EENOFLAGS);
/**************************************/
/* RPC 送信 */
/**************************************/
memset(rcv_data,0,8);
wrc = ee_rpc_call("outSPP","outSRV",in_data,in_leng,rcv_data,&rcv_len,EENOFLAGS);
if(wrc != EE_OK){
wrc = ee_logprint("KFSB05500-E","SP","SERVER:RPC処理に失敗しました。\n",NULL,EENOFLAGS);
}
return;
}
/*****************************************************************
** 目的 : エラートランザクション4
** 機能 : エラートランザクション4を実行する
*****************************************************************/
void SAMPLE_E4(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB05900-E","SP","SERVER:エラートランザクション4を起動します。\n",NULL,EENOFLAGS);
return;
}
/*****************************************************************
** 目的 : MIトランザクション
** 機能 : MIトランザクションを実行する
*****************************************************************/
void SAMPLE_MI(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB06200-I","SP","SERVER:サンプルUAPを開始します。\n",NULL,EENOFLAGS);
return;
}
/*****************************************************************
** 目的 : MEトランザクション
** 機能 : MEトランザクションを実行する
*****************************************************************/
void SAMPLE_ME(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB06300-I","SP","SERVER:サンプルUAPを終了します。\n",NULL,EENOFLAGS);
return;
}
/*****************************************************************
** 目的 : タイマトランザクション
** 機能 : タイマトランザクションを実行する
*****************************************************************/
void SAMPLE_TM(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
char rcv_data[8]; /*RPC応答格納領域*/
EEULONG rcv_len=8; /*RPC応答データ長*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB06400-I","SP","SERVER:タイマトランザクションを起動します。\n",NULL,EENOFLAGS);
/**************************************/
/* RPC 送信 */
/**************************************/
memset(rcv_data,0,8);
wrc = ee_rpc_call("outSPP","outSRV",in_data,in_leng,rcv_data,&rcv_len,EENOFLAGS);
if(wrc != EE_OK){
wrc = ee_logprint("KFSB05500-E","SP","SERVER:RPC処理に失敗しました。\n",NULL,EENOFLAGS);
}
return;
}
/*****************************************************************
** 目的 : DBキューの読出しトランザクション
** 機能 : DBキューの読出しトランザクションを実行する
*****************************************************************/
void SAMPLE_DBQ(
char *in_data,
EEULONG *in_leng,
char *out_data,
EEULONG *out_leng,
EERPC_INTERFACE_TBL *trninf
)
{
/**************************************/
/* 変数の宣言 */
/**************************************/
int wrc; /*関数リターンコード*/
char rcv_data[8]; /*RPC応答格納領域*/
EEULONG rcv_len=8; /*RPC応答データ長*/
/**************************************/
/* 表示 */
/**************************************/
wrc = ee_logprint("KFSB06400-I","SP","SERVER:DBキューの読出しトランザクションを起動します。\n",NULL,EENOFLAGS);
/**************************************/
/* RPC 送信 */
/**************************************/
memset(rcv_data,0,8);
wrc = ee_rpc_call("outSPP","outSRV",in_data,in_leng,rcv_data,&rcv_len,EENOFLAGS);
if(wrc != EE_OK){
wrc = ee_logprint("KFSB05500-E","SP","SERVER:RPC処理に失敗しました。\n",NULL,EENOFLAGS);
}
return;
}