Real Alternative DBMS ALTIBASE, Since 1999 APRE*C/C++ New Features & 업그레이드가이드 ALTIBASE 5.3.3 2010. 05 Copyright c 2000~2013 ALTBASE Corporation. All Rights Reserved.
Document Control Change Record Date Author Change Reference 2010-05-04 durusari Created Reviews Date Name (Position) 2010-01-20 omegaman(sc), bluetheme(ts), hjkim(sc), fhan(sc) 2010-05-04 wlgml337(tc) Distribution Name Location APRE*C/C++ New Features & 업그레이드가이드 2 page of 14
목차 개요. 4 APRE*C/C++.. 5 용어설명 5 도입배경 5 New Features 요약.. 5 New Features 상세.. 6 유의사항. 10 참고사항. 11 SES*C/C++ 환경에서 APRE*C/C++ 로의업그레이드.. 12 변경사항. 12 업그레이드절차.. 12 유의사항. 13 APRE*C/C++ New Features & 업그레이드가이드 3 page of 14
개요 본문서는 SES*C/C++ 의후속버전인 APRE*C/C++ 의새로운기능과변경사항및업그레이드절차에대해설명한다. 문서에언급하지않은구체적인사항은 [Precompiler 매뉴얼 ] 을참고하도록한다. 문서의기준은 APRE*C/C++ 가제공되는 ALTIBASE 5.3.3 이며문서상의실행결과는 5.3.3.7 로수행한결과이다. 문서의이해를돕기위해아래기술문서를함께참조하는것을권장한다. ALTIBASE APRE(SES)*C/C++ makefile ALTIBASE Precompiler 개발가이드 (APRE*C/C++) APRE*C/C++ New Features & 업그레이드가이드 4 page of 14
APRE*C/C++ ALTIBASE 의새로워진 Precompiler of Embedded SQL 에대하여설명한다. 요약형태의설명으로기능에대한상세사용법과같은구체적인사항은 [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++ 는내장 SQL 만처리가가능하며이외에도아래와같은다수의제약을가지고있어사용상에불편함이있었다. 매크로 (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++ 에새롭게추가된기능은아래와같다. APRE*C/C++ New Features & 업그레이드가이드 5 page of 14
매크로처리를위한 Partial C Preprocessor 탑재. 호스트변수선언부외부의호스트변수선언을위한 C Parser 탑재. 호스트변수선언방식및사용제약완화를위한라이브러리재작성. DECLARE STATEMENT 구문추가지원. 이와더불어아래와같은개선을하였다. WHENEVER 구문사용시함수호출가능. APRE*C/C++ 실행파일 (apre) 명령옵션변경및추가. 에러메세지출력형태변경. New Features 상세 Partial C Preprocessor 탑재 아래와같은대부분의매크로가선언영역에대한제한없이처리가가능하게되었다. #include, #define, #if, #ifdef, #ifndef, #endif, #else, #elif #define ALTIBASE EXEC SQL INSERT INTO T1 VALUES #ifdef ALTIBASE ( :altibase ); #else ( :other_dbms ); #endif C Parser 탑재 소스코드를 C 로작성하는경우에한하여호스트변수선언부외부 (DECLARE SECTION) 에서도호스트변수선언이가능하게되었다. int i = 10; int j; int k; varchar vc[len]; EXEC SQL INSERT INTO T1 VALUES (:i, :j, :k, :vc); 호스트변수선언방식및사용제약완화 호스트변수사용과관련된다수의제약이제거되었다. 상세내용은아래와같다. 1. 호스트변수선언과동시에초기값을할당가능. APRE*C/C++ New Features & 업그레이드가이드 6 page of 14
int i = 10*10; char j[10] = "abcd"; 2. typedef 후구조체정의가능. ( 역으로도가능 ) typedef struct department department; struct department { short dno; char dname[30+1]; char dep_location[9+1]; }; 3. 내장 SQL 문에서배열형의호스트변수사용시배열요소지정가능. struct tag1 { int i1; int i2; } var1[10]; EXEC SQL INSERT INTO T1(I1, I2) VALUES(:var1[0].i1, :var1[0].i2); 4. char *, struct * 외의다른데이터형도포인터형호스트변수로사용가능. struct { int i; char c; } structvar; int *i_ptr = &structvar.i; char *c_ptr = &structvar.c; EXEC SQL SELECT i, c INTO :i_ptr, :c_ptr FROM TMP; 5. SELECT 구문의 INTO 절에 : 없이출력용호스트변수사용가능. char name[10]; EXEC SQL SELECT DEP_NAME INTO name FROM DEPT; 6. FOR 절의입력호스트변수가배열타입이아니더라도사용가능. int cnt = 1; int var1 = 10; EXEC SQL FOR :cnt INSERT INTO T1 VALUES (:var1); 7. 유니온 (Union) 형의호스트변수사용가능. APRE*C/C++ New Features & 업그레이드가이드 7 page of 14
union uni { int a; char s[10]; } u; EXEC SQL INSERT INTO T1 VALUES ( :u.s ); DECLARE STATEMENT 구문추가지원 표준 Embedded SQL 구문으로 DECLARE STATEMENT 구문을추가지원한다. 다른내장 SQL 구문에사용될수있도록, SQL 구문이나 PL/SQL 블럭에대한식별자를선언할수있다. EXEC SQL DECLARE my_statement STATEMENT; EXEC SQL DECLARE emp_cursor CURSOR FOR my_statement; EXEC SQL PREPARE my_statement FROM :my_string; WHENEVER 구문사용시함수호출가능 WHENEVER <condition> DO <function> 와같은형태로 WHENEVER 구문사용시특정함수를호출할수있게개선되었다. EXEC SQL WHENEVER SQLERROR DO sql_error_occur(); APRE*C/C++ 실행파일 (apre) 명령옵션변경 1. I 기존 SES*C/C++ 에서 include 옵션으로제공되던옵션으로써 I 로명칭이변경되었다. precompile 시 include 할소스코드파일의경로를명시한다. 이옵션은코드내의 EXEC SQL OPTION (INCLUDE=library_path) 와같은기능을한다. $ apre -t cpp I$APP_HOME/include/main tmp.sc APRE*C/C++ 실행파일 (apre) 명령옵션추가 1. D 전처리 (Preprocess) 시사용될매크로를선언한다. 이옵션은코드내의 #define 과같은기능을한다. $ apre DALTIBASE DOTHER_DBMS -t cpp tmp.sc 2. keyword 예약된키워드들을보여준다. $ apre -keyword 3. parse parsing_mode APRE*C/C++ New Features & 업그레이드가이드 8 page of 14
파싱모드 (parsing mode) 를지정하여소스파일에대한 precompile 범위를결정한다. -parse 옵션의파싱모드와그에따른처리범위는아래와같다. -parse 옵션자체를생략할경우는기본적으로파싱모드가 partial 로작동한다. 파싱모드 내장 SQL A 매크로 B none O X X partial O O X full O O O 선언부외부호스트변수 C 비고 SES*C/C++ 와동일하게작동 #include 형식의헤더파일은처리하지않음 Partial C Preprocessor 추가작동 #include 형식의헤더파일까지처리 APRE*C/C++ 의기본파싱모드 C Parser 가추가작동 #include 형식의헤더파일까지처리 단, C++ 스타일로작성된소스코드는선언부외부호스트변수인식불가 [#include 형식의헤더파일까지처리 ] 의경우, 해당헤더파일이 #include 형식으로선언한또다른헤더파일까지도모두처리된다. [main.sc] C #include <header.h> #ifdef ALTIBASE int i=3; int j=5; #else #endif A B EXEC SQL select * into n from t1 where i1=:i; [header.h] #define ALTIBASE char name[10]; 예를들어, 위예제에서의쿼리를아래와같이매크로를사용한선택적인쿼리로변경후 EXEC SQL select * into n from t1 #ifdef ALTIBASE where i1=:i and i2 > 'A'; #else where i1=:i; #endif 파싱옵션을생략하여기본파싱모드인 partial 로 precompile 할경우 $ apre -t c main.sc APRE*C/C++ New Features & 업그레이드가이드 9 page of 14
실제생성코드는아래와같이매크로처리가완료된상태로만남게된다. ( 매크로처리후불필요하여제거된부분은공백으로치환된다 ) /* select * from t1 where i1=:i and il> 'A'; */ { struct ulpsqlstmt ulpsqlstmt; ulphostvar ulphostvar[2]; ulpsqlstmt.hostvalue = ulphostvar; ulpsqlstmt.stmttype = 4; ulpsqlstmt.stmtname = NULL; ulpsqlstmt.ismt = 0; 기존 SES*C/C++ 와동일하게 precompile 하기위해 parse none 을지정한경우에는매크로처리기능이작동하지않음으로변수중복선언에러가발생한다. $ apre -t c -parse none main.sc ----------------------------------------------------------------- Altibase C/C++ Precompiler. Release Version 5.3.3.7 Copyright 2000, ALTIBASE Corporation or its subsidiaries. All Rights Reserved. ----------------------------------------------------------------- [ERR-51011 : redefinition of 'i'.] [ERR-204E : The symbol name [i] can't be added on the symbol table.] File : main.sc Line : 13 Offset: 24-24 Error_token:; 유의사항 문법 (syntax) 강화 기존 SES*C/C++ 는코드에서 EXEC SQL BEGIN/END DECLARE/ARGUMENT SECTION 을기술할경우, 종결자인 ; 이누락되어도무관하였으나 APRE*C/C++ 는반드시 ; 가있어야한다. 이는타 DBMS Precompiler 와도동일한제약사항이다. 아래는 END DECLARE SECTION 에종결자를기재하지않은경우의에러이다. [ERR-302L : EXEC SQL END DECLARE SECTION is not exist.] C++ 스타일의소스코드 precompile 호스트변수선언부외부에호스트변수를사용하기위해서는 parse 옵션의모드를 full 로해야한다. 하지만, 파싱모드를 full 로설정하면 C 파서가동작하기때문에 C++ 스타일의소스코드는전처리중각종파싱에러를발생시킬수있다. 즉, C++ 스타일로작성된소스코드는 SES*C/C++ 와같이호스트변수선언부에만호스트변수를선언하고, -parse 옵션을명시적으로지정하여 precompile 할경우에는파싱모드를 partial 또는 none 으로해야한다. -D, -I 옵션 APRE*C/C++ New Features & 업그레이드가이드 10 page of 14
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 을수행한시간을측정한결과이다. SES C/C++ Precompiler 3 Ver 5.1.5.53 $ time sesc -t cpp arrays1.sc -silent APRE C/C++ Precompiler Ver 5.3.3.7 $ time apre -t cpp arrays1.sc silent real user sys 0m0.203s 0m0.168s 0m0.006s real user sys 0m0.278s 0m0.245s 0m0.004s 위측정결과는 IBM AIX5.3 (Power5 1898 MHz 1EA) 에서 precompile 한결과로실제수행속도는 OS 환경에따라달라질수있다. APRE*C/C++ New Features & 업그레이드가이드 11 page of 14
SES*C/C++ 환경에서 APRE*C/C++ 로의업그레이드 SES*C/C++ 환경에서 APRE*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 - 추가 이중실행파일, 헤더파일및라이브러리파일은하위호환성이고려되어있어별도로조치할사항이없으나실행파일명과링크옵션은반드시변경되어야한다. 또한, 필수적인요소는아니나 include 옵션의경우도 I 로변경하는것을권장한다. 업그레이드절차 SES*C/C++ 개발환경에서 APRE*C/C++ 로업그레이드시의절차는아래와같다. 1. APRE*C/C++ 버전확인 $ apre -v 기본적으로최신버전의 APRE*C/C++ 를사용하는것을권장하며최소 5.3.3.15 이상을사용하여야한다. BUG-28392 Direct Execute 실패시메모리증가 (fixed at 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) 2. 컴파일관련옵션수정 [ 변경사항 ] 섹션의표를참조, 아래와같은명령문수행, 링크옵션, makefile 과같은컴파일관련파일의옵션을수정한다. 실행파일명변경 $ apre -t cpp connect1.sc 링크옵션변경 APRE*C/C++ New Features & 업그레이드가이드 12 page of 14
$ g++ -Wl,-relax -L. -O3 -L/home/wlgml337/altibase_home2/lib -o connect1 connect1.o -lapre -lodbccli -ldl -lpthread -lcrypt -lrt makefile %.cpp : %.sc apre -t cpp $< connect1: connect1.$(objext) connect1.cpp $(LD) $(LFLAGS) $(LDOUT)connect1$(BINEXT) connect1.$(objext) $(LIBOPT)apre$(LIBAFT) $(LIBOPT)odbccli$(LIBAFT) $(LIBS) 임시조치 변경관련파일이쉽게파악되지않거나양이많아일일이수정할수없는경우는 [ 절차 2] 를생략하고아래와같이 APRE*C/C++ 실행파일에대해 SES*C/C++ 실행파일명칭으로심볼릭 (symbolic) 링크를생성하여조치가가능하다. (5.3.3.9 이후부터는 ALTIBASE 패키지자체에반영되어있으므로아래명령어를수행하지않아도된다.) $ ln -s $ALTIBASE_HOME/bin/apre $ALTIBASE_HOME/bin/sesc 하지만, 이러한조치는어디까지나임시적인조치일뿐이므로반드시관련명칭을변경하는정상적인업그레이드를수행해야한다. 유의사항 -parse none 옵션추가 [ 제약사항 ] 섹션에서언급한문법강화로인한사항이아닌데도 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 된소스코드를분석, 사용자임의로소스코드에관련매크로, 구조체및함수를사용하면서추후발생되는오류는책임지지않는다. APRE*C/C++ New Features & 업그레이드가이드 13 page of 14
알티베이스 서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 1008 호 02-2082-1000 http://www.altibase.com 대전사무소대전광역시서구둔산동 921 주은리더스텔 901 호 042-489-0330 기술지원본부서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 908 호 02-2082-1000 기술지원센터 02-2082-1114 http://support.altibase.com Copyright c 2000~2013 ALTIBASE Corporation. All Rights Reserved. 이문서는정보제공을목적으로제공되며, 사전에예고없이변경될수있습니다. 이문서는오류가있을수있으며, 상업적또는특정목적에부합하는명시적, 묵시적인책임이일체없습니다. 이문서에포함된 ALTIBASE 제품의특징이나기능의개발, 발표등의시기는 ALTIBASE 재량입니다. ALTIBASE는이문서에대하여관련된특허권, 상표권, 저작권또는기타지적재산권을보유할수있습니다. APRE*C/C++ New Features & 업그레이드가이드 14 page of 14