5.10.3 UOCの使用例

ここでは,UOCを使用したデータロードの例について説明します。

なお,使用例中のUOCコーディング例は,サンプルデータべースとして提供されています。格納ディレクトリは,%PDDIR%¥sample¥sampleUOCです。

<この項の構成>
(1) UOCを使用したデータロード例

(1) UOCを使用したデータロード例

2けた表示の年号を持つ入力デ-タファイルを,2000年対応のデータべースに格納するために4けた表示の年号に変更します。なお,入力デ-タファイルはDAT形式で,pdloadが入力デ-タファイルを入力します。

(a) データべースの表定義

 CREATE TABLE 名簿 (社員番号 INTEGER,
                    生年月日 DATE,
                    出身地 CHAR(10),
                    氏名 CHAR(16));

(b) 入力デ-タファイルの形式

10001,68/04/30,KAWASAKI,YUUJI IKEDA
10002,64/09/13,HIROSHIMA,YOSHIO ODA
20001,70/11/02,YOKOHAMA,MASAMI KAWAGUCHI

(c) コマンド形式

pdload 名簿 制御情報ファイル

(d) 制御情報ファイルの内容

source 入力データファイル名
srcuoc ライブラリ名 entry=date_change_func

(e) UOCコーディング例
(ファイル名:sample1.c)

/*****************************************************************************
**                                                                          **
**  HiRDB sample Data input User Own Coding (for CSV file)                  **
**                          ~    ~   ~                                      **
**  name    :   date_change_func                                            **
**                                                                          **
**  func    :   YY/MM/DD  ===>  YYYY-MM-DD                                  **
**                                                                          **
**  i/o     :   none                                                        **
**                                                                          **
**  return  :   none                                                        **
**                                                                          **
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <pdutluoc.h>                                                             1
#define DATELEN         10                  /* DATE length                  */

   static  void    sub_date_change(char *,char *);

void date_change_func(
   UTL_UOC_INF    *uocinf                  /* A(UOC interface area)        */    2
){
   long            wk_leng;                /* length                       */
   char            date_data[10];          /* DATE (HiRDB)                 */
   char           *date_ptr;               /* A(birth date)                */
   char           *address_p;              /* A(native)                    */
   static  char    buff[512];              /* buffer                       */

   switch(uocinf->req_cd){                                                       3
   case UTL_UOC_START:
/*--------------------------------------------------------------------------*/
/*  START                                                                   */
/*--------------------------------------------------------------------------*/
       uocinf->edit_adr = buff;
       uocinf->rtn_code = UTL_UOC_NML;
       break;
   case UTL_UOC_EDIT:
/*--------------------------------------------------------------------------*/
/*  EDIT                                                                    */
/*--------------------------------------------------------------------------*/
       date_ptr = strchr(uocinf->data_adr,',');
       if (date_ptr == NULL){
           strcpy(uocinf->err_msg,"Invalid data");
           goto OWARI;
       }
       sub_date_change(++date_ptr,date_data);
       wk_leng = (long)date_ptr - (long)uocinf->data_adr;
       strncpy(buff,uocinf->data_adr,wk_leng);
       strncpy((char*)((long)buff + wk_leng),date_data,DATELEN);
       wk_leng += DATELEN;
       address_p = strchr(date_ptr,',');
       strcpy((char*)((long)buff + wk_leng),address_p);
       uocinf->rtn_code = UTL_UOC_NML;
       break;
   case UTL_UOC_END:
   case UTL_UOC_TERM:
/*--------------------------------------------------------------------------*/
/*  END                                                                     */
/*--------------------------------------------------------------------------*/
       uocinf->rtn_code = UTL_UOC_NML;
       break;
   default:
       strcpy(uocinf->err_msg,"Invalid request code");
       goto OWARI;
   }
   return;
OWARI:
   uocinf->rtn_code = UTL_UOC_ERR;
   return;
}
static void sub_date_change(
   char    *year_two,                      /* YY/MM/DD                     */
   char    *year_four                      /* YYYY-MM-DD                   */
){
   strcpy(year_four,"19");
   strncat(year_four,year_two,8);
   year_four[4] = '-';
   year_four[7] = '-';
   return;
}

[説明]
  1. HiRDBが提供する,UOC作成用のヘッダを引き込みます。
  2. UOCインタフェース領域のアドレスを引数として受け取ります。
  3. 呼び出し種別を判定してそれぞれの処理をします。