개요
본 문서는 SES*C/C++의 후속버전인 APRE*C/C++의 새로운 기능과 변경사항 및 업그레이드 절차에 대해 설명한다.
문서에 언급하지 않은 구체적인 사항은 [Altibase Precompiler 가이드] 를 참고하도록 한다.
문서의 기준은 APRE*C/++가 최초 제공되는 Altibase 5.3.3 버전을 기준으로 작성되었고, 문서상의 실행결과는 5.3.3.15 버전에서 수행한 결과이다.
문서의 이해를 돕기 위해 아래 기술문서를 함께 참조하는 것을 권장한다.
APRE*C/C++
Altibase의 새로워진 Precompiler of Embedded SQL에 대하여 설명한다. 요약형태의 설명으로 기능에 대한 상세사용법과 같은 구체적인 사항은 [Altibase Precompiler 가이드] 를 참고하도록 한다.
용어설명
본 문서에서 사용하는 용어에 대하여 간단히 설명한다.
- Precompiler of Embedded SQL
내장 SQL(Embedded SQL)이 포함된 소스코드를 입력 받아, 해당 내장 SQL을 실행시간 라이브러리 함수 호출로 변환한 소스코드를 생성하는 프로그램
- SES*C/C++
Altibase 5.1.5 이하 버전의 Precompiler of Embedded SQL의 약어로 소스코드로 C와 C++을 지원한다.
- APRE*C/C++
Altibase 5.3.3 이상 버전의 Precompiler of Embedded SQL의 약어로 소스코드로 C와 C++을 지원한다. SES*C/C++와 비교하여 업그레이드 수준의 기능이 개선되었다.
도입배경
SES*C/C++는 아래와 같은 다수의 제약을 가지고 있어 사용상에 불편함이 있었다.
- 매크로(Macro) 처리 제약
- 호스트변수 선언부(DECLARE SECTION) 외부에 호스트변수 선언 불가
- 호스트변수 선언방식 및 사용 제약
- 일부 표준 내장 SQL구문 미 지원
Altibase 사용자에게 Precompiler of Embedded SQL을 통한 개발편의성을 제공하기 위해서 이러한 제약은 우선적으로 개선되어야 할 사항이다.
New Features 요약
SES*C/C++에 존재하던 다수의 제약을 대폭 개선하였다.
기능 업데이트 수준을 넘어서는 업그레이드를 적용하면서 명칭 또한 APRE*C/C++(Altibase C/C++ Precompiler of Embedded SQL)로 변경되었다.
APRE*C/C++에 새롭게 추가된 기능은 아래와 같다.
- 매크로 처리를 위한 Partial C Preprocessor 탑재
- 호스트변수 선언부 외부의 호스트변수 선언을 위한 C Parser 탑재
- 호스트변수 선언방식 및 사용제약 완화를 위한 라이브러리 재 작성
- DECLARE STATEMENT 구문 지원
이와 더불어 아래와 같은 개선을 하였다.
- WHENEVER 구문 사용시 함수 호출 가능
- APRE*C/C++ 실행파일(apre) 명령옵션 변경 및 추가
- 에러메세지 출력형태 변경
New Features 상세
APRE*C/C++에 추가된 새로운 기능은 다음과 같다.
- Partial C Preprocessor 탑재
아래와 같은 대부분의 매크로가 선언영역에 대한 제한 없이 처리가 가능하게 되었다.
#include, #define #if, #ifdef, #ifndef, #endif, #else, #elif
C Parser 탑재
소스코드를 C로 작성하는 경우에 한하여 호스트변수 선언부 외부(DECLARE SECTION)에서도 호스트변수 선언이 가능하게 되었다.
- 호스트변수 선언방식 및 사용제약 완화
호스트변수 사용과 관련된 다수의 제약이 제거되었다. 상세내용은 아래와 같다.
호스트변수 선언과 동시에 초기값을 할당 가능
typedef 후 구조체 정의 가능 (역으로도 가능)
내장 SQL문에서 배열형의 호스트변수 사용 시 배열요소 지정 가능
char *, struct * 외의 다른 데이터형도 포인터형 호스트변수로 사용 가능
SELECT 구문의 INTO절에 ":" 없이 출력용 호스트변수 사용 가능
FOR 절이 포함된 내장 SQL의 입력 호스트변수가 배열 타입이 아니더라도 사용 가능
유니온(Union)형의 호스트변수 사용 가능
DECLARE STATEMENT 구문 추가지원
표준 Embedded SQL 구문으로 DECLARE STATEMENT 구문을 지원한다.
다른 내장 SQL 구문에 사용될 수 있도록 SQL 구문이나 PL/SQL 블럭에 대한 식별자를 선언할 수 있다.
WHENEVER 구문 사용시 함수 호출 가능
WHENEEVER <condition> DO <function> 와 같은 형태로 WHENEVER 구문 사용시 특정 함수를 호출할 수 있게 개선되었다.
- APRE*C/C++ 실행파일(apre) 명령옵션 변경
-I
기존 SES*C/C++ 에서 -include 옵션으로 제공되던 옵션으로써 -I 로 명칭이 변경되었다.
precompile시 include한 소스코드 파일의 경로를 명시한다.
이 옵션은 코드 내의 EXEC SQL OPTION (INCLUDE=library_path)와 같은 기능을 한다.
- APRE*C/C++ 실행파일(apre) 명령옵션 추가
-D
전처리(Preprocess) 시 사용될 매크로를 선언한다. 이 옵션은 코드 내의 #define과 같은 기능을 한다.-keyword
예약된 키워드들을 보여준다.-parse parsing_mode
파싱모드(parsing mode)를 지정하여 소스파일에 대한 precompile 범위를 결정한다.
-parse 옵션의 파싱모드와 그에 따른 처리범위는 아래와 같다.
-parse 옵션 자체를 생략한 경우는 기본적으로 파싱모드가 partial로 작동한다.파싱모드 내장 SQL(A) 매크로(B) 선언부외부/호스트변수(C) 비고 none O X X SES*C/C++와 동일하게 작동
#include 형식의 헤더파일은 처리하지 않음
partial O O X Partial C Processor 추가 작동
#include 형식의 헤더파일까지 처리
APRE*C/C++의 기본 파싱모드
full O O O C Parser가 추가 작동
#include 형식의 헤더파일까지 처리
단, C++ 스타일로 작성된 소스코드는 선언부외부 호스트변수 인식불가
[#include 형식의 헤더파일까지 처리] 의 경우, 해당 헤더파일 내의 #include 형식으로 선언한 또 다른 헤더파일까지도 모두 처리된다.
예를 들어, 위 예제에서의 쿼리를 아래와 같이 매크로를 사용한 선택적인 쿼리로 변경 후
파싱옵션을 생략하여 기본 파싱모드인 partial로 precompile 할 경우
실제 생성코드는 아래와 같이 매크로 처리가 완료된 상태로만 남게된다.(매크로 처리 후 불필요하여 제거된 부분은 공백으로 치환된다)
기존 SES*C/C++와 동일하게 precompile 하기 위해 -parse none을 지정한 경우에는 매크로 처리기능이 작동하지 않음으로 변수 중복선언 에러가 발생한다.
유의사항
SES*C/C++에서 APRE*C/C++로 변경 시 다음의 내용에 대하여 유의 하여야 한다.
문법(syntex)강화
기존 SES*C/C++는 코드에서 EXEC SQL BEGIN/END DECLARE/ARGUMENT SECTION을 기술할 경우, 종결자인 “ ; ” 이 누락되어도 무관하였으나 APRE*C/C++는 반드시 “ ; “ 가 있어야 한다.
이는 타 DBMS Precompiler와도 동일한 제약사항이다.
아래는 END DECLARE SECTION에 종결자를 기재하지 않은 경우의 에러이다.
- C++ 스타일의 소스코드 precompile
호스트변수 선언부외부에 호스트변수를 사용하기 위해서는 parse 옵션의 모드를 full로 해야 한다.
하지만, 파싱모드를 full로 설정하면 C 파서가 동작하기 때문에 C++ 스타일의 소스코드는 전처리 중 각종 파싱에러를 발생시킬 수 있다.
즉, C++ 스타일로 작성된 소스코드는 SES*C/C++와 같이 호스트변수 선언부에만 호스트변수를 선언하고, -parse 옵션을 사용할 경우 파싱모드를 partial 또는 none으로 해야 한다.
- -D, -I 옵션
C/C++ 컴파일 단계에서 –D, -I 옵션을 사용한다면 대부분의 경우 APRE*C/C++를 통한 precompile 단계에서도 동일한 옵션을 주어야 올바른 precompile이 가능하다.
참고사항
SES*C/C++에서 APRE*C/C++로 변경 시 다음의 내용을 참고해야 한다.
- -I 옵션
기존처럼 -include 로 사용하여도 무방하나 향후 유지보수를 고려하여 새로운 옵션으로 변경하여 사용하는 것을 권장한다.
- 이진 데이터 타입 변경
기존에 사용되었던 SES_CLOB, SES_BLOB, SES_BINARY, SES_BYTES, SES_NIBBLE 타입의 이름이 APRE_CLOB, APRE_BLOB, APRE_BINARY, APRE_BYTES, APRE_NIBBLE로 변경됐다.
하위 호환성이 고려되었기에 기존 이름을 사용해도 무방하다.
precompile 수행시간
SES*C/C++와 비교하여 precompile 수행시간이 다소 느려졌다.
아래는 Altibase 설치 시 제공되는 sample 예제 arrays1.sc(약 450 lines)를 SES*C/C++, APRE*C/C++로 각각 precompile을 수행한 시간을 측정한 결과이다.SES C/C++ APRE C/C++ 위 측정결과는 IBM AIX5.3 (Power5 1898 MHz 1EA)에서 precompile한 결과로 실제수행속도는 OS 환경에 따라 달라질 수 있다.
변경사항
SES*C/C++ 환경에서 ARPE*C/C++ 로의 업그레이드 시 고려사항과 절차에 대해 설명한다.
변경사항
SES*C/C++에서 APRE*C/C++ 로 명칭이 변경되면서 아래와 같이 실행파일, 헤더파일, 라이브러리파일, 링크옵션, 실행파일 명령옵션 명칭이 일부 변경되었다.
구분 | SES*C/C++ | APRE*C/C++ | 관련 파일 경로 | 비고 |
---|---|---|---|---|
실행파일 | sesc | apre | $ALTIBASE_HOME/bin | 변경 |
헤더파일 | ses.h | ulpLibInterface.h | $ALTIBASE_HOME/include | 변경 |
라이브러리파일 | libsesc.a | libapre.a | $ALTIBASE_HOME/lib | 변경 |
libsesc_sl.so | libapre_sl.so | $ALTIBASE_HOME/lib | 변경 | |
링크옵션 | -lsesc | -lapre | - | 변경 |
실행파일 명령옵션 | -include | -include or -I | - | 추가 |
위 변경사항은 하위 호환성이 고려되어 있어 별도로 조치할 사항은 없으나, 향후 유지보수를 위해 실행파일명과 링크옵션은 APRE*C/C++ 방식으로 변경을 권장한다.
또한, 필수적인 요소는 아니나 -include 옵션의 경우도 -I로 변경하는 것을 권장한다.
업그레이드 절차
SES*C/C++ 개발환경에서 APRE*C/C++로 업그레이드시의 절차는 아래와 같다.
APRE*C/C++ 버전확인
기본적으로 최신버전의 APRE*C/C++를 사용하는 것을 권장하며 아래 버그들 반영을 고려하여 최소 5.3.3.15 이상을 사용하여야 한다.
BUG-28392 Direct Execute 실패 시 메모리 증가 (fixed 5.3.3.5)
BUG-28588 null fetch시 statement 해제하지 않음 (fixed at 5.3.3.6)
BUG-29745 SELECT 컬럼 절에 숫자가 있을 때 커서사용 시 접속해제가 발생
BUG-29903 prepare 실패를 반복 시 메모리 증가 (fixed at 5.3.3.15)- 컴파일 옵션 수정
변경사항 섹션의 표를 참조, 아래와 같은 명령문 수행, 링크옵션, makefile과 같은 컴파일 파일의 옵션을 수정한다.
실행파일명 변경
링크옵션 변경
makefile
변경 관련파일이 쉽게 파악되지 않거나 양이 많아 일일이 수정할 수 없는 경우는 위 예시의 절차를 생략할 수 있지만 가급적 관련 명칭을 변경하는 정상적인 업그레이드 수행을 권장한다.
유의사항
SEC*C/C++에서 APRE*C/C++로 업그레이드 시 유의사항을 기술한다.
- -parse none 옵션 추가
APRE*C/C++ -> [유의사항] 섹션에서 언급한 문법강화로 인한 사항이 아닌데도 SES*C/C++에서는 이상없이 precompile되던 소스코드가 APRE*C/C++에서는 에러가 발생할 수 있는데,
이 경우는 APRE*C/C++의 파싱모드가 기본적으로 partial 이기 때문에 #include 방식으로 포함된 헤더파일까지 매크로처리를 하면서 발생하는 오류일 가능성이 높다.
따라서, 에러발생 원인을 쉽게 알 수 없다면 SES*C/C++와 동일하게 precompile을 하기 위한 -parse none 옵션을 추가하여 일차적인 확인을 하는 과정이 필요하다.
- Precompiler 라이브러리 사용으로 인한 오류
기존의 소스코드가 SES*C/C++ 라이브러리를 직접적으로 사용하도록 작성되었다면 Precompiler 라이브러리 interface 변경으로 인해 컴파일이 되지 않을 수 있다.
이 경우는 기존 소스코드에서 관련코드를 모두 제거하여야만 한다.
Precompiler의 라이브러리 interface는 변경이 잦은 내부적인 요소로써 원칙적으로 사용자의 직접적인 사용을 금한다.
따라서, precompile된 소스코드를 분석, 사용자 임의로 소스코드에 관련 매크로, 구조체 및 함수를 사용하면서 추후 발생되는 오류는 책임지지 않는다.