구성 요소
본 장에서는 RPC 프로그램 구성을 위한 구성요소를 설명하고, 각 종류별 실행 예제를 통한 사용 방법에 대해서 설명한다.
1. 개요
RDP 프로그램을 위해 기본으로 필요한 구성 요소는 다음과 같다.
-
인터페이스 정의 파일
인터페이스 정의 파일은 SQL 인터페이스 정의 파일과 API 정의 파일로 구분된다.
-
idlc
소스를 생성하는 유틸리티이다.
-
공통 라이브러리
애플리케이션을 구성할 때 사용한다.
2. 인터페이스 정의 파일
인터페이스 정의 파일은 SQL 인터페이스 정의 파일과 API 정의 파일의 2가지 종류로 구분된다.
2.1. SQL 인터페이스 정의 파일
SQL 인터페이스 정의 파일은 SQL을 통해서 업무를 수행할 경우에 사용하는 파일로, DA 서버와 TP 서버를 구성할 때 사용한다. 하나의 파일 안에 여러 개의 SQL 문을 정의할 수 있으며, 정의된 SQL은 각각 하나의 함수를 표현한다. 결국 하나의 파일이 하나의 TCS 서버로 나타난다.
SQL 인터페이스 정의 파일의 기본 형식과 각 항목에 대한 설명은 다음과 같다. '#'으로 시작하는 문장은 주석으로, 해석하지 않는다.
#comment function_name: SQL 문장; function_name: SQL 문장;
-
function_name
SQL 문장을 수행하는 클라이언트에서 호출할 함수명이다. 콜론(:) 전까지를 함수명으로 인식한다.
-
SQL 문장
-
수행할 SQL 문이다. 여러 줄로 표현 가능하고 SELECT, INSERT, UPDATE, DELETE 문을 정의할 수 있다.
-
SQL 문장 중 "$"로 시작하는 단어는 함수에 넘겨주는 인자로 인식을 한다. 각 인자들은 C 스타일의 char 스트링 배열로 구성되어야 한다.
-
SELECT ~ FROM 사이의 필드명들은 각각 함수의 결과를 저장할 수 있는 인자로 인식한다.
-
각 필드의 타입을 필드명 앞에 "[필드 타입]" 형식으로 정의하면 함수 생성시 해당 타입을 그대로 사용할 수 있다. char, int, long, float, double, string, binary의 필드 타입을 정의할 수 있고, binary 필드 타입은 BLOB 타입의 데이터를 처리할 경우에 사용한다.
-
SELECT 문
다음은 'sel_test’라는 이름의 SELECT 문을 정의하여 변환한 예제이다.
-
SQL 정의
sel_test: SELECT [int] no, [double] comm, name FROM sample WHERE no = $no;
-
함수 변환
다음과 같이 $no가 char *no로 변환된다. SELECT 쿼리는 여러 행을 가져올 수 있기 때문에 'tmax_sel_rows’라는 변수에 행 수를 저장할 수 있게 하며, SELECT ~ FROM 사이의 필드들을 각 타입에 맞게 저장할 수 있도록 순서대로 배열한다.
long int sel_test( /* [in] */ char *no, /* [out] */ long int *tmax_sel_rows, /* [out] */ int **outvars_0, /* [out] */ double **outvars_1, /* [out] */ char ***outvars_2 );
INSERT 문
다음은 'int_test’라는 이름의 INSERT 문을 정의하여 변환한 예제이다.
-
SQL 정의
ins_test: INSERT INTO sample(no, name) VALUES ($no, '$name');
-
함수 변환
다음과 같이 $no와 $name을 인자로 받는 함수가 변환된다.
long int ins_test( /* [in] */ char *no, /* [in] */ char *name );
UPDATE 문
다음은 'update_test’라는 이름의 UPDATE 문을 정의하여 변환한 예제이다.
-
SQL 정의
update_test: UPDATE sample SET name='$name' WHERE no=$no;
-
함수 변환
다음과 같이 $no와 $name을 인자로 받는 함수가 변환된다.
long int update_test( /* [in] */ char *name, /* [in] */ char *no );
DELETE 문
다음은 'del_test’라는 이름의 DELETE 문을 정의하여 변환한 예제이다.
-
SQL 정의
del_test: DELETE FROM sample WHERE no=$no;
-
함수 변환
다음과 같이 $no를 인자로 받는 함수가 변환된다.
long int del_test( /* [in] */ char *no );
2.2. API 정의 파일
TP 서버와 FS 서버에서 사용하는 API를 정의할 때 필요한 파일이다.
서버에서 수행할 함수의 원형을 다음과 같은 형식으로 정의한다. 리턴 타입과 인자 타입은 C에서 정의하는 타입으로 정의해야 한다. in, out 지시자를 통해서 인자의 타입을 지정할 수 있다.
interface 서비스명 { 리턴 타입 함수명 ( [in|out] 인자 타입 인자명 ); }
다음은 TSTEST라는 서비스명의 함수를 정의하고 변환한 예제이다.
-
함수 정의
interface TSTEST { long trans_select ( [out] long sel_rows, [out] int empno[sel_rows], [out] char ename[][]); long trans_insert ( [in] int dummy ); long trans_clear ( [in] int dummy ); }
-
함수 변환
long int trans_select( /* [out] */ long int *sel_rows, /* [out] */ int **empno, /* [out] */ char ***ename ); long int trans_insert( /* [in] */ int dummy ); long int trans_clear( /* [in] */ int dummy );
3. idlc
Entera의 conversion할 때 정의 파일을 실제 프로그래밍 가능한 소스(stub)로 변환해 주는 유틸리티이다.
다음은 명령어 사용법에 대한 설명이다.
-
사용 방법
idlc -inf 인터페이스명 -sql SQL 인터페이스명 -dbtype ora | tbr | syb -clang c | vbasic | pbuilder | java | delphi | delphi6 | delphixe -xa -header 파일명 -sstub 파일명 -cstub 파일명
항목 설명 -inf 인터페이스명
DA 서버를 사용할 경우의 인터페이스명을 지정한다.
-sql SQL 인터페이스명
DA 서버와 TP 서버를 사용할 경우의 인터페이스 파일명이다.
-dbtype
DA 서버를 사용할 경우의 DB 타입을 선택한다.
RPC가 지원하는 OS와 DB 종류는 Tmax Programming Guide (RPC)의 제약사항을 참고한다.
-
ora : Oracle
-
syb : Sybase
-
tbr : Tibero
-clang
생성할 클라이언트의 소스 Stub 파일의 언어 타입을 선택한다.
-
c
-
vbasic
-
pbuilder
-
java
-
delphi
-
delphi6
-
delphixe
-xa
XA 서버로 생성할 경우 지정한다.
-header 파일명
생성할 header 파일명을 지정한다.
-sstub 파일명
생성할 서버 Stub 파일명을 지정한다.
-cstub 파일명
생성할 클라이언트 Stub 파일명을 지정한다.
-
-
예제
다음은 서버 종류에 따른 사용 예제이다.
-
DA 서버
Oracle을 사용하고 dstest.sql을 업무로 사용하며 클라이언트는 C 언어를 사용할 경우 다음과 같이 옵션을 설정한다.
idlc -inf dstest -sql dstest.sql -dbtype ora -clang c
-
TS 서버
-
'.def' 파일을 사용할 경우
TP 서버는 '.def' 파일을 사용할 경우 다음과 같이 옵션을 설정한다.
idlc -xa -clang c tstest.def
-
DA 서버 사용할 경우
TP 서버에서 호출할 DA 서버를 사용할 경우 다음과 같이 옵션을 설정한다.
idlc -inf db1 -sql db1.sql -dbtype ora -clang c -xa -tps
-
-
Function 서버
Function 서버는 TP 서버와 동일하게 옵션을 설정하여 수행한다.
idlc -xa -clang c fstest.def
-
4. 공통 라이브러리
TCS 타입의 서버, 일반 클라이언트를 위해서는 기본으로 제공하는 서버와 클라이언트 라이브러리 외에도 RPC를 위한 라이브리가 필요하다.
다음은 필요한 공통 라이브러리에 대한 설명이다.
-
서버를 위한 라이브러리
-
TCS 타입의 서버를 위해 기본적으로 제공하는 서버 라이브러리이다.
-
libsvr를 사용하며 실제 원하는 함수를 실행할 수 있게 하는 역할을 한다.
-
UNIX에서는 'librpcsvr.*'라는 이름으로 제공한다.
-
-
클라이언트를 위한 라이브러리
-
일반 클라이언트를 위해 제공하는 클라이언트 라이브러리이다.
-
libcli를 사용하며 통신을 할 수 있도록 지원한다.
-
UNIX에서는 'librpccli.*'라는 이름으로 제공하며, Windows에서는 'tmaxrpccli.dll’로 제공한다.
-
-
DB 접근을 위한 라이브러리
-
DB마다 특징이 있기 때문에, 지원하는 DB에 따라서 다른 라이브러리가 존재한다.
-
Oracle은 'librpcsql.*', Tibero는 'librpctbr.*', Sybase는 'librpcsyb.*'를 사용해야 한다.
-