제4장 Tmax 애플리케이션

내용 목차

4.1. 애플리케이션 구성
4.2. 버퍼 유형
4.3. 클라이언트/서버 프로그램
4.3.1. 클라이언트 프로그램
4.3.2. 서버 프로그램
4.4. 시스템 환경 파일
4.5. API
4.5.1. Tmax 표준 API
4.5.2. 비표준 API
4.6. 에러 메시지
4.6.1. X/Open DTP 관련 에러
4.6.2. FDL 관련 에러

본 장은 Tmax 애플리케이션을 개발하기 위해 숙지해야 할 기본 개념과 클라이언트/서버 프로그램의 흐름과 구성과 프로그램 개발을 위한 AP와 에러에 대해서 설명한다.

4.1. 애플리케이션 구성

Tmax 애플리케이션은 클라이언트 프로그램과 서버 프로그램으로 구성된다. 클라이언트용 프로그램은 사용자 인터페이스를 담당(Presentation logic)하고 서버용 서비스 루틴은 업무 처리 및 데이터베이스 Access Logic을 구현한다.

클라이언트에서 요청이 발생하면 서버에서 해당 요청을 처리한다. 클라이언트가 N개 있는 경우도 하나의 호출에 대해서는 하나의 서비스가 기동한다. 클라이언트 요청은 CLL에 먼저 접속을 하고 요청에 대해 tpcall이 발생하고 CLL은 해당 서비스에 해당하는 요청을 실행하고 실행이 완료되면 요청을 반환하는 역할을 한다. 클라이언트 프로그램은 Tmax에 연결할 때 Tmax의 호스트 주소와 Port 등 연결을 위한 사전 정보 설정이 필요하다. 이 정보는 .profile 또는 tmax.env 파일에 저장되며, TMAX_HOST_ADDR, TMAX_HOST_PORT 항목에 설정된다.

서버 프로그램은 Tmax에서 제공하는 main()과 개발자가 개발한 서비스 루틴으로 구성된다.

Tmax는 클라이언트와 서버의 연결 데이터 요청 등의 처리를 위해서 다양한 API 함수를 제공한다. Tmax API는 분산 처리 국제 표준(X/Open DTP model)을 준수한다. 애플리케이션을 개발할 때 서비스 루틴만 개발한다.

다음은 Tmax 애플리케이션의 구성을 보여주는 그림이다.

[그림 4.1] Tmax 애플리케이션 구성

Tmax 애플리케이션 구성

4.2. 버퍼 유형

클라이언트에서 서버에 서비스 요청하는 경우 통신용으로 다음의 통신 버퍼를 사용한다.

[그림 4.2] Tmax 통신 버퍼 유형

Tmax 통신 버퍼 유형

  • STRING 버퍼

    NULL 값으로 끝나는 문자열로 따로 버퍼의 길이를 명시할 필요가 없다. 플랫폼의 차이로 인한 문제는 발생하지 않는다.

  • CARRAY, X_OCTET 버퍼

    길이가 지정된 Byte 열로 구성된 버퍼로 보통 바이너리 타입의 데이터를 보낼 때 사용되며 데이터를 교환하는 경우 반드시 길이를 명시해야 한다. 플랫폼의 차이로 인한 문제는 발생하지 않는다.

  • STRUCT, X_C_TYPE 버퍼

    C 언어의 구조체를 데이터 통신에 사용하는 경우 사용한다. 구조체의 멤버로는 모든 원시 타입을 사용할 수 있으며 선언된 구조체 자체도 멤버로 사용할 수 있다. 또한, 구조체의 배열도 사용할 수 있다.

  • X_COMMON 버퍼

    멤버 타입이 char, int, long으로 한정된 C 구조체이다.

  • FIELD 버퍼

    필드키와 데이터 값을 한 쌍으로 관리하는 데이터 버퍼로 모든 원시 타입의 데이터를 담을 수 있다. 교환되는 데이터형이 유동적일 경우 사용하며 다양한 방법의 데이터 접근 및 변환 API를 제공한다.

FDL (Field Definition Language)

일반적인 구조체와는 달리 필드키 버퍼(Field Key Buffer)를 사용하여 원하는 정보의 데이터만을 조작하여 처리할 수 있다.

각 필드키에 대한 이름(NAME, ADDR, TEL 등), 번호, 타입을 필드 버퍼 파일<XXX.f>에 기술한다. FDLC를 이용하여 <XXX.f>를 컴파일하면 <XXX_fdl.h>로 매핑된 파일을 생성시킨다. 컴파일될 때 include된 <XXX_fdl.h>를 참조하여 사용자가 선택한 필드키와 값만을 조작할 수 있다.

[그림 4.3] FDL 저장 방식

FDL 저장 방식


4.3. 클라이언트/서버 프로그램

클라이언트용 프로그램은 사용자 인터페이스를 담당(Presentation logic)하고, 서버용 서비스 루틴은 업무 처리 및 데이터베이스 access 로직을 구현한다.

4.3.1. 클라이언트 프로그램

클라이언트 프로그램은 사용자의 입력(input)을 받아들여서 서버에게 서비스를 요청하고, 서버로부터 응답을 받아서 사용자에게 서비스 응답을 출력(output)하는 프로그램이다.

클라이언트 프로그램 흐름

다음은 클라이언트 프로그램의 흐름이다.

main()
{
     Tmax 접속
     송, 수신 메시지 버퍼 할당
     클라이언트 업무 로직 작성 (사용자 요구 사항을 입력받아서 송신 메시지 버퍼에 저장)
     서비스 요청 및 응답 (송신 메시지 버퍼를 Tmax CLH로 보냄,
               Tmax CLH를 통하여 수신 메시지 버퍼에 응답 데이터를 수신)
               클라이언트 업무 로직 작성 (응답 데이터를 사용자에게 보여줌)
     송, 수신 메시지 버퍼 해제
     Tmax 연결 해제
}

[그림 4.4] 클라이언트 프로그램 흐름

클라이언트 프로그램 흐름


다음은 클라이언트 프로그램의 주요 함수에 대한 설명이다.

  • Tmax 통신 환경 함수

    함수설명
    tmaxreadenv()

    Tmax 클라이언트 프로그램을 실행할 때 기본적으로 참조하게 되는 일련의 Tmax 환경변수들을 특정 파일에 기술할 수 있다. tmaxreadenv() API를 호출하는 프로그램을 작성할 때 특정 파일의 경로명 및 파일명을 설정하게 되면, 해당 클라이언트 프로그램을 실행할 때 설정된 파일의 파일 포인터를 획득한 후 내용을 파싱한다.

    파싱한 내용 중 TMAX_HOST_ADDR, TMAX_HOST_PORT 등의 Tmax 환경변수는 클라이언트 프로그램이 실행될 때 확보된 메모리 공간 내에 로드하고 관련 API 함수 호출에 이용한다.

  • 클라이언트와 서버 연결 함수

    함수설명
    tpstart()CLL 프로세스로 소켓 연결을 요청하고 accept된 연결을 CLH로 전달한다. tpstart() 호출할 때 TMAX_HOST_ADDR, TMAX_HOST_PORT에 설정된 값을 사용한다.
    tpend()CLL 프로세스로 소켓 연결을 종료한다.
  • 통신 버퍼와 해제 함수

    함수설명
    tpalloc()

    Tmax를 통한 클라이언트와 서버 사이의 데이터 송수신할 때 사용하는 메모리를 동적으로 할당한다. 데이터를 송수신할 때 필요한 길이 정보를 예측하여 그 크기만큼 미리 할당해야 한다.

    동적 할당된 메모리는 반드시 명시적으로 해제해야 한다.

    tpfree()tpalloc()을 통해 동적 할당 메모리를 명시적으로 해제(반환)한다. 할당된 메모리 버퍼는 반환해야 하며, 그렇지 않으면 Gabage(memory leakage)가 발생한다.
  • 클라이언트 동기 통신 함수

    함수설명
    tpcall()

    CLH로 서비스를 요청하고 송신 데이터를 전달하고 CLH는 클라이언트의 요청 서비스를 확인 후 서버 애플리케이션 프로세스로 전달한다.

    클라이언트는 서비스 요청에 대한 응답이 도착할 때까지 대기한다.

  • 클라이언트 비동기 통신 함수

    함수설명
    tpacall()

    CLH로 서비스를 요청하고 송신 데이터를 전달하고 CLH는 클라이언트의 요청 서비스를 확인 후 서버 애플리케이션 프로세스로 전달한다.

    클라이언트는 서비스 요청에 대한 응답 여부와는 관계없이 tpacall() 이후 로직을 수행한다.

    tpgetrply()

    tpacall()에 대한 파라미터(cd) 값을 통해서 CLH로 응답 데이터를 요청한다.

    CLH에 이미 해당 클라이언트로 보낼 응답 데이터가 있으면 이를 클라이언트로 즉시 전달한다.

    파라미터 중 flags 설정 값에 따라 응답 데이터가 올 때까지 기다리거나 혹은 기다리지 않고 즉시 응답 수신 에러를 클라이언트로 전달한다.

다음은 클라이언트 프로그램의 주요 함수 프로세스에 대한 그림이다.

[그림 4.5] 클라이언트 프로그램 함수 프로세스

클라이언트 프로그램 함수 프로세스


참고

각 함수에 대한 자세한 내용과 사용법은 "Tmax Application Development Guide""Tmax Reference Guide"를 참고한다.

클라이언트 프로그램 구성

클라이언트 프로그램의 코딩이 완료되면 컴파일하여 실행 파일을 생성한다.

클라이언트 프로그램을 컴파일하기 위해서는 개발자가 작성한 클라이언트 프로그램, Tmax 클라이언트 라이브러리, 구조체 버퍼를 사용하는 경우에는 구조체 파일, 그리고 필드 테이블이 정의된 필드키 버퍼 파일이 정의되어 있어야 한다.

다음은 클라이언트 프로그램의 구성에 대한 그림이다.

[그림 4.6] Tmax 클라이언트 프로그램 구성

Tmax 클라이언트 프로그램 구성


  • 클라이언트 프로그램

    개발자가 작성한 클라이언트 프로그램이다.

  • Tmax 클라이언트 라이브러리(libcli.a / libcli.so)

    Tmax가 제공하는 라이브러리로 클라이언트 프로그램 개발할 때 사용하는 함수들의 오브젝트 코드이다.

  • 구조체 파일

    클라이언트 프로그램에서 구조체(STRUCT, X_C_TYPE, X_COMMON)를 사용하였다면 <파일명.s>로 끝나는 구조체 파일이 필요하다. 구조체 파일을 sdlc 명령어를 이용하여 미리 컴파일한다. 컴파일하면 구조체의 각 데이터가 표준 통신형으로 변환되는 데 필요한 정보를 담은 이진(binary) 형태의 파일이 생성된다. 이는 클라이언트 프로그램을 실행할 때 표준 통신형으로 데이터를 송수신하는 데 사용된다.

  • 필드키 파일

    필드키 구조를 사용하였다면 <.f>로 끝나는 필드 정의 파일이 필요하다. 파일을 fdlc 명령어를 이용하여 컴파일하면, 이때 필드키 버퍼 파일은 키 매핑을 이용하여 <필드키버퍼명_fdl.h>을 생성하여 프로그램 실행 시 사용하게 된다. 기존의 구조체 파일과는 달리 사용자가 원하는 필드의 값만을 조작하고 전달할 수 있어 자원의 낭비를 줄일 수 있다. 하지만 키 매핑하는 과정에서의 오버헤드도 발생할 수 있으므로 주의가 필요하다.

4.3.2. 서버 프로그램

서버 프로그램은 사용자의 요청을 받아서 처리하고 그 응답을 클라이언트에게 반환한다.

서버 프로그램 흐름

다음은 서버 프로그램의 흐름이다.

int tpsvrinit(int argc, char **argv)
{
     서버 초기화 작업(DBMS와의 Non-XA 모드 접속)
}

SVC_NAME(TPSVCINFO *msg)
{
     DB 트랜잭션 처리(ESQL), 업무 처리 로직 포함
     클라이언트로 응답 결과를 전송
}

int tpsvrdone()
{
     서버 종료 직전 작업(DBMS와의 Non-XA 모드 연결 해제)
}

void tpsvctimeout()
{
     SVCTIME 항목과 관련되며, 서비스 타임아웃 핸들러에 의해 호출됨
}

[그림 4.7] 서버 프로그램 흐름

서버 프로그램 흐름


다음은 서버 프로그램의 주요 함수에 대한 설명이다.

  • 서버 초기화 함수

    함수설명
    tpsvrinit()

    서버 애플리케이션 프로세스가 기동될 때 최초로 호출된다.

    tpsvrinit()의 표준 입력은 Tmax 환경 파일의 설정을 통하여 이루어진다. tpsvrinit()은 개발자가 재정의하여 사용한다. 재정의를 하지 않으면 Tmax 서버 라이브러리에 있는 기본 로직이 적용된 tpsvrinit()이 호출된다.

  • 서버 종료 시 작업 함수

    함수설명
    tpsvrdone()

    서버 애플리케이션 프로세스가 정상 종료하기 직전 호출된다.

    tpsvrdone()은 개발자가 재정의하여 사용한다. 재정의를 하지 않으면 Tmax 서버 라이브러리 내에 있는 기본 로직이 적용된 tpsvrdone()이 호출된다.

  • Tmax 응답 함수

    함수설명
    tpreturn()

    CLH로 서비스 로직의 종료를 알리고 응답 데이터를 전달하고 CLH는 서비스를 호출한 측의 정보를 확인하고 응답 데이터를 즉시 송신한다.

    응답 데이터가 저장된 버퍼 포인터가 가리키는 동적 할당 메모리를 반환(free)하면 서비스를 포함하는 서버 애플리케이션은 프로세스의 동작을 멈추고 다음 응답을 받을 준비를 한다.

    tpforward()

    CLH로 서비스 로직의 종료를 알리고, SVC로 보낼 데이터를 전달하고 CLH는 전달할 서비스를 포함하는 서버 프로세스의 가용 여부를 확인 후 데이터를 즉시 전달한다.

    응답 데이터 포인터가 가리키는 동적 할당 메모리를 반환(free)하면 서비스를 포함하는 서버 애플리케이션은 프로세스의 동작을 멈추고 다음 응답을 받을 준비를 한다.

다음은 서버 프로그램의 주요 함수 프로세스에 대한 그림이다.

[그림 4.8] tpcall과 tpforward 비교

tpcall과 tpforward 비교


서버 프로그램 구성

서버 프로그램은 Tmax에서 제공하는 main()과 애플리케이션 개발자가 작성한 서비스 루틴(Service Routine)들로 구성된다.

다음은 서버 프로그램의 구성에 대한 그림이다.

[그림 4.9] Tmax 서버 프로그램 구성

Tmax 서버 프로그램 구성


  • 서버 프로그램

    개발자가 작성한 서비스루틴이다. 클라이언트의 요청을 처리한다.

    SQL문을 사용하였다면 해당 데이터베이스 벤더가 제공하는 툴을 이용하여 프리컴파일을 마쳐야 한다.

  • Tmax 서버 라이브러리(libsvr.a / libsvr.so)

    Tmax에서 제공하는 서버 라이브러리로, 서버 main()과 tpsvrinit(), tpsvrdone() 그리고 각종 Tmax 함수들이 있다.

  • 서비스 테이블

    서버마다 제공되는 서비스명들이 나열된 파일이며, Tmax 환경 파일을 참조하여 생성한다.

    서비스 테이블은 서비스를 수행할 때 실제로 서버 내에서 해당 서비스 루틴의 위치를 찾기 위해 사용되며 시스템 관리자가 제공한다. 이에 대한 자세한 내용은 "Tmax Administration Guide"를 참조한다.

  • 구조체 바이너리 테이블(SDLFILE)

    구조체형 버퍼(STRUCT, X_C_TYPE, X_COMMON)를 사용하였다면 이를 정의하는 <xxxx.s> 형식의 구조체 파일이 필요하다.

    구조체 파일은 표준 통신 타입(구조체 파일명_sdl.c)과 구조체 헤더 파일(구조체 파일명_sdl.h)이 있다. 구조체 파일은 sdlc –c 명령어를 이용하여 컴파일하며 그 결과 구조체의 멤버들을 표준 통신형으로 변환하는 데 필요한 바이너리 테이블 파일이 생성된다. 이는 서버 프로그램 실행 시에 구조체형의 데이터를 표준 통신형으로 변환 및 역변환하는 데 사용된다.

    구조체를 사용하지 않을 경우에는 $TMAXDIR/lib/sdl.o를 응용 서버와 컴파일해야 한다.

  • 필드버퍼 바이너리 테이블(FDLFILE)

    필드 버퍼를 사용하였다면 <xxxx.f> 형식으로 정의된 필드 버퍼 파일이 필요하다. 이 파일은 fdlc 명령어를 이용하여 컴파일하며 그 결과 필드키와 데이터를 대응시켜 주는 바이너리 테이블 파일과 필드키와 필드키 이름을 대응시켜주는 헤더 파일(xxxx_fdl.h)이 생성된다. 기존의 구조체 파일과는 달리 사용자가 원하는 필드의 값만을 조작하고 전달할 수 있으므로 다양한 타입의 데이터를 사용하는 경우 자원의 낭비를 줄일 수 있다. 하지만, 데이터 값과 필드키 값을 같이 관리하므로 많은 필드를 사용하지 않는다면 역효과가 발생할 수도 있다.

  • 구조체-표준버퍼 변환/역변환 프로그램

    서버 프로그램 내에서 구조체 버퍼를 사용하기 위해서는 sdlc 명령어로 만들어진 구조체-표준버퍼 변환/역변환 프로그램(xxxx_sdl.c, xxxx_sdl.h)을 컴파일하여 같이 링크해야 한다. 구조체를 사용하지 않을 때에는 TMAXDIR/lib/sdl.o를 링크하도록 한다.

4.4. 시스템 환경 파일

시스템 환경 파일은 Tmax 시스템에 필요한 정보를 담는 파일이다. Tmax 환경 파일은 Tmax 시스템 구성을 설정하며, Tmax 관리자가 작성한다. 이 파일은 서비스 테이블 생성과 Tmax 시스템 구동에 사용된다.

환경 파일은 8개의 절로 구성된다.

설명필수 여부
DOMAIN 절 하나의 독립적인 Tmax 시스템 전체 환경을 정의한다.필수
NODE 절 도메인을 이루는 각 노드에 관계된 환경을 정의한다.필수
SVRGROUP 절서버 그룹 및 데이터베이스에 관련된 사항을 정의한다.필수
SERVER 절 서버에 관련된 사항을 정의한다.필수
SERVICE 절서비스에 관련된 사항을 정의한다.필수
GATEWAY 절도메인 간 게이트웨이에 관련된 사항을 정의한다.선택
ROUTING 절데이터 의존 라우팅에 관련된 사항을 정의한다.선택
RQ 절 신뢰성 큐에 관련된 사항을 정의한다.선택
  • 각 절의 이름은 애스테리스크(*)로 시작(예: *DOMAIN, *NODE 등)한다.

  • 각 절의 이름과 절의 하위 개체 이름은 반드시 줄의 첫 번째 칸에서 시작한다.

  • 하나의 하위 개체에 대한 정의는 콤마(,)로 구분한다.

일반 텍스트 파일로 환경 파일이 생성되며 cfl 명령어로 컴파일한다.

cfl -i Tmax 환경 파일명

다음은 Tmax 환경 파일의 예이다. (< >로 쌓여 있는 부분은 적당한 값으로 수정이 필요하다 )

*DOMAIN
<resrc_name> SHMKEY = <UNIQUE IPCKEY>,  
             MAXUSER = <256>,
             TPORTNO = <8999>

*NODE
<uname>      TMAXDIR = <TMAX installed directory>
             APPDIR = <APPLICATION directory>
             PATHDIR = <PATH directory>

*SVRGROUP
<svg_name>   NODENAME = <uname>, 
             DBNAME = <ORACLE>,
             OPENINFO = "ORACLE_XA+Acc=P/tmaxsoft/tmaxsoft+SesTm=60"

*SERVER
<svr_name>   SVGNAME = <svg_name>, 
             MIN = <5>, 
             MAX = <10>

*SERVICE
<svc_name>   SVRNAME = <svr_name>

참고

각 절에 대한 자세한 설명은 "Tmax Administration Guide"를 참고한다.

4.5. API

프로그램을 개발할 때에는 API의 원형이 정의되어 있는 헤더 파일을 include하여 사용해야 한다. API는 클라이언트/서버 라이브러리에 구현되어 있다. API에 대한 자세한 설명은 “Tmax Application Development Guide”“Tmax Reference Guide”를 참고한다.

4.5.1. Tmax 표준 API

X/Open ATMI

X/Open ATMI(X/Open Application Transaction Monitor Interface) API는 X/Open DTP 모델에서 표준으로 규정한 ATMI 인터페이스로 애플리케이션 프로그램과 TP-Monitor 사이의 통신 방식을 하나로 사용한다.

함수는 atmi.h에 정의되어 있으며, 버퍼 관련 함수, 서비스 요청 및 응답 관련 함수, 대화형 모드 관련 함수, 서비스 종료 관련 함수로 나뉜다.

  • 버퍼 할당, 해제 관련 함수

    함수설명
    tpalloc()데이터를 송수신할 버퍼를 할당하는 함수이다.
    tprealloc()버퍼의 크기를 변경하는 함수이다.
    tpfree()할당된 버퍼를 해제하는 함수이다.
    tptypes()버퍼의 크기와 형식에 대한 정보를 제공하는 함수이다.
  • 서비스 요청 및 응답 관련 함수

    함수설명
    tpcall()서비스를 요청하고 응답이 올 때까지 대기하는 함수이다.
    tpacall()서비스를 요청하고 다른 처리를 하다가 tpgetrply() 함수가 호출될 때 처리 결과를 수신하는 함수이다.
    tpcancel()서비스 요청에 대한 응답을 취소하는 함수이다.
    tpgetrply()tpacall() 호출에 대한 응답을 수신하는 함수이다.
  • 대화형 모드 관련 함수

    함수설명
    tpconnect()대화형 모드에서 메시지 송수신을 위한 연결 함수이다.
    tpdiscon()대화형 모드에서 서비스와 연결을 비정상적으로 종료하는 함수이다.
    tprecv()대화형 모드에서 메시지를 수신하는 함수이다.
    tpsend()대화형 모드에서 메시지를 송신하는 함수이다.
  • 서비스 종료 관련 함수

    함수설명
    tpreturn()서비스 요청에 대한 응답을 클라이언트에게 보내고 서비스 루틴을 종료하는 함수이다.

X/Open TX API

X/Open TX API는 애플리케이션 프로그램과 TP-Monitor 간의 트랜잭션에 관해서 통신하는 방식을 제공한다. 함수는 tx.h에 정의되어 있고 트랜잭션 관리 함수로 구성된다.

다음은 TX API 목록이다.

  • 트랜잭션 관련 함수

    함수설명
    tx_begin()트랜잭션을 시작하는 함수이다.
    tx_commit()트랜잭션을 commit 하는 함수로 결과를 저장한다.
    tx_rollback()트랜잭션을 원상태로 복구하는 함수이다.
    tx_open()내부적으로 작동하는 함수로 리소스 매니저를 시작하는 함수이다.
    tx_close()내부적으로 작동하는 함수로 리소스 매니저를 종료하는 함수이다.
    tx_set_transaction_timeout()트랜잭션이 종료되어야 할 시간 제한을 설정하는 함수이다.
    tx_info()전역 트랜잭션 정보를 반환하는 함수이다.
    tx_set_commit_return()전역 트랜잭션을 인가할 시점을 설정하는 함수이다.
    tx_set_transaction_control()트랜잭션 완료 후 자동으로 다음 트랜잭션을 시작하는 함수이다.

4.5.2. 비표준 API

Tmax ATMI

Tmax ATMI 함수는 비요청 메시지 처리, RQ 관련, 에러 설정, 타임아웃 설정 등에 사용되는 함수로 tmaxapi.h에 정의되어 있다. 정의된 API는 비표준 인터페이스로서 개발자의 개발 생산성 향상을 위해 개발되었으며 개발자에 의해 작성되는 애플리케이션 프로그램과 TP-Monitor 간의 통신 방식의 하나로 사용될 수 있다.

다음은 tmaxapi.h에 정의된 비표준 API 목록이다.

  • 비요청 데이터 관련 함수

    함수설명
    tpbroadcast()비요청 데이터를 시스템에 등록된 클라이언트에게 일방적으로 전달하는 함수이다.
    tpsetunsol()비요청 데이터를 처리할 함수를 지정하는 함수이다.
    tpgetunsol()비요청 데이터를 수신하는 함수이다.
    tpsetunsol_flag()비요청 데이터 수신 플래그를 설정하는 함수이다.
    tpchkunsol()비요청 데이터의 도착을 확인하는 함수이다.
  • 에러 관련 함수

    함수설명
    tpstrerror()에러의 내용을 스트링 형식으로 출력하는 함수이다.
    Userlog()먼저 에러를 버퍼에 기록(Log)하는 함수이다.
    ulogsync()디스크의 메모리 버퍼에 'ulog' 내용을 저장하는 함수이다.
    UserLog()userlog()와 ulogsync()의 기능이 복합된 함수이다.
    gettperrno()Tmax 시스템을 호출할 때 발생한 에러 번호를 반환하는 함수이다.
    gettpurcode()개발자가 설정한 urcode를 반환하는 함수이다.
    tperrordetail()Tmax 시스템을 호출할 때 발생한 에러에 관한 정보를 반환하는 함수이다.
  • 소켓 정보 관련 함수

    함수설명
    tpgetpeer_ipaddr()연결된 클라이언트의 IP 주소를 반환하는 함수이다.
    tpgetpeername()연결된 클라이언트명을 반환하는 함수이다.
    tpgetsockname()연결된 클라이언트의 소켓명을 반환하는 함수이다.
  • 블록 타임아웃 설정 함수

    함수설명
    tpset_timeout()블록 타임아웃 시간을 설정하는 함수이다.
  • 장애대책 관련 함수

    함수설명
    tptobackup()백업 머신으로 연결을 맺는 함수이다.
  • 연결 함수

    함수설명
    tpstart()Tmax 시스템과 연결을 시작하는 함수이다.
    tpend()Tmax 시스템과 연결을 종료하는 함수이다.
  • RQ 관련 함수

    함수설명
    tpenq()RQ에 클라이언트에서 보낸 요청을 저장하는 함수이다.
    tpdeq()RQ에 있는 데이터를 불러들이는 함수이다.
    tpqstat()RQ에 저장된 데이터 통계를 요구하는 함수이다.
    tpextsvcname()RQ에 저장된 데이터에서 서비스명을 요구하는 함수이다.
  • 환경변수 관련 함수

    함수설명
    tmaxreadenv()파일에서 환경변수를 불러들이는 함수이다.
    tpputenv()환경변수를 설정하는 함수이다.
    tpgetenv()환경변수 값을 반환하는 함수이다.
  • Window 조작 관련 함수

    함수설명
    WinTmaxStart()Tmax 시스템과 연결하는 함수이다.
    WinTmaxEnd()Tmax 시스템과 연결을 해제하는 함수이다.
    WinTmaxSetContext()Window 핸들을 지정하는 함수이다.
    WinTmaxSend()데이터를 송신하는 함수이다.
    WinTmaxAcall()Window용 비동기 함수이다.
    WinTmaxAcall2()데이터의 수신을 Callback 함수로 처리하는 Window용 비동기 함수이다.
  • 기타 함수

    함수설명
    tpscmt()환경파일의 트랜잭션 제어 관련 설정을 무효화하는 함수이다.
    tpgetlev()트랜잭션 모드를 확인하는 함수이다.
    tpchkauth()인증 필요 여부를 확인하는 함수이다.
    tpgprio()서비스 요청 우선순위를 확인하는 함수이다.
    tpsprio()서비스 요청 우선순위를 설정하는 함수이다.
    tpsleep()지정된 시간 내에 메시지 수신에 대기하는 함수이다.
    tp_sleep()초 단위로 데이터 수신에 대기하는 함수이다.
    tp_usleep()마이크로 초 단위로 데이터 수신에 대기하는 함수이다.
    tpschedule()큐에 쌓여있는 업무를 꺼내 UCS에게 처리를 할당하는 함수이다.
    tpuschedule()UCS서버 프로세스에서 데이터의 도착을 입력한 시간 동안 기다리는 함수이다.
    tpsvrinit()Tmax 서버 프로세스를 초기화하는 함수이다.
    tpsvrdone()Tmax 서버 프로세스 종료 루틴을 호출하는 함수이다.
    tpsvctimeout()UCS 서버 프로세스를 다운하는 함수이다.
    tmadmin()서비스 호출의 형태로 시스템 관리하는 함수이다.

다음은 atmi.h에 정의된 비표준 API 목록이다.

  • 서비스 종료 관련 함수

    함수설명
    tpforward()자신의 서비스 처리를 종료하고 클라이언트의 요청을 또다른 서비스 루틴으로 전달한다.
  • 클라이언트 연결 관련 함수

    함수설명
    tpstart()클라이언트 애플리케이션과 Tmax를 연결한다.
    tpend()클라이언트 애플리케이션과 Tmax를 연결을 해제한다.

FDL API

FDL(Field Definition Language)은 비표준 API이며, 개발자의 개발 생산성 향상을 위해 개발되었다. FDL은 필드키라고 불리는 인덱스와 데이터가 함께 관리되는 associative-typed data에 해당한다. FIELD 버퍼에 관련한 API는 fbuf.h에 정의되어 있다.

이와 같은 데이터는 Tmax 시스템에서 제공하는 버퍼의 일종인 필드키 버퍼에 실리며 이 버퍼를 조작하기 위한 다음과 같은 함수를 제공한다.

  • 필드키 사상함수

    함수설명
    fbget_fldkey()필드 이름에 대한 필드키 값을 반환한다.
    fbget_fldname()필드키의 이름을 반환한다.
    fbget_fldno()필드키로부터 필드 번호를 가져온다.
    fbget_fldtype()필드키로부터 필드형(type)을 가져온다. (정수 값 반환)
    fbget_strfldtype()필드키로부터 형에 대한 포인터 값을 가져온다.
  • 버퍼 할당 관련 함수

    함수설명
    fbisfbuf()지정된 버퍼가 필드화되어 있는지 알아본다.
    fbinit()필트키 버퍼로 할당된 메모리 공간을 초기화시킨다.
    fbcalcsize()필드 버퍼의 크기를 계산한다.
    fballoc()필트키 버퍼를 동적으로 할당한다.
    fbfree()필드 버퍼를 해제한다.
    fbget_fbsize()바이트 단위로 필드키 버퍼 크기를 반환한다.
    fbget_unused()사용되지 않은 필드 버퍼 공간을 확인한다.
    fbget_used()사용 중인 필드키 버퍼 공간을 바이트 수 단위로 반환한다.
    fbrealloc()버퍼 크기를 조절한다.
  • 필드 접근 및 수정 함수

    함수설명
    fbput()필드 버퍼에 필드키 값을 추가한다.
    fbinsert()필드키와 위치를 지정하고 필드 버퍼에 필드 값을 저장한다.
    fbchg_tu()데이터를 전송하기 전에 지정된 필드 버퍼를 이동시킨다.
    fbdelete()버퍼의 필드 데이터를 삭제한다.
    fbdelall()필드의 모든 값을 삭제한다.
    fbdelall_tu()필드키 배열(fieldkey[])에 나열된 모든 필드의 데이터를 삭제한다.
    fbget()버퍼에 있는 필드 내용을 찾는다.
    fbgetf()필드 버퍼에 있는 지정된 필드키의 필드 값을 얻는다.
    fbget_tu()지정된 위치에 있는 특정 필드키의 값을 얻는다.
    fbnext_tu()필드 버퍼의 특정 필드키의 필드 값을 순서대로 얻는다.
    fbgetalloc_tu()반환된 데이터를 저장하기 위해 다른 버퍼를 내부적으로 할당하고 그 포인터만을 버퍼에 반환한다.
    fbgetval_last_tu()필드 버퍼의 특정 필드키 occurrence와 최근 데이터 값을 얻는다.
    fbgetlast_tu()필드 버퍼에 지정된 필드의 최근 엔트리 데이터를 얻는다.
    fbgetnth()특정 필드 값을 검색한다.
    fbfldcount()특정 버퍼에 포함된 필드의 개수를 반환한다.
    fbkeyoccur()필드키에 지정된 필드 번호를 반환한다.
    fbispres()요청한 데이터가 필드 버퍼에 존재하는지 확인한다.
    fbgetval()요청한 데이터의 길이와 그 위치의 포인터를 반환한다.
    fbgetvall_tu()필드의 실제 값을 long 형식(type)으로 반환한다.
    fbupdate()지정된 위치의 필드 버퍼 안의 필드키의 필드 값을 갱신한다.
    fbgetlen()필드 버퍼 안의 지정한 필드키에 해당 되는 첫 번째 occurrence의 값을 반환한다.
  • 변환 함수

    함수설명
    fbtypecvt()데이터 형식을 변환한다.
    fbputt()새로운 데이터 값과 데이터 형식을 필드 버퍼로 덧붙인다.
    fbget_tut()지정된 위치의 필드 데이터를 얻고 필드키의 형식을 지정한다.
    fbgetalloc_tut()반환된 데이터를 정의된 데이터 형식으로 변환하고 저장하기 위해 내부적으로 다른 버퍼를 할당한다.
    fbgetvalt()반환된 값의 포인터를 반환한다.
    fbgetvali()integer 형식의 필드 데이터를 반환한다.
    fbgetvals()string 형식의 필드 데이터를 반환한다.
    fbgetvals_tu()지정된 위치의 string 형식의 필드 데이터를 반환한다.
    fbgetntht()변환된 값을 반환한다.
    fbchg_tut()필드 버퍼의 특정 시작 지점에서 필드키의 값을 바꾼다.
  • 버퍼 연산 관련 함수

    함수설명
    fbbufop()두 필드 버퍼의 내용을 비교, 복사, 이동, 변경한다.
  • 함수

    함수설명
    fbbufop_proj()필드키에 해당되는 버퍼를 변경한다.
  • I/O 관련 함수

    함수설명
    fbbufop_proj()필드키에 해당되는 버퍼를 변경한다.
    fbread()표준 입출력 라이브러리와 같이 사용하는 함수로 파일로부터 필드 버퍼를 읽어 들인다.
    fbwrite()표준 입출력 라이브러리와 같이 사용하는 함수로 파일에 쓰기를 한다.
    fbprint()표준 입출력으로 버퍼의 내용을 출력한다.
    fbfprint()필드 버퍼의 가능한 데이터를 파일 스트링으로 출력한다.
  • 에러 관련 함수

    함수설명
    fbstrerror()필드 버퍼 조작 시 발생한 에러의 메시지를 스트링 형태로 얻는다.
    getfberrno()에러가 발생하는 경우 에러 번호를 반환한다.
  • 기타 함수

    함수설명
    fbmake_fldkey()FDLFILE에 기록하지 않지만 새로운 필드키를 자동적으로 생성한다.
    fbftos()필드 버퍼에 저장된 데이터를 C 구조체(stname)로 옮긴다.
    fbstof()C 구조체로 저장된 데이터를 구조체 파일에 매핑되는 FIELD 버퍼로 옮긴다.
    fbsnull()C 구조체의 지정된 필드키 occurrence의 구조체 멤버 변수와 필드 버퍼와 매핑되는 것이 NULL 인지의 여부를 확인한다.
    fbstelinit()필드 버퍼와 매핑되는 C 구조체 멤버 변수를 NULL로 초기화시킨다.
    fbstinit()필드 버퍼와 매핑되는 C 구조체를 NULL로 초기화시킨다.

4.6. 에러 메시지

4.6.1. X/Open DTP 관련 에러

X/Open DTP에서 제공하는 인터페이스와 Tmax 시스템에서 제공하는 비표준 인터페이스를 사용하는 경우에 에러가 발생하면 해당 상황에 적절한 에러 값이 tperrno라고 불리는 전역 변수에 설정된다. 따라서 개발자는 에러가 발생하면 tperrno를 확인하여 적절한 후속 조처를 할 수 있다.

다음은 tperrno 에러 메시지 목록이다. tperrno는 에러상황이 발생할 경우에 설정이 되는 전역변수이다.

Error Message (tperrno)설명
TPEBADDESC(2)비동기식이나 대화형 타입에서 잘못된 Descriptor가 사용되는 경우에 발생한다.
TPEBLOCK(3)네트워크 오류인 경우에 발생한다.
TPEINVAL(4)적절하지 않은 인자가 입력된 경우 발생한다.
TPELIMIT(5)시스템에서 제공하는 각종 한계값을 벗어난 경우에 발생한다.
TPENOENT(6)서비스가 제공되지 않는 경우 발생한다.
TPEOS(7)시스템적인 문제로 연결이 불가능한 경우 발생한다.
TPEPROTO(9)프로토콜의 오류인 경우 발생한다.
TPESVCERR(10)응용 프로그래밍의 실패로 인한 Tmax 시스템 버퍼가 손상된 경우에 발생한다.
TPESVCFAIL(11)응용 프로그램의 레벨 서비스 오류인 경우 발생한다.
TPESYSTEM(12)Tmax 내부 오류(로그 메시지 확인)인 경우 발생한다.
TPETIME(13)처리시간이 초과(BLOCKTIME)된 경우 발생한다.
TPETRAN(14)트랜잭션 실패로 트랜잭션이 취소되는 경우 발생한다.
TPGOTSIG(15)시그널이 발생된 경우이다.
TPEITYPE(17)등록되지 않은 구조체 형식이나 필드키가 사용된 경우이다.
TPEOTYPE(18)버퍼 사용 오류 혹은 버퍼 형식 오류가 발생한 경우이다.
TPEEVENT(22)대화형 모드에서 이벤트가 발생한 경우이다.
TPEMATCH(23)RQ의 tpdeq() 함수를 호출할 때 해당 서비스에 대한 결과가 없는 경우에 발생한다.
TPENOREADY(24)서버 프로세스가 동작이 준비되지 않은 경우에 발생한다.
TPESECURITY(25)보안상 오류인 경우 발생한다.
TPEQFULL(26)서버 프로세스의 큐 대기시간이 초과된 경우에 발생한다.
TPEQPURGE(27)큐 퍼지로 인해 큐에서 제거되는 경우에 발생한다.
TPECLOSE(28)Tmax 시스템과 연결이 해제되는 경우에 발생한다.
TPESVRDOWN(29)응용 프로그램 오류로 서버 프로세스가 다운된 경우에 발생한다.
TPEPRESVC(30)이전 서비스 처리 도중 에러가 발생한 경우이다.
TPEMAXNO(31)동시 사용자 수가 한계값에 도달한 경우 발생한다.

참고

에러에 대한 설명과 대응 방법에 대한 자세한 내용은 “Tmax Application Development Guide”“Tmax Error Message Guide” 를 참고한다.

4.6.2. FDL 관련 에러

FDL 인터페이스에 대한 에러는 전역 변수 fberrno에 설정된다. 따라서 개발자는 에러가 발생하면 fberrno를 확인하여 적절한 후속 조치를 할 수 있다. 본 절에서는 FDL 관련한 에러 메시지에 대해 설명한다.

다음은 fberror 에러 메시지 목록이다. fberror은 에러상황이 발생할 경우에 설정이 되는 전역변수이다.

Error Message (fberror)설명
FBEBADFB(3)적절하지 않은 버퍼를 사용(필드키 버퍼가 아님)한 경우에 발생한다.
FBEINVAL(4)적절하지 않은 인자값이 사용된 경우에 발생한다.
FBELIMIT(5)시스템에서 제공하는 한계값을 벗어난 경우에 발생한다.
FBENOENT(6)해당 필드키가 버퍼에 존재하지 않는 경우에 발생한다.
FBEOS(7)운영체제에 오류가 발생한 경우이다.
FBEBADFLD(8)적절하지 않은 필드키가 사용된 경우이다.
FBEPROTO(9)프로토콜에 에러가 발생한 경우이다.
FBENOSPACE(10)버퍼 공간이 부족한 경우 발생한다.
FBEMALLOC(11)메모리 할당에 오류가 발생한 경우이다.
FBESYSTEM(12)시스템에 오류가 발생한 경우이다.
FBETYPE(13)타입에 오류가 발생한 경우이다.
FBEMATCH(14)일치하는 값이 없는 경우에 발생한다.
FBEBADSTRUCT(15)등록되지 않은 구조체가 사용된 경우에 발생한다.
FBEMAXNO(19)존재하지 않은 에러 번호가 사용된 경우에 발생한다.

참고

에러에 대한 설명과 대응 방법에 대한 자세한 내용은 “Tmax FDL Reference Guide”“Tmax Error Message Guide” 를 참고한다.