Skip to end of metadata
Go to start of metadata

 

개요


본 문서는 SES*C/C++의 후속버전인 APRE*C/C++의 새로운 기능과 변경사항 및 업그레이드 절차에 대해 설명한다.

문서에 언급하지 않은 구체적인 사항은 [Altibase Precompiler 가이드] 를 참고하도록 한다.

문서의 기준은 APRE*C/++가 최초 제공되는 Altibase 5.3.3 버전을 기준으로 작성되었고,  문서상의 실행결과는 5.3.3.15 버전에서 수행한 결과이다.

 

문서의 이해를 돕기 위해 아래 기술문서를 함께 참조하는 것을 권장한다.

 

Icon

이 문서와 관련된 오류 및 개선사항은 기술지원포털 또는 기술지원센터로 문의주시기 바랍니다.

Icon

이 문서는 정보 제공을 목적으로 제공되며, 사전에 예고 없이 변경될 수 있습니다. 이 문서는 오류가 있을 수 있으며, 상업적 또는 특정 목적에 부합하는 명시적, 묵시적인 책임이 일절 없습니다. 이 문서에 포함된 Altibase 제품의 특징이나 기능의 개발, 발표 등의 시기는 Altibase 재량입니다. Altibase는 이 문서에 대하여 관련된 특허권, 상표권, 저작권 또는 기타 지적 재산권을 보유할 수 있습니다.

 

 

 

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 상세


Partial C Preprocessor 탑재

아래와 같은 대부분의 매크로가 선언영역에 대한 제한 없이 처리가 가능하게 되었다.

(tick) #include, #define #if, #ifdef, #ifndef, #endif, #else, #elif

1.Partial C Preprocessor 탑재

C Parser 탑재

소스코드를 C로 작성하는 경우에 한하여 호스트변수 선언부 외부(DECLARE SECTION)에서도 호스트변수 선언이 가능하게 되었다.
C parse 탑재

호스트변수 선언방식 및 사용제약 완화

호스트변수 사용과 관련된 다수의 제약이 제거되었다.
상세내용은 아래와 같다.

  • 호스트변수 선언과 동시에 초기값을 할당 가능
    호스트변수_선언과_동시에_초기값을_할당_가능

  • typedef 후 구조체 정의 가능 (역으로도 가능)
    typedef_후_구조체_정의_가능

  • 내장 SQL문에서 배열형의 호스트변수 사용 시 배열요소 지정 가능
    내장_SQL문에서_배열형의_호스트변수_사용

  • char *, struct * 외의 다른 데이터형도 포인터형 호스트변수로 사용 가능
    point_외의_다른_데이터형도_포인터형_호스트변수로_사용가능

  • SELECT 구문의 INTO절에 ":" 없이 출력용 호스트변수 사용 가능
    select_구문의into절에_표시없이_호스트변수_사용가능

  • FOR 절이 포함된 내장 SQL의 입력 호스트변수가 배열 타입이 아니더라도 사용 가능
    for_절의_입력_호스트변수가_배열_타입이_아니더라도_사용가능

  • 유니온(Union)형의 호스트변수 사용 가능
    유니온형의_호스트변수_사용가능

 

DECLARE STATEMENT 구문 추가지원

표준 Embedded SQL 구문으로 DECLARE STATEMENT 구문을 지원한다.
다른 내장 SQL 구문에 사용될 수 있도록 SQL 구문이나 PL/SQL 블럭에 대한 식별자를 선언할 수 있다.
declare_statement_구문_추가지원

WHENEVER 구문 사용시 함수 호출 가능

WHENEEVER <condition> DO <function> 와 같은 형태로 WHENEVER 구문 사용시 특정 함수를 호출할 수 있게 개선되었다. whenever구문_사용시_함수_호출가능

APRE*C/C++ 실행파일(apre) 명령옵션 변경

  1. -I
    기존 SES*C/C++ 에서 -include 옵션으로 제공되던 옵션으로써 -I 로 명칭이 변경되었다.
    precompile시 include한 소스코드 파일의 경로를 명시한다.
    이 옵션은 코드 내의 EXEC SQL OPTION (INCLUDE=library_path)와 같은 기능을 한다.
    전처리_시_사용될_매크로선언

  2. -keyword
    예약된 키워드들을 보여준다.
    예약된_키워드들을_보여줌

  3. -parse parsing_mode

    파싱모드(parsing mode)를 지정하여 소스파일에 대한 precompile 범위를 결정한다.
    -parse 옵션의 파싱모드와 그에 따른 처리범위는 아래와 같다.
    -parse 옵션 자체를 생략한 경우는 기본적으로 파싱모드가 partial로 작동한다.

    table_1
    [#include 형식의 헤더파일까지 처리] 의 경우, 해당 헤더파일 내의 #include 형식으로 선언한 또 다른 헤더파일까지도 모두 처리된다.

     

    main.sc_header.h

    예를 들어, 위 예제에서의 쿼리를 아래와 같이 매크로를 사용한 선택적인 쿼리로 변경 후
    매크로를_사용한_선택적인_쿼리로_변경후

    파싱옵션을 생략하여 기본 파싱모드인 partial로 precompile 할 경우
    partial로 preccompile_할_경우

    실제 생성코드는 아래와 같이 매크로 처리가 완료된 상태로만 남게된다.(매크로 처리 후 불필요하여 제거된 부분은 공백으로 치환된다)
    불필요한부분_공백

    기존 SES*C/C++와 동일하게 precompile 하기 위해 -parse none을 지정한 경우에는 매크로 처리기능이 작동하지 않음으로 변수 중복선언 에러가 발생한다.
    변수_중복선언_에러

 

 

유의사항


문법(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이 가능하다.

 

 

참고사항


-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을 수행한 시간을 측정한 결과이다.
sesc_apre_수행시간
위 측정결과는 IBM AIX5.3 (Power5 1898 MHz 1EA)에서 precompile한 결과로 실제수행속도는 OS 환경에 따라 달라질 수 있다.

 

 

 

 

변경사항


SES*C/C++ 환경에서 ARPE*C/C++ 로의 업그레이드 시 고려사항과 절차에 대해 설명한다.

 

 

 

변경사항


SES*C/C++에서 APRE*C/C++ 로 명칭이 변경되면서 아래와 같이 실행파일, 헤더파일, 라이브러리파일, 링크옵션, 실행파일 명령옵션 명칭이 일부 변경되었다.
명령옵션_명칭_일부변경
위 변경사항은 하위 호환성이 고려되어 있어 별도로 조치할 사항은 없으나, 향후 유지보수를 위해 실행파일명과 링크옵션은 APRE*C/C++ 방식으로 변경을 권장한다.

또한, 필수적인 요소는 아니나 -include 옵션의 경우도 -I로 변경하는 것을 권장한다.

 

 

업그레이드 절차


SES*C/C++ 개발환경에서 APRE*C/C++로 업그레이드시의 절차는 아래와 같다.

  1. APRE*C/C++ 버전확인
    apre_버전확인
    기본적으로 최신버전의 APRE*C/C++를 사용하는 것을 권장하며 아래 버그들 반영을 고려하여 최소 5.3.3.15 이상을 사용하여야 한다.

    (tick) BUG-28392 Direct Execute 실패 시 메모리 증가 (fixed 5.3.3.5)

    (tick) BUG-28588 null fetch시 statement 해제하지 않음 (fixed at 5.3.3.6)

    (tick) BUG-29745 SELECT 컬럼 절에 숫자가 있을 때 커서사용 시 접속해제가 발생
         BUG-29903 prepare 실패를 반복 시 메모리 증가 (fixed at 5.3.3.15)

  2. 컴파일 옵션 수정
    변경사항 섹션의 표를 참조, 아래와 같은 명령문 수행, 링크옵션, makefile과 같은 컴파일 파일의 옵션을 수정한다.
    • 실행파일명 변경
      실행파일명_변경
    • 링크옵션 변경
      링크옵션_변경
    • makefile
      makefile

변경 관련파일이 쉽게 파악되지 않거나 양이 많아 일일이 수정할 수 없는 경우는 위 예시의 절차를 생략할 수 있지만 가급적 관련 명칭을 변경하는 정상적인 업그레이드 수행을 권장한다.

 

유의사항


-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된 소스코드를 분석, 사용자 임의로 소스코드에 관련 매크로, 구조체 및 함수를 사용하면서 추후 발생되는 오류는 책임지지 않는다.

 

 




 

  • No labels