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; }