TECH
QUESTION
자주하는 질문답변 입니다.
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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |