Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Server Base Enterprise Option プログラム作成の手引


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