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