개요
본 문서는 APRE*C/C++ 의 새로운 기능과 변경사항 및 SESC 에서 APRE 로 업그레이드하는 절차에 대해 설명한다.
문서의 기준은 APRE*C/C++ 의 Altibase 7.3 기준으로 작성되었다.
문서의 이해를 돕기 위해 아래 기술문서를 함께 참조하는 것을 권장한다.설명한다
APRE*C/C++
Altibase 의 임베디드 SQL 전처리기에 대하여 설명한다. 요약 형태의 설명으로 기능에 대한 상세 사용법과 같은 구체적인 사항은 [Altibase Precompiler 가이드] 를 참고하도록 한다.
용어 설명
본 문서에서 사용하는 용어에 대하여 간단히 설명한다.
- 임베디드 SQL 전처리기
내장 SQL(Embedded SQL)이 포함된 소스코드를 입력받아 해당 내장 SQL을 실행시간 라이브러리 함수 호출로 변환한 소스코드를 생성하는 프로그램. 전처리 범위를 결정한다 - SES*C/C++
Altibase 5.1.5 이하 버전의 임베디드 SQL 전처리기의 약어로, 소스코드로 C 와 C++ 을 지원한다.
- APRE*C/C++
Altibase 5.3.3 이상 버전의 임베디드 SQL 전처리기의 약어로, 소스코드로 C 와 C++ 을 지원한다.
New Features 요약
SES*C/C++ 에 존재하던 다수의 제약을 대폭 개선하였다.
기능 업데이트 수준을 넘어서는 업그레이드를 적용하면서 명칭 또한 APRE*C/C++(Altibase C/C++ 임베디드 SQL 전처리기) 로 변경되었다.
APRE*C/C++ 에 새롭게 추가된 기능은 아래와 같다.
- 매크로 처리를 위한 Partial C Preprocessor 탑재
- 호스트 변수 선언부 외부의 호스트 변수 선언을 위한 C Parser 탑재
- 호스트 변수 선언 방식 및 사용 제약 완화를 위한 라이브러리 재작성
- DECLARE STATEMENT 구문 지원
이와 더불어 아래와 같은 개선을 하였다.
- WHENEVER 구문 사용 시 함수 호출 가능
- APRE*C/C++ 실행파일(apre) 명령 옵션 변경 및 추가
- 에러메시지 출력 형태 변경
- RETURNING INTO 절을 지원
- FREE 구문은 더 이상 지원하지 않으며 DISCONNECT 구문 사용
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 구문 사용 시 함수 호출 가능
WHENEVER <condition> DO <function> 와 같은 형태로 WHENEVER 구문 사용 시 특정 함수를 호출할 수 있게 개선되었다.
- APRE*C/C++ 실행파일(apre) 명령 옵션 변경
-I
-include 옵션으로써 -I 로 명칭이 변경되었다.
precompile 시 include 한 소스코드 파일의 경로를 명시한다.
이 옵션은 코드 내의 EXEC SQL OPTION(INCLUDE=library_path)와 같은 기능을 한다.
- APRE*C/C++ 실행파일(apre) 명령 옵션 추가
-D
전처리(Preprocess)시 사용될 매크로를 선언한다. 이 옵션은 코드 내의 #define 과 같은 기능을 한다.-keyword
예약된 키워드들을 보여준다.
- -parse parsing_mode
a. 파싱모드(parsing_mode)를 지정하여 소스파일에 대한 전처리 범위를 결정한다.
b. -parse 옵션의 파싱모드와 그에 따른 처리범위는 아래와 같다.
c. -parse 옵션 자체를 생략한 경우는 기본적으로 파싱모드가 partial 로 작동한다.
| 파싱모드 | 내장 SQL(A) | 매크로(B) | 선언부외부 / 호스트 변수(C) | 비고 |
|---|---|---|---|---|
| none | O | X | X | SES*C/C++ 와 동일하게 작동 |
| partial | O | O | X | Partial C Processor 추가 작동 |
| full | O | O | O | C Parser가 추가 작동 |
[#include 형식의 헤더파일까지 처리] 의 경우, 해당 헤더파일 내의 #include 형식으로 선언한 또 다른 헤더파일까지도 모두 처리된다.
예를 들어, 위 예제에서의 쿼리를 아래와 같이 매크로를 사용한 선택적인 쿼리로 변경 후
파싱옵션을 생략하여 기본 파싱모드인 partial 로 precompile 할 경우
실제 생성코드는 아래와 같이 매크로 처리가 완료된 상태로만 남게 된다. (매크로 처리 후 불필요하여 제거된 부분은 공백으로 치환된다.)
기존 SES*C/C++ 와 동일하게 precompile 하기 위해 -parse none 을 지정한 경우에는 매크로 처리 기능이 작동하지 않음으로 변수 중복선언 에러가 발생한다.
유의사항
SES*C/C++ 에서 APRE*C/C++ 로 변경 시 다음의 내용에 대하여 유의 하여야 한다.
문법(syntax)강화
기존 SES*C/C++ 는 코드에서 EXEC SQL BEGIN/END DECLARE/ARGUMENT SECTION 을 기술할 경우, 종결자인 “ ; ” 이 누락되어도 무관하였으나 APRE*C/C++ 는 반드시 “ ; “ 가 있어야 한다.
이는 타 DBMS 전처리기와 동일한 제약 사항이다.
아래는 END DECLARE SECTION 에 종결자를 기재하지 않은 경우의 에러이다.
- C++ 스타일의 소스코드 precompile
호스트 변수 선언부외부에 호스트 변수를 사용하기 위해서는 parse 옵션의 모드를 full 로 해야 한다.
하지만, 파싱모드를 full 로 설정하면 C 파서가 동작하기 때문에 C++ 스타일의 소스코드는 전처리중 각종 파싱에러를 발생시킬 수 있다.
즉, C++ 스타일로 작성된 소스코드는 호스트 변수 선언부에만 호스트 변수를 선언하고, -parse옵션을 사용할 경우 파싱모드를 partial 또는 none 으로 해야 한다.
- -D, -I 옵션
C/C++ 컴파일 단계에서 –D, -I 옵션을 사용한다면 대부분의 경우 APRE*C/C++ 를 통한 전처리 단계에서도 동일한 옵션을 주어야 올바른 전처리가 가능하다.
참고사항
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 로 변경됐다.
하위 호환성이 고려되었기에 기존 이름을 사용해도 무방하다.
변경사항
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++ 로 업그레이드 시 절차는 아래와 같다.
변경사항 섹션의 표를 참조, 아래와 같은 명령문 수행, 링크옵션, 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 라이브러리 인터페이스 변경으로 인해 컴파일이 되지 않을 수 있다.
이 경우는 기존 소스코드에서 관련코드를 모두 제거하여야만 한다.
Precompiler 의 라이브러리 interface 는 변경이 잦은 내부적인 요소로써 원칙적으로 사용자의 직접적인 사용을 금한다.
따라서, precompile 된 소스코드를 분석, 사용자 임의로 소스코드에 관련 매크로, 구조체 및 함수를 사용하면서 추후 발생되는 오류는 책임지지 않는다.