Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-16
제목 여러 개의 IMAGE FILE을 LONGRAW에 올리는 예제
여러 개의 IMAGE FILE을 LONGRAW에 올리는 예제
===========================================

여러 개의 IMAGE FILE을 LONGRAW에 올리는 예제입니다.

#include
#include

typedef struct TAGmy_raw {
long len;
unsigned char arr[1];
} my_raw;

VARCHAR username[20];
VARCHAR password[20];
EXEC SQL TYPE my_raw IS LONG VARRAW(1000000000) REFERENCE;
EXEC SQL INCLUDE sqlca;
my_raw *buffer;
long FILESIZE;
void sqlerror(); /* handles unrecoverable errors */
FILE *fp;
FILE *fl;

main()
{
int res;
int i=0,j;
char name[100];
char bu_name[100];
int len=0;

memset(bu_name,'\0',100);

strcpy(username.arr, "scott");
username.len = strlen(username.arr);
strcpy(password.arr, "tiger");
password.len = strlen(password.arr);

/*insert를 수행할 File들의 목록을 얻어서 imagelist라는file에 넣어둔다.
*/
/*insert를 수행할 file들이 /usr/img안에 들어 있다고 가정한다.
*/

system("rm /usr/img/imagelist");
system("ls /usr/img/*.jpg > imagelist");

/*imagelist file을 연다.*/

fl=fopen("imagelist", "r");
if ( fl == NULL ) {
printf( "unable to open input file\n");
exit(1);
}


EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC SQL CONNECT :username IDENTIFIED BY :password;
EXEC SQL WHENEVER SQLERROR DO sqlerror();

/* imagelist file에서 insert할 file을 하나씩 읽어서 database에 넣어
준다. */
/* 이 작업을 loop를 돌면서
수행한다. */

while(1) {
fgets(bu_name, 80, fl);
j=0;

memset(name,'\0',100);
/* file의 이름을 받아 온것에서 space와 carige return 값을 제거 하기 위한
작업 *?
while(1)
{
if(bu_name[j]=='.')
{
strcat(name+j,".jpg");
break;
}
else
{
name[j]=bu_name[j];
}
j++;
}


if(feof(fl)) { fclose(fl) ; break; }

fp=fopen(name,"r");

if ( fp == NULL ) {
printf( "Unable to open Image File\n");
exit(1);
}
i++;
printf( "Input Poto File \n");
rewind(fp);
printf("well done\n");
res = fseek(fp,0, SEEK_END);
FILESIZE = ftell (fp);
printf("FILE Size/ %d\n", FILESIZE);
buffer = (my_raw *)malloc(sizeof(my_raw)+FILESIZE);
memset(buffer,0, sizeof(my_raw)+FILESIZE);
res = fseek(fp,0,SEEK_SET);
fread(buffer->arr, 1, FILESIZE, fp);
buffer->len = FILESIZE;

EXEC SQL INSERT INTO POTO_DATA VALUES (:i, :buffer);
EXEC SQL COMMIT WORK RELEASE;

printf("Finish Insert File \n");
fclose(fp);
} /* End of While */
}

void sqlerror()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf("\nORACLE error detected:\n");
printf("\n% .70s \n", sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
}


<주의 !>
64-bits machine의 경우에는 len의 type을 long에서 int로 바꾸어 주어야 합니다.

typedef struct TAGmy_raw {
int len;
unsigned char arr[1];
} my_raw;
Comment
등록된 코멘트가 없습니다.