スケーラブルデータベースサーバ HiRDB Version 8 コマンドリファレンス(UNIX(R)用)

[目次][索引][前へ][次へ]

8.10.5 UOCの使用例

ここでは,UOCを使用した表の再編成,及び表のアンロードの例について説明します。

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

<この項の構成>
(1) UOCを使用した表の再編成の例
(2) UOCを使用した表のアンロードの例

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

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

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

[説明]
  1. 制御情報ファイルに指定したユーザパラメタを,UOC内の変数に展開します。
  2. INTEGER,CHARの列データは,文字形式でUOCデータファイルに出力します。
  3. BLOB列のデータは,行単位にファイルに出力し,ファイル名をUOCデータファイルに出力します。