8.12.5 UOCの使用例
ここでは,UOCを使用した表の再編成,及び表のアンロードの例について説明します。
なお,使用例中のUOCコーディング例は,サンプルデータべースとして提供されています。格納ディレクトリは,$PDDIR/sample/sampleUOCです。
- 〈この項の構成〉
(1) UOCを使用した表の再編成の例
表の再編成をするときに,データベースに登録された日時が2001年以前のデータを削除します。
(a) データべースの表定義
CREATE TABLE 会員名簿 (会員番号 INTEGER, 会員名 NCHAR(20), 会員住所 NVARCHAR(100), 入会日時 DATE NOT NULL WITH DEFAULT);
(b) コマンド形式
pdrorg -k rorg -t 会員名簿 制御情報ファイル
(c) 制御情報ファイルの内容
unload アンロードデータファイル名 uoc_lib=ライブラリ名 unlduoc entry=old_data_delete
(d) UOCコーディング例
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <pdutluoc.h> ..........................................................1 void old_data_delete ( UTL_UOC_INF *uocinf /* A(UOC interface area) */ ...2 ) { UTL_UOC_DATA_BUF *addr_list; /* A(data address list) */ unsigned char *date_adr; /* A(DATE) */ static unsigned char cyear[2]; /* compare year */ switch(uocinf->req_cd){ ....................................................3 case UTL_UOC_START: /*------------------------------------------------------------------------*/ /* START */ /*------------------------------------------------------------------------*/ cyear[0] = 0x20; /* The 21th century */ cyear[1] = 0x01; /* (2001) */ uocinf->rtn_code = UTL_UOC_NML; break; case UTL_UOC_EDIT: /*------------------------------------------------------------------------*/ /* EDIT */ /*------------------------------------------------------------------------*/ addr_list = uocinf->data_adr; date_adr = addr_list->data[3]; if (memcmp(date_adr,cyear,sizeof(cyear)) < 0){ uocinf->unload_flg = UTL_UOC_ROWNOPUT; }else{ uocinf->unload_flg = UTL_UOC_ROWPUT; } ......................................................................4 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"); uocinf->rtn_code = UTL_UOC_ERR; } return; }
- [説明]
-
-
HiRDBが提供する,UOC作成用のヘッダを引き込みます。
-
UOCインタフェース領域のアドレスを引数として受け取ります。
-
呼び出し種別を判定して,それぞれの処理をします。
-
データ(日付)を判定して,格納フラグを設定します。
-
(2) UOCを使用した表のアンロードの例
表のアンロード時に,BLOBデータをCSV形式に編集します。このとき,1データ1ファイルでUOCデータファイルを作成します。
(a) データべースの表定義
CREATE TABLE IMAGE_TBL (COL1 INTEGER NOT NULL, COL2 CHAR(20) NOT NULL, COL3 INTEGER NOT NULL, COL4 CHAR(5) NOT NULL, COL5 BLOB(100K) IN (LOB_AREA) NOT NULL) IN DATA_AREA;
(b) コマンド形式
pdrorg -k unld -j -t IMAGE_TBL 制御情報ファイル
(c) 制御情報ファイルの内容
unload (uoc) uoc_lib=ライブラリ名 param='/usr/tmp/lob,/tmp/uoc_file' unlduoc entry=blob_file_create
(d) UOCコーディング例
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <fcntl.h> #include <pdutluoc.h> #define INT 0xf0 /* INTEGER */ #define CHAR 0xc4 /* CHAR */ #define BLOB 0x92 /* BLOB */ void blob_file_create ( UTL_UOC_INF *uocinf /* A(UOC interface area) */ ) { static char token[] = ","; /* parameter token */ static char prefix[40]; /* path name prefix */ static char filename[80]; /* CSV file name */ static char *buff = NULL; /* row edit buffer */ static int counter = 0; /* row counter */ static int file_id = 0; /* CSV file file ID */ int lobfid; /* BLOB file */ int leng; /* total length */ int int_len; /* INTEGER length */ int i; /* counter for column */ int rc; /* return code */ int *nagasa; /* BLOB size */ void *blobadr; /* A(BLOB data) */ char *wkadr; /* work address */ UTL_UOC_DATA_BUF *addr_list; /* A(data address list) */ UTL_UOC_COLUMN_INFO *col_inf; /* A(column information) */ char *sepachr = ","; /* separator character */ char *linechr = "\n"; /* line field character */ char dmyname[16]; /* temporary name */ char blobfile[128]; /* BLOB file name */ switch(uocinf->req_cd){ case UTL_UOC_START: /*-----------------------------------------------------------------------*/ /* START */ /*-----------------------------------------------------------------------*/ if (uocinf->user_param == NULL){ strcpy(uocinf->err_msg,"Required parameter not specified"); goto OWARI; } wkadr = strtok(uocinf->user_param,token); if ((wkadr == NULL) || (strlen(wkadr) >= sizeof(prefix))){ strcpy(uocinf->err_msg,"Invalid parameter"); goto OWARI; } strcpy(prefix,wkadr); ...................................................1 wkadr = strtok(NULL,token); if ((wkadr == NULL) || (strlen(wkadr) >= sizeof(filename))){ strcpy(uocinf->err_msg,"Invalid parameter"); goto OWARI; } strcpy(filename,wkadr); .................................................1 file_id = creat(filename,0666); if (file_id == -1){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } buff = malloc(1024); if (buff == NULL){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } counter = 0; strcpy(uocinf->err_msg,"FILE NAME:"); strcat(uocinf->err_msg,filename); uocinf->rtn_code = UTL_UOC_DBG; break; case UTL_UOC_EDIT: /*----------------------------------------------------------------------*/ /* EDIT */ /*----------------------------------------------------------------------*/ counter++; col_inf = uocinf->dic_inf; addr_list = uocinf->data_adr; leng = 0; wkadr = buff; for(i = 0; i < uocinf->col_num; i++){ switch(col_inf->colinf[i]->clm_type){ case INT: ..........................................................2 int_len = sprintf(wkadr,"%d",*((int*)addr_list->data[i])); leng += int_len; wkadr += int_len; break; case CHAR: .........................................................2 strncpy(wkadr,addr_list->data[i],col_inf->colinf[i]->clm_len); leng += col_inf->colinf[i]->clm_len; wkadr += col_inf->colinf[i]->clm_len; break; case BLOB: .........................................................3 sprintf(dmyname,"%010d",counter); strcpy(blobfile,prefix); strcat(blobfile,dmyname); lobfid = creat(blobfile,0666); if (lobfid == -1){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } nagasa = (int *)((int)(addr_list->data[i]) + sizeof(int)); blobadr = (void *)((int)(addr_list->data[i]) + (sizeof(int) * 2)); rc = write(lobfid,blobadr,*nagasa); if (rc != *nagasa){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } rc = close(lobfid); if (rc == -1){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } strcpy(wkadr,blobfile); leng += strlen(blobfile); wkadr += strlen(blobfile); break; default: strcpy(uocinf->err_msg,"Not support data type"); goto OWARI; } strcpy(wkadr,sepachr); leng += 1; wkadr++; } wkadr--; strcpy(wkadr,linechr); rc = write(file_id,buff,leng); if (rc != leng){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } uocinf->rtn_code = UTL_UOC_NML; break; case UTL_UOC_END: case UTL_UOC_TERM: /*----------------------------------------------------------------------*/ /* END */ /*----------------------------------------------------------------------*/ if (buff != NULL){ free(buff); buff = NULL; } if (file_id != 0){ rc = close(file_id); file_id = 0; if (rc == -1){ strcpy(uocinf->err_msg,strerror(errno)); goto OWARI; } } 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; }
- [説明]
-
-
制御情報ファイルに指定したユーザパラメタを,UOC内の変数に展開します。
-
INTEGER,CHARの列データは,文字形式でUOCデータファイルに出力します。
-
BLOB列のデータは,行単位にファイルに出力し,ファイル名をUOCデータファイルに出力します。
-