7.1 クライアント/サーバ形態のUAPのコーディング例(SUP,SPP DAMアクセス)

クライアント/サーバ形態のUAP構成例を次の図に示します。

図7-1 クライアント/サーバ形態のUAP構成例(DAMアクセス)

[図データ]

(説明)
DAMファイルdamfile0には,先頭ブロックに管理部があり,2番目以降のブロックをデータレコードとしています。サービスの処理は,先頭ブロックを入力して更新したあと(dc_dam_read関数,dc_dam_rewrite関数),2番目以降のブロックはdc_dam_write関数で,直接,更新します。

ここでは,図に示した構成例のコーディング例を示します。

<この節の構成>
(1) SUPの例
(2) SPPの例(メイン関数)
(3) SPPの例(サービス関数)

(1) SUPの例

SUPのコーディング例を次に示します。

 10  /*
 20   * SUP01
 30   */
 40  #include <stdio.h>
 50  #include <string.h>
 60  #include <dcrpc.h>
 70  #include <dctrn.h>
 80  
 90  main()
100  {
110  /*
120   *変数の定義
130   */
140    static char   in_buf[1024];
150    static DCLONG in_buf_len;
160    static char   out_buf[1024];
170    static DCLONG out_buf_len;
180    int rc;
190  /*
200   *RPC-OPEN(UAPの開始)
210   */
220    rc = dc_rpc_open(DCNOFLAGS);
230    /*OpenTP1の各種関数を使う準備をする(各機能の初期化)*/
240    if(rc != DC_OK) {
250      printf("SUP01:dc_rpc_openに失敗しました。CODE = %d ¥n",rc);
260      goto PROG_END;
270    }
280  /*
290   *ADM-COMPLETE(ユーザサーバの開始処理完了の報告)
300   */
310    rc = dc_adm_complete(DCNOFLAGS);
320    if(rc != DC_OK){
330      printf("SUP01:dc_adm_completeに失敗しました。CODE = %d ¥n",rc);
340      goto PROG_END;
350    }
360  /*
370   *TRN_BEGIN(トランザクションの開始)
380   */
390    rc = dc_trn_begin();
400    if(rc != DC_OK) {
410      printf("SUP01:dc_trn_beginに失敗しました。CODE = %d ¥n",rc);
420      goto TRAN_END;
430    }
440    /*
450     *RPC-CALL(遠隔サービスの要求)
460     */
470    strcpy(in_buf,"SUP01:DATA OpenTP1!!");
480    in_buf_len = strlen(in_buf) + 1;
490    out_buf_len = 1024;
500    rc = dc_rpc_call("spp01grp","svr01",in_buf,&in_buf_len,
510    out_buf,&out_buf_len,DCNOFLAGS);
520    if(rc != DC_OK) {
530      printf("SUP01:サービス要求に失敗しました。CODE = %d ¥n",rc);
540      goto TRAN_END;
550    }
560    printf("SUP01:SERVICE FUNCTION RETURN = %s¥n",out_buf);
570  /*
580   *TRN-UNCHAINED-COMMIT(非連鎖モードのコミット)
590   */
600    TRAN_END:
610    rc = dc_trn_unchained_commit();
620    if(rc != DC_OK) {
630      printf("SUP01:dc_trn_unchained_commitに失敗しました。CODE = %d ¥n",rc);
640    }
650  /*
660   *RPC-CLOSE(UAPの終了)
670   */
680    PROG_END:
690    dc_rpc_close(DCNOFLAGS);
700    printf("SUP01:処理を終了しました。¥n");
710    exit(0);
720  }

(2) SPPの例(メイン関数)

SPPのメイン関数のコーディング例を次に示します。

 10  /*
 20   *SPP01 メイン関数
 30   */
 40  #include <stdio.h>
 50  #include <dcrpc.h>
 60  #include <dcdam.h>
 70  #define DAMFILE "damfile0"
 80  
 90  int damfd;   /* damfile file-id */
100  
110  main()
120  {
130  /*
140   *リターン値を格納する領域の定義
150   */
160    int rc;
170  /*
180   *RPC-OPEN(UAPの開始)
190   */
200    rc = dc_rpc_open(DCNOFLAGS);
210    if(rc != DC_OK) {
220      printf("SPP01:dc_rpc_openに失敗しました。CODE = %d ¥n",rc);
230      goto PROG_END;
240    }
250  /*
260   *DAM-OPEN(論理ファイルのオープン)
270   */
280    rc = dc_dam_open(DAMFILE,DCDAM_BLOCK_EXCLUSIVE);
290    if(rc < DC_OK) {
300      printf("SVR01:dc_dam_openに失敗しました。CODE = %d ¥n",rc);
310      goto DAM_END;
320    }
330    damfd = rc;
340  /*
350   *RPC-MAINLOOP(SPPのサービス開始)
360   */
370    printf("SPP01:mainloopに入ります。¥n");
380    rc = dc_rpc_mainloop(DCNOFLAGS);
390    if(rc != DC_OK) {
400      printf("SPP01:dc_rpc_mainloop ¥
410          に失敗しました。CODE = %d ¥n",rc);
420    }
430  /*
440   *DAM-CLOSE(論理ファイルのクローズ)
450   */
460    DAM_END:
470    rc = dc_dam_close(damfd,DCNOFLAGS);
480    if(rc != DC_OK) {
490      printf("SVR01:dc_dam_closeに失敗しました。CODE = %d¥n",rc);
500    }
510  /*
520   *RPC-CLOSE(UAPの終了)
530   */
540    PROG_END:
550    dc_rpc_close(DCNOFLAGS);
560    printf("SPP01:SPPのサービス処理を終了します。¥n");
570    exit(0);
580  }

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