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データファイルに出力します。
-