class_name의 glo 클래스에 filename에 의한 파일로 glo 객체를 만든다. glo 컬럼을 파일로 로드하거나 glo 컬럼에 데이터를 저장(save)할 파일 이름을 filename에 지정한다. filename이 NULL인 경우 glo 객체만을 생성한다(cci 2.3 이상).
int cci_glo_new(int conn_handle, char *class_name, char *filename, char *oid_str, T_CCI_ERROR *err_buf)
CCI에서 glo 데이터 타입을 사용하기 위해서는 기본적으로 cci_glo_new(), cci_glo_save(), cci_glo_load() 함수가 사용된다. 다음은 string 타입의 name 컬럼과 glo 타입의 photo 컬럼이 있는 person 테이블에 대하여, a.out이라는 파일을 glo 객체로 photo 컬럼에 저장하는 예제이다.
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "cas_cci.h"
extern int errno;
int main() {
char oid_str[24] = {0x00};
char *query = "insert into person(name, photo) values(?,?);";
char *i_filename = "a.out";
int con, ret, req;
int fd = -1;
T_CCI_ERROR err_buf;
con = ret = req = 0;
con = cci_connect("localhost", 30000, "testdb", "dba", "");
if (con < 0){
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
return -1;
}
// Getting OID values from "glo" table
ret = cci_glo_new(con, "glo", i_filename, oid_str, &err_buf);
if (ret < 0){
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
req = cci_prepare(con, query, CCI_PREPARE_INCLUDE_OID, &err_buf);
if (req < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
ret = cci_bind_param(req, 1, CCI_A_TYPE_STR, i_filename, CCI_U_TYPE_CHAR, (char)NULL);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
// Binding OID values
ret = cci_bind_param(req, 2, CCI_A_TYPE_STR, oid_str, CCI_U_TYPE_OBJECT, (char)NULL);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
ret = cci_execute(req, 0, 0, &err_buf);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
ret = cci_end_tran(con, CCI_TRAN_COMMIT, &err_buf);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
cci_disconnect(con, &err_buf);
return 1;
}
다음은 CCI를 통해 데이터베이스에 저장된 데이터를 파일 시스템의 b.out으로 카피하는 예제이다.
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "cas_cci.h"
extern int errno;
int main() {
char *oid_str;
char *query = "select photo from person where name = 'a.out'";
char *o_filename = "b.out";
int con, ret, req, ind;
int fd = -1;
T_CCI_ERROR err_buf;
con = ret = req = 0;
con = cci_connect("localhost", 30000, "testdb", "dba", "");
if (con < 0){
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
return -1;
}
req = cci_prepare(con, query, CCI_PREPARE_INCLUDE_OID, &err_buf);
if (req < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
ret = cci_execute(req, 0, 0, &err_buf);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
ret = cci_cursor(req, 1, CCI_CURSOR_CURRENT, &err_buf);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
ret = cci_fetch(req, &err_buf);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
ret = cci_get_data(req, 1, CCI_A_TYPE_STR, &oid_str, &ind);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
// opening b.out
fd = open(o_filename, O_CREAT | O_RDWR | O_TRUNC);
if (fd < 0) {
perror(o_filename);
return -1;
}
// copying glo data from database to the fd
ret = cci_glo_load(con, oid_str, fd, &err_buf);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
printf("TDBG : %s:%d \n", __FILE__, __LINE__);
cci_disconnect(con, &err_buf);
close(fd);
return -1;
}
close(fd);
ret = cci_end_tran(con, CCI_TRAN_COMMIT, &err_buf);
if (ret < 0) {
printf("%d:%s\n", err_buf.err_code, err_buf.err_msg);
cci_disconnect(con, &err_buf);
return -1;
}
cci_close_req_handle(req);
cci_disconnect(con, &err_buf);
return 1;
}