Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス C言語編


7.1.3 SPPの例(サービス関数)

SPPのサービス関数のコーディング例を次に示します。

  10  /*
  20   *SVR01 サービス関数
  30   */
  40  #include <stdio.h>
  50  #include <string.h>
  60  #include <dcrpc.h>
  70  #include <dcdam.h>
  80  #define DAMFILE "damfile0"
  90  #define DAM_BLK_SIZE 504
 100  #define REWRITE_LEN 19
 110  extern int damfd;
 120  
 130  void svr01(in_data,in_leng,out_data,out_leng)
 140    char   *in_data;
 150    DCLONG *in_leng;
 160    char   *out_data;
 170    DCLONG *out_leng;
 180  {
 190  /*
 200   *変数の定義
 210   */
 220    static struct DC_DAMKEY keyptr;
 230    static char *damc_buf;
 240    static char dam_cntl_buf[DAM_BLK_SIZE];  
 250    static char write_buf[DAM_BLK_SIZE];
 260    struct dam_cntl_p {
 270      int w_point;
 280      char rewrite_data[REWRITE_LEN];
 290    } *dam_cntl_p;
 300    int rc;
 310    int write_size;
 320    int rewrite_size;
 330    int damc_buf_size;
 340  
 350    keyptr.fstblkno = 0;
 360    keyptr.endblkno = 0;
 370    damc_buf_size = DAM_BLK_SIZE;
 380    printf("SVR01:処理の開始 \n");
 390  /*
 400   *DAM_READ(論理ファイルからブロックの入力)
 410   */
 420    rc = dc_dam_read(damfd,&keyptr,1,dam_cntl_buf,
 430    damc_buf_size,DCDAM_MODIFY);
 440    if(rc != DC_OK) {
 450      printf("SVR01:dc_dam_readに失敗しました。CODE = %d \n",rc);
 460      strcpy(out_data,"SVR01:DAM READ FAILED");
 470      *out_leng = strlen(out_data);
 480      goto PROG_END;
 490    }
 500  /*
 510   *DAM_WRITE(論理ファイルへブロックの出力)
 520   *DAM_REWRITE(論理ファイルのブロックの更新)
 530   */
 540    DAM_WRITE:
 550    dam_cntl_p = (struct dam_cntl_p *)dam_cntl_buf;
 560    write_size = DAM_BLK_SIZE;
 570    memcpy(write_buf,in_data,*in_leng);
 580    dam_cntl_p->w_point = dam_cntl_p->w_point + 1;
 590    keyptr.fstblkno = dam_cntl_p->w_point;
 600    keyptr.endblkno = 0;
 610    rc = dc_dam_write(damfd,&keyptr,1,write_buf,
 620    write_size,DCNOFLAGS);
 630    if(rc != DC_OK) {
 640      if(rc == DCDAMER_BNOER) {
 650        dam_cntl_p->w_point = 0;
 660        goto DAM_WRITE;
 670      }
 680      printf("SVR01:dc_dam_writeに失敗しました。CODE = %d \n",rc);
 690      strcpy(out_data,"SVR01;DAM WRITE FAILED");
 700      *out_leng = strlen(out_data);
 710      goto PROG_END;
 720    }
 730    keyptr.fstblkno = 0;
 740    keyptr.endblkno = 0;
 750    damc_buf_size = DAM_BLK_SIZE;
 760    sprintf(dam_cntl_p->rewrite_data,"REWRITE COMPLETE\n");
 770    rc = dc_dam_rewrite(damfd,&keyptr,1,dam_cntl_buf,
 780    damc_buf_size,DCDAM_UPDATE);
 790    if(rc != DC_OK) {
 800      printf("SVR01:dc_dam_rewriteに失敗しました。CODE = %d\n",rc);
 810      strcpy(out_data,"SVR01:DAM REWRITE FAILED");
 820      *out_leng = strlen(out_data);
 830    }
 840    strcpy(out_data,"SVR01:PROCESS COMPLETE");
 850    *out_leng = strlen(out_data);
 860    PROG_END:
 870    printf("SVR01:処理を終了します。\n");
 880    return;
 890  }