FAQ
dlopen/dlsym 을 이용한 .so 의 altibase 연결및 쿼리수행 예제
분류 프로그래밍 등록일 2013-07-09 조회수 2828


/**
*** main.cpp
**/
#include
#include
#include
#include

main()
{

/*
** alti.so 를 호출합니다.
*/
void *handle2 = dlopen("./alti.so", RTLD_LAZY);
if (!handle2) printf("dlopen : %s\n", dlerror());

/*
** DB 연결함수를 호출합니다.
*/
typedef void (*conn_t)();
conn_t conn = (conn_t)dlsym(handle2, "Alticonn");
if (!conn) {
printf("call conn error\n");
dlclose(handle2);
exit(-1);
}

/*
** UPDATE 함수를 호출합니다.
*/
typedef void (*up_t)(int);
up_t updateT1 = (up_t)dlsym(handle2, "UpdateT1");
if (!updateT1) {
printf("call conn error\n");
dlclose(handle2);
exit(-1);
}

/* 실제 연결후 sql을 수행해봅니다. */
conn();
updateT1(10);

dlclose(handle2);
}


/*
** alti.so alti.sc
*/
extern "C" void Alticonn() {
EXEC SQL BEGIN DECLARE SECTION;
char usr[10];
char pwd[10];
EXEC SQL END DECLARE SECTION;

strcpy(usr, "SYS");
strcpy(pwd, "MANAGER");

EXEC SQL CONNECT :usr IDENTIFIED BY :pwd;
if (sqlca.sqlcode != 0)
{
printf("%d:%s\n", SQLCODE, sqlca.sqlerrm.sqlerrmc);
exit(-1);
}

printf("CONNECT SUCCESS, check server status session all\n");
}


extern "C" void UpdateT1(int X) {

EXEC SQL BEGIN ARGUMENT SECTION;
int X;
EXEC SQL END ARGUMENT SECTION;

EXEC SQL UPDATE T1 SET C1 = :X ;
if (sqlca.sqlcode != 0)
{
printf("%d:%s\n", SQLCODE, sqlca.sqlerrm.sqlerrmc);
exit(-1);
}

EXEC SQL COMMIT;
printf("CHECK T1 table : C1 = %d\n", X);
}



/*
** Makefile (썬용이며 다른 OS를 쓴다면 ld 사용시 시스템라이브러리가 변경되어야
** 만합니다.
*/
BINS: alti.so main

all: $(BINS)

alti.so: alti.sc
sesc -t cpp alti.sc
CC -c alti.cpp -I${ALTIBASE_HOME}/include
ld -shared alti.o -o alti.so -L${ALTIBASE_HOME}/lib -lsesc -lodbccli -
lthread -lposix4 -ldl -lkvm -lkstat -lsocket -lnsl -lgen


main: main.cpp
CC -o main main.cpp -ldl


clean:
rm *.o core main alti.so
목록