5.11.3 UOCの使用例
ここでは,UOCを使用したデータロードの例について説明します。
なお,使用例中のUOCコーディング例は,サンプルデータべースとして提供されています。格納ディレクトリは,$PDDIR/sample/sampleUOCです。
(1) UOCを使用したデータロード例(その1)
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; }
- [説明]
-
-
HiRDBが提供する,UOC作成用のヘッダを引き込みます。
-
UOCインタフェース領域のアドレスを引数として受け取ります。
-
呼び出し種別を判定してそれぞれの処理をします。
-
(2) UOCを使用したデータロード例(その2)
Mマシンからftpのバイナリモードで転送したファイルの文字コードを,EBCDIKコードからASCIIコードに変換してデータベースに格納します。なお,入力デ−タファイルはバイナリ形式で,UOCが入力デ−タファイルを入力します。
(a) データべースの表定義
CREATE TABLE 社員一覧 (社員番号 INTEGER, 社員名 CHAR(16));
(b) 入力デ−タファイルの形式(EBCDIKコード)
00002711 E8E4E4D1 C940C9D2 C5C4C140 40404040 ←16進数表示 10001 YUUJI IKEDA ←文字表示 00002712 E8D6E2C8 C9D640D6 C4C14040 40404040 10002 YOSHIO ODA 00004E21 D4C1E2C1 D4C940D2 C1E6C1C7 E4C3C8C9 20001 MASAMI KAWAGUCHI
(c) コマンド形式
pdload 社員一覧 制御情報ファイル
(d) 制御情報ファイルの内容
source (uoc) srcuoc ライブラリ名 entry=table_load_func param='入力データファイル名'
(e) UOCコーディング例
(ファイル名:sample2.c) /***************************************************************************** ** ** ** HiRDB sample Data input User Own Coding (for Binary file 1/2) ** ** ~ ~ ~ ** ** name : table_load_func ** ** ** ** func : Character code convert ** ** ** ** i/o : none ** ** ** ** return : none ** ** ** *****************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <pdutluoc.h> #define F_START 'S' /* convert start */ #define F_CONV 'C' /* convert execute */ #define F_END 'E' /* convert end */ extern long data_convert_func(long,long,char*,char*); void table_load_func( UTL_UOC_INF *uocinf /* A(UOC interface area) */ ){ long rc; /* return code */ long redsiz; /* input data length */ char *ebc_adr; /* A(EBCDIK) */ char *asc_adr; /* A(ASCII) */ char buff[20]; /* input buffer */ static int inflp = EOF; /* file ID */ switch(uocinf->req_cd){ case UTL_UOC_START: /*--------------------------------------------------------------------------*/ /* START */ /*--------------------------------------------------------------------------*/ uocinf->e_data_len = sizeof(buff); uocinf->edit_adr = malloc(sizeof(buff)); if (uocinf->edit_adr == NULL){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } if (uocinf->user_param == NULL){ strcpy(uocinf->err_msg,"File name not specified"); goto OWARI; } strcpy(uocinf->err_msg,"FILE NAME:"); strcat(uocinf->err_msg,uocinf->user_param); 1 inflp = EOF; inflp = open(uocinf->user_param,O_RDONLY | O_NONBLOCK); if (inflp == EOF){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } rc = data_convert_func(F_START,0,0,0); if (rc != 0){ strcpy(uocinf->err_msg,strerror(rc)); goto OWARI; } uocinf->rtn_code = UTL_UOC_DBG; 2 break; case UTL_UOC_EDIT: /*--------------------------------------------------------------------------*/ /* EDIT */ /*--------------------------------------------------------------------------*/ redsiz = read(inflp,buff,sizeof(buff)); switch(redsiz){ case 0: uocinf->rtn_code = UTL_UOC_EOF; break; case -1: strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; default: if (redsiz == sizeof(buff)){ memcpy(uocinf->edit_adr,buff,sizeof(long)); ebc_adr = (char *)((long)buff + sizeof(long)); asc_adr = (char *)((long)uocinf->edit_adr + sizeof(long)); rc = data_convert_func(F_CONV,sizeof(buff) - sizeof(long), ebc_adr,asc_adr); if (rc != 0){ strcpy(uocinf->err_msg,strerror(rc)); goto OWARI; } uocinf->rtn_code = UTL_UOC_NML; }else{ strcpy(uocinf->err_msg,"Invalid data"); goto OWARI; } } break; case UTL_UOC_END: case UTL_UOC_TERM: /*--------------------------------------------------------------------------*/ /* END */ /*--------------------------------------------------------------------------*/ rc = data_convert_func(F_END,0,0,0); if (rc != 0){ strcpy(uocinf->err_msg,strerror(rc)); goto OWARI; } if (inflp != EOF){ rc = close(inflp); inflp = EOF; if (rc == EOF){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } } if (uocinf->edit_adr != NULL){ free(uocinf->edit_adr); uocinf->edit_adr = NULL; } 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; }
- [説明]
-
-
ユーザパラメタで入力デ−タファイルのパス名を取得します。
-
正常にオープンできた場合,ファイル名をメッセージに出力します。
-