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