안녕하세요
제가 Solaris&Oracle 용 데몬소스를 Linux&PostgreSQL 로 변경하는 플젝을 하고 있습니다.
PostgreSQL 구문이 Oracle 과 비슷해보여 어렵지 않을것을 예상했는데 지금은 OTL... ㅜㅜ
일단 여기저기 찾아봐서 .pc 로 되어 있던 Oracle embedded 파일 확장자를 .pgc 로 변경후에
ecpg -t 컴파일로 .c 파일까지 만들었습니다.
여기까진 소스를 조금 수정해서 어렵지 않게 왔는데
g++ 컴파일러로 PostgreSQL 헤더와 lib를 include 하고
기타 flag(-lpgport -lz -lreadline -ltermcap -lcrypt -lxml2 -lresolv -lnsl -ldl -lm -lbsd -lecpg -lpq)와
원소스 라이브러리를 포함하여 컴파일하는데
expected primary-expression before struct 와 같은 에러가
DECLARE 선언부의 typedef struct 구조체에 varchar 타입으로 선언된 변수가 사용되는 곳에서 발생했습니다.
그래서 varchar 타입을 char 로 변경하니 expected 에러는 안나고 varchar 타입속성(arr, len) 에 따른 에러가 나오길래
char 타입의 임시변수에 varchar 타입 변수를 sprintf() 를 사용하여 넘기니까 에러가 발생하지 않았습니다.
쿼리 where 조건절에 값만 들어가면 된다고 생각해서 위와 같은 꼼수로 넘어가려고 했는데
FETCH(SELECT) ~ INTO 쿼리에 INTO 절 변수에 long 타입 변수가 사용되는 부분에서 발생되는 excepted 에러가 조치가 안되서
꼼수로도 해결이 안되고 있는 상황입니다.
EXEC SQL BEGIN DECLARE SECTION;
typedef struct {
varchar calllist_keep_term_ymd [14];
long cti_seq_dt;
} CONFIG_T;
CONFIG_T sv_config;
EXEC SQL END DECLARE SECTION;
구조체는 위와 같이 선언하고 아래와 같은 쿼리에서 사용했는데
EXEC SQL FETCH cursor INTO :sv_config.calllist_keep_term_ymd;
EXEC SQL FETCH cursor INTO :sv_config.cti_seq_dt;
어떠 부분이 문제가 되는지 확인이 안되고 있습니다.
http://www.enterprisedb.com/docs/en/8.4/pg/ecpg.html 에 보니까 ecpg 컴파일이 원래 C와 C++ 에서 동작은 하지만
아직 모든 C++ 구조를 해석하진 못한다고 되어있는데 이거와도 연관이 있는지도 모르겠네요.
혹시 저와 비슷한 경우를 경험하신분이나 다른 부분에 있어 도움이 될만한 분들의 조언 부탁 드리겠습니다.
감사합니다. |