이제 설치된 DB를 가지고 precompiler 프로그래밍을 짜보자
우선 precompiler를 이용하려면 sapdb-precompiler-7.4.3.7beta-1.i386.rpm를 먼저 설치해야 한다
http://www.sapdb.org/7.4/sap_db_downloads.htm에서 다운받도록 하자
다운을 받았으면 이제 설치하자
rpm -ivh sapdb-precompiler-7.4.3.7beta-1.i386.rpm
바로 설치가 된다
그런데 문제가 하나 있다
RPM Package상의 문제인지 아니면 다른 문제인지는 몰라도 실제로 설치하고나서 동작해 보면 에러를 발생시킨다
우선 문제의 프로그램으로 이동해 보자
cd /opt/sapdb/interfaces/precompiler/bin/
여기에 있는 cpc 파일이 precompiler(?) 해주는 파일이다.
실행해보자
[sapdb@hancom bin]$ ./cpc
Error: program /opt/sapdb/interfaces/precompiler/sdk/7403/pgm/pgm64/pc3 not found
위와 같은 에러가 난다. 왜 위의 프로그램을 찾는지는 모르겠다.
하지만 디렉토리를 잘 살펴보면
[sapdb@hancom bin]$ ls /opt/sapdb/interfaces/precompiler/pgm/
pc3
/opt/sapdb/interfaces/precompiler/pgm/ 라는 디렉토리 밑에 pc3이라는 파일이 있다
그럼 모 일단은 편법이라도 실행이 되도록 해보자
그 파일을 지정된 디렉토리에 복사를 하거나 링크를 걸어준다
[sapdb@hancom bin]$ mkdir -p /opt/sapdb/interfaces/precompiler/sdk/7403/pgm/pgm64
[sapdb@hancom bin]$ ln -s /opt/sapdb/interfaces/precompiler/pgm/pc3 /opt/sapdb/interfaces/precompiler/sdk/7403/pgm/pgm64/
이제 다시 cpc를 실행해보자
[sapdb@hancom bin]$ ./cpc
usage: ./cpc [cCd:D:eE:F:H:hiI:lm:M:n:opP:qRsS:t:Tu:U:VwXy:Yz] fname [compopts]
./cpc -h : display help information
일단 제대로 동작은 한다
그럼 이제 실제 프로그램을 짜보도록 하자
사용상의 편리함을 위해서 precompiler의 디렉토리도 PATH에 넣어두자
[sapdb@hancom sapdb]$ export PATH=$PATH:/opt/sapdb/interfaces/precompiler/bin
자 그럼 일단 아주 간단한 프로그램을 하나 작성해 보자
프로그램의 하는 일은 단순히 DB에 접속했다가 접속을 끊어버리는 일만을 한다
아래의 소스를 보자
#include <stdio.h>
#include <string.h>
int main()
{
exec sql begin declare section;
char DB_NAME[20];
char DB_HOST[40];
exec sql end declare section;
strcpy(DB_NAME, "TST");
strcpy(DB_HOST, "");
exec sql set serverdb :DB_NAME on :DB_HOST;
if (sqlca.sqlcode != 0)
printf("(%d) %sn", sqlca.sqlcode, sqlca.sqlerrmc);
else
printf("OKn");
exec sql connect test identified by test;
exec sql commit release;
return 0;
}
위의 내용을 test.cpc라는 파일로 저장한다
이제 아래와 같이 해서 컴파일을 해보자
컴파일 순서는 cpc 를 통해 cpc파일을 c 파일로 변환후 그것을 gcc를 통해서 실행파일로 만들어 낸다
우선 아래와 같이 명령을 줘보자
[sapdb@hancom sapdb]$ cpc -Hnocheck -c test -Wall -I/opt/sapdb/depend74/incl -I/opt/sapdb/interfaces/precompiler/incl
cpc options: -Hnocheck -c file: test.cpc
SAP AG SAP DB C-PreComp Version 7.4.3 Build 007-000-030-320
Copyright 2000 by SAP AG
14 PRECOM-WARNING : -885 Variable may be truncated
14 VARIABLE-NAME : 1: SERVERDB_PARAMETER
:
: 1 WARNINGS
: NO DETECTED ERRORS
test.cpc no compilation with option -c
test.c saved
무슨 경고가 뜨고 그러는데 어쨌거나 맨 마지막 메시지를 보면 test.c saved라는 메세지가 보인다
ls 해서 보면 test.c 파일이 생성되어 있을 것이다
vi 등으로 열어보면 무슨 알지도 못할 정도로 내용이 들어있다.
어쨌거나 모든것은 무시하고 이제 object 파일을 만들고 실행파일을 만들어내보도록 하자
우선 object 파일을 만들어 보자
[sapdb@hancom sapdb]$ gcc -O2 -g -Wall -I/opt/sapdb/depend74/incl -I/opt/sapdb/interfaces/precompiler/incl -c -o test.o test.c
이제 실행파일을 만들어 내자
[sapdb@hancom sapdb]$ gcc -o test test.o -L/opt/sapdb/depend74/lib -L/opt/sapdb/interfaces/precompiler/lib -lpcrl -lsqlca -ldl
/opt/sapdb/interfaces/precompiler/lib/libpcrl.a(ven40-i.o): In function `sqlerrs':
ven40-i.o(.text+0x33): `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
ven40-i.o(.text+0x1e): `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
무슨 경고가 뜨고 하지만 어쨌거나 test 라는 실행파일은 만들어졌다
이제 실행해보자
[sapdb@hancom sapdb]$ ./test
OK
OK가 뜨면 제대로 동작되는 것이다
precompiler에 대한 내용은 precompiler 메뉴얼을 보면 누구나 알 수 있을 정도로 자세하게 나와있다.
영어를 모르더라고 예제문만 봐도 알 수 있도록 해 놓았으니 꼭 메뉴얼을 읽어보기 바란다.
참고로 위의 형태로 컴파일을 하면 대단히(?) 불편하기 때문에 내가 쓰는 Makefile을 올리도록 하겠다.
이것을 자신에 맞게 수정해서 쓰면 편리할 것이다
# Defines
CC=gcc
DEP=/opt/sapdb/depend74
PRECOMPILER=/opt/sapdb/interfaces/precompiler
CPC=$(PRECOMPILER)/bin/cpc
CPCFLAGS=-Hnocheck -dMODELL -ubuild,compiler -s -c
INCLUDE=-I$(DEP)/incl -I$(PRECOMPILER)/incl
CFLAGS=-O2 -g -Wall $(INCLUDE)
LIBS=-L$(DEP)/lib -L$(PRECOMPILER)/lib -lpcrl -lsqlca -ldl
SQLOPT=-X
# Generic rules
%.c: %.cpc
$(CPC) $(CPCFLAGS) $(basename $<) $(CFLAGS) $(CPPFLAGS)
%o: %.c
$(CC) -c $(CFLAGS) $<
# Project-dependend rules
OBJ=test
all: $(OBJ)
test: test.o
$(CC) -o test test.o $(LIBS)
clean:
rm -f *.o *.c $(OBJ)
distclean: clean
rm -f *.lst *.pcl *.pct
|