52
Tmax Programming Guide (SQ) Tmax v5.0 SP1 Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

Tmax Programming Guide (SQ) · AaBbCc123 명령어, 명령어 수행 후 화면에 출력된 결과물, 예제코드 [ ] 옵션 인수 값 | 선택 인수 값 안내서에 대하여

Embed Size (px)

Citation preview

Tmax

Programming Guide (SQ)

Tmax v5.0 SP1

Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

Copyright Notice

Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

대한민국 경기도 성남시 분당구 서현동 263 분당스퀘어(AK프라자) 12층

Restricted Rights Legend

All TmaxSoft Software (Tmax®) and documents are protected by copyright laws and the Protection Act of Com

puter Programs, and international convention. TmaxSoft software and documents are made available under the

terms of the TmaxSoft License Agreement and may only be used or copied in accordance with the terms of this

agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any

means, electronic, mechanical, or optical, without the prior written consent of TmaxSoft Co., Ltd.

이 소프트웨어(Tmax®) 사용설명서의 내용과 프로그램은 저작권법, 컴퓨터프로그램보호법 및 국제 조약에 의해

서 보호받고 있습니다. 사용설명서의 내용과 여기에 설명된 프로그램은 TmaxSoft Co., Ltd.와의 사용권 계약 하에

서만 사용이 가능하며, 사용권 계약을 준수하는 경우에만 사용 또는 복제할 수 있습니다. 이 사용설명서의 전부 또

는 일부분을 TmaxSoft의 사전 서면 동의 없이 전자, 기계, 녹음 등의 수단을 사용하여 전송, 복제, 배포, 2차적 저

작물작성 등의 행위를 하여서는 안 됩니다.

Trademarks

Tmax®, Tmax WebtoB® and JEUS® are registered trademark of TmaxSoft Co., Ltd. Other products, titles or

services may be registered trademarks of their respective companies.

Tmax®, Tmax WebtoB® 와 JEUS®는 TmaxSoft Co., Ltd.의 등록 상표입니다. 기타 모든 제품들과 회사 이름은 각

각 해당 소유주의 상표로서 참조용으로만 사용됩니다.

Open Source Software Notice

This product includes various open source software that has been developed and/or licensed by “OpenSSL”, “RSA

Data Security, Inc.”, “Apache Foundation”, or “Jean-loup Gailly and Mark Adler.” TmaxSoft fully respects the

aforementioned parties and the open source software used in this product. More details can be found within the

directory “${INSTALL_PATH}/license/oss_licenses”

본 제품은 “OpenSSL”, “RSA Data Security, Inc.”, “Apache Foundation” 및 “Jean-loup Gailly와 Mark Adler”에 의

해 개발 또는 라이선스된 오픈 소스 소프트웨어를 포함합니다. 오픈 소스 소프트웨어와 개발자에 대해 경의를 표

합니다. 관련 상세 정보는 제품의 디렉터리 “${INSTALL_PATH}/license/oss_licenses”에 기재된 사항을 참고해 주

십시오.

안내서 정보

안내서 제목: Tmax Programming Guide (SQ)

발행일: 2009-08-10

소프트웨어 버전: Tmax v5.0 SP1

안내서 버전: v2.1.1

내용 목차

안내서에 대하여 .......................................................................................................................... vii

제1장 소개 ................................................................................................................................. 1

1.1. Tmax 세션의 정의 ........................................................................................................ 1

1.2. SQ의 정의 ................................................................................................................... 1

1.3. 특징 ............................................................................................................................ 2

1.3.1. 키 기반 큐 ......................................................................................................... 2

1.3.2. 임시적인 분산 저장소 ........................................................................................ 3

1.3.3. GQ 지원 ............................................................................................................ 3

1.3.4. 모니터링 및 관리 기능 지원 ................................................................................ 3

1.4. 시스템 구성 ................................................................................................................. 3

1.4.1. 시스템 저장소 ................................................................................................... 3

1.4.2. SQS ................................................................................................................. 3

제2장 사용 및 관리 ...................................................................................................................... 5

2.1. 환경 설정 ..................................................................................................................... 5

2.1.1. NODE ............................................................................................................... 5

2.1.2. Tmax 환경파일 예제 .......................................................................................... 6

2.2. 상태 정보 관리 ............................................................................................................. 6

2.2.1. sqinfo ............................................................................................................... 6

2.2.2. sqpurge ............................................................................................................ 7

제3장 API ................................................................................................................................... 9

3.1. SQ API ........................................................................................................................ 9

3.2. GQ API ...................................................................................................................... 15

3.3. 키 및 세션 조회 API .................................................................................................... 20

제4장 예제 ................................................................................................................................ 25

4.1. 클라이언트 ................................................................................................................. 25

4.2. 서버 ........................................................................................................................... 27

Appendix A. 헤더파일 .............................................................................................................. 31

A.1. tmaxapi.h .................................................................................................................. 31

Tmax iii

그림 목차

[그림 1.1] Tmax 세션(Session) ..................................................................................................... 1

[그림 1.2] SQ 시스템 ................................................................................................................... 2

Tmax v

안내서에 대하여

안내서의 대상

본 안내서는 Tmax®(이하 Tmax)의 SQ(Session Queue)에 대한 개념과 사용법에 대해 기술한 안내서로

Tmax SQ를 사용하여 개발하는 개발자를 대상으로 한다.

안내서의 전제 조건

본 안내서는 Tmax 시스템에 대한 전반적인 이해와 Tmax 시스템이 제공하는 각종 기능 및 특성에 대한 습

득을 위한 기본서이다.

본 안내서를 원활하게 이해하기 위해서는 다음과 같은 사항을 미리 알고 있어야 한다.

● 미들웨어(Middleware) 및 UNIX 시스템에 대한 이해

● Tmax의 기본 개념 이해

● Java , C 프로그래밍의 이해

안내서의 제한 조건

본 안내서를 읽기 전에 Tmax의 기본 개념을 숙지하고 있어야 한다. 실무에서의 구체적인 사용방법이나

관리 및 운용에 관한 사항은 각 제품의 안내서를 참고한다.

참고

Tmax 시스템 개발에 대한 기본적인 내용은 "Tmax Administration Guide"나 "Tmax Application Devel

oment Guide"를 참고한다. Tmax에서 제공하는 명령어와 C API에 대한 설명은 “Tmax Reference

Guide”를 참고한다.

안내서에 대하여 vii

안내서 구성

Tmax Programming Guide(SQ)는 총 4개의 장과 Appendix로 구성되어 있다.

각 장의 주요 내용은 다음과 같다.

● 제1장: 소개

Tmax 세션(Session)의 정의 및 SQ의 개요 및 특징에 대해서 기술한다.

● 제2장: 사용 및 관리

SQ 시스템을 사용하기 위해서 Tmax 환경파일에 SQ를 설정하는 과정과 관리툴을 이용한 SQ 상태 정

보 확인 및 관리하는 방법에 대해서 기술한다.

● 제3장: API

SQ 시스템 구성에 대한 설명과 실제 애플리케이션 개발을 위한 API의 사용법에 대해서 기술한다.

● 제4장: 예제

SQ 시스템을 사용하는 클라이언트와 서버의 예제에 대해 기술한다.

● Appendix A.: 헤더파일

SQ API들의 원형과 시스템 변수를 선언한 헤더파일의 내용을 예제를 통해 기술한다.

viii Tmax Programming Guide (SQ)

안내서 규약

의미표기

프로그램 소스 코드의 파일명<AaBbCc123>

Ctrl과 C를 동시에 누름<Ctrl>+C

GUI의 버튼 또는 메뉴 이름[Button]

강조진하게

다른 관련 안내서 또는 안내서 내의 다른 장 및 절 언급" "(따옴표)

화면 UI에서 입력 항목에 대한 설명'입력항목'

메일계정, 웹 사이트하이퍼링크

메뉴의 진행 순서>

하위 디렉터리 또는 파일 있음+----

하위 디렉터리 또는 파일 없음|----

참고 또는 주의사항참고

그림 이름[그림 1.1]

표 이름[표 1.1]

명령어, 명령어 수행 후 화면에 출력된 결과물, 예제코드AaBbCc123

옵션 인수 값[ ]

선택 인수 값|

안내서에 대하여 ix

시스템 사용 환경

요구 사항

IBM AIX 5.xPlatform

HP-UX 11.xx

Solaris 7~9 (SunOS 5.7~5.9)

최소 120MB 하드디스크 공간Hardware

256MB 이상 메모리 공간

1GB 이상 하드디스크와 512MB 이상 메모리 공간 권장

Oracle 9i 또는 10gDatabase

x Tmax Programming Guide (SQ)

관련 안내서

설명안내서

Tmax를 이용하기 위한 환경설정을 하는 방법과 시스템 운영방식을

기술한 안내서이다.

Tmax

Administration Guide

Tmax 애플리케이션 프로그램 개발에 사용하는 API의 개념 및 사용

법과 예제를 기술한 안내서이다.

Tmax

Application Development Guide

안내서에 대하여 xi

연락처

Korea

TmaxSoft Co., Ltd

263 BundangSquare (AK Plaza) 12th floor, Seohyeon-dong, Bundang-gu,

Seongnam-si, Gyeonggi-do, 463-824

South Korea

Tel: +82-31-8018-1000

Fax: +82-31-8018-1115

Email: [email protected]

Web (Korean): http://www.tmax.co.kr

기술지원: http://technet.tmaxsoft.com

USA

TmaxSoft, Inc.

560 Sylvan Avenue Englewood Cliffs, NJ 07632

U.S.A

Tel: 1-201-567-8266

Fax: 1-201-567-7339

Email: [email protected]

Web (English): http://www.tmaxsoft.com

Japan

TmaxSoft Japan Co., Ltd.

5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073

Japan

Tel: +81-3-5765-2550

Fax: +81-3-5765-2567

Email: [email protected]

Web (Japanese): http://www.tmaxsoft.co.jp

xii Tmax Programming Guide (SQ)

China

TmaxSoft China Co., Ltd.

Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan,

Chaoyang District, Beijing, China, 100027

China

Tel: +86-10-6410-6145~8

Fax: +86-10-6410-6144

Email: [email protected]

Web (Chinese): http://www.tmaxsoft.com.cn

ASEAN Office

TmaxSoft Pte. Ltd.

30 Cecil Street, Level 15 Unit 05 Prudential Tower, Singapore 049712

Singapore

Tel: +65-6232-2889

Fax: +65-6232-2919

Email: [email protected]

Web (English): http://asean.tmaxsoft.com

안내서에 대하여 xiii

제1장 소개

본 장에서는 Tmax 세션(Session)의 정의 및 SQ의 개요 및 특징에 대해서 설명한다.

1.1. Tmax 세션의 정의Tmax 세션은 기본적으로 클라이언트가 Tmax 시스템과 연결을 맺고(tpstart() 함수) 끊는 것(tpend() 함수)

을 하나의 세션으로 정의한다. 이 경우 클라이언트에서 호출된 서비스들은 같은 세션이 되며, 세션은 도메

인 내에서만 유지된다.

UCS 서비스는 usermain() 루틴에서 요청이 시작되는 경우에 새로운 세션이 시작될 수 있으며, 이때 사용

되는 OUTBOUND 채널은 CLH와 지속적인 연결을 맺고 있으므로 하나의 세션(Long Term Session)으로

처리된다. 재시작할 때마다 새로운 세션이 시작된다고 볼 수 있다.

다음은 Tmax 세션 흐름에 대한 그림이다.

[그림 1.1] Tmax 세션(Session)

1.2. SQ의 정의SQ(Session Queue)는 같은 세션으로 묶인 클라이언트와 서비스 사이에 효율적인 데이터 공유를 위한 세

션 데이터 저장소를 제공한다. 같은 세션 내에서만 접근이 가능하며 세션이 종료되면 자동으로 자원이 해

제된다. 또한 세션에 관계없이 글로벌하게 접근 가능한 GQ(Global Queue)도 제공한다. GQ의 데이터는

엔진이 종료될 때 자원을 해제한다.

제1장 소개 1

다음은 SQ 시스템에 대한 그림이다.

[그림 1.2] SQ 시스템

1.3. 특징SQ는 다음과 같은 특징을 가지고 있다.

1.3.1. 키 기반 큐

SQ는 일반적인 큐와 달리 키 기반(Key-based)의 큐를 제공하므로 데이터 입/출력의 경우 반드시 키를 사

용해야 한다. SQ에서는 키의 유일성(Uniqueness)을 보장해 주므로 데이터를 입력(PUT)할 때 중복된 키

가 입력되면 에러(TPEMATCH)를 반환한다. 단, 업데이트 플래그(TPSQ_UPDATE)를 사용할 때는 데이터

가 업데이트된다. GQ의 경우 사용자 키를 사용할 때 유일성에 대해서는 시스템 효율성을 위해 사용자의

몫으로 두고 있다. 단, 시스템에서 제공하는 키를 사용할 경우 유일성을 보장할 수 있다.

다음은 SQ 또는 GQ에서 제공하는 키 방식에 대한 설명이다.

시스템 키(SYSKEY) 사용 방식

시스템 키를 사용할 때 SQ 시스템에서 생성되는 유일한(Unique) 키를 사용할 수 있다. SYSKEY는 16

Byte(SQ_SYSKEY_SIZE로 규정되어 있음) 크기의 키로서 “$SQID”라는 5개의 문자로 시작하게 된다. 나

머지 11 Byte는 시스템 내부에서 사용하게 된다. 따라서 사용자는 “$SQID”로 시작하는 키를 임의로 사용

할 수 없다.

사용자 키(USERKEY) 사용 방식

사용자가 임의로 지정할 수 있는 키로서 유일성 보장은 사용자 몫이다.

2 Tmax Programming Guide (SQ)

1.3.2. 임시적인 분산 저장소

SQ의 빠르고 효율적인 I/O를 지원하기 위해 공유 메모리 저장소를 사용하며, 특히 멀티 노드 환경에서는

분산 저장되도록 하여 확장성을 제공한다. 단, 주로 세션이 유지되는 동안 임시적으로 사용되므로 데이터

는 세션이 종료되었을 때 자동 삭제되며(GQ의 경우 엔진이 종료될 때 데이터 삭제됨) 엔진 장애의 경우

복구(Recovery)는 지원하지 않는다.

참고

트랜잭션으로 묶이거나 데이터 손실이 치명적일 경우 RQ를 사용할 것을 권장한다.

1.3.3. GQ 지원

GQ(Global Queue)는 세션에 관계없이 글로벌하게 데이터를 공유할 수 있다. 멀티 노드환경까지 지원하

며 도메인을 넘어갈 수는 없다. GQ도 시스템 키와 사용자 키를 사용할 수 있으며 성능면에서는 시스템 키

를 사용할 것을 권장한다.

1.3.4. 모니터링 및 관리 기능 지원

SQ에 대한 모니터링 및 관리는 Tmax 관리 툴(tmadmin)을 통해서 지원한다.

1.4. 시스템 구성Tmax SQ 시스템은 시스템 저장소, SQS, RQ API로 구성된다. RQ API에 대한 내용은 “제3장 API”를 참고

한다.

1.4.1. 시스템 저장소

Tmax SQ 시스템은 공유 메모리 저장소를 사용하여 보다 빠른 성능 및 효율적인 데이터 공유를 제공한다.

따라서 환경 설정할 때 공유 메모리 키값 및 크기 등을 지정해야 한다. 또한 저장소의 크기가 메모리 크기

를 넘어갈 수 없으므로 대용량의 데이터를 저장해야할 경우는 제약이 필요하다.

1.4.2. SQS

SQS는 CLH(클라이언트 매니저)의 제어를 받으며 SQ 데이터를 저장하고 읽어 들이는 모든 과정을 관리

하고 제어한다.

제1장 소개 3

제2장 사용 및 관리

본 장에서는 SQ 시스템을 사용하기 위해서 Tmax 환경파일에 SQ를 설정하는 과정과 관리 툴을 이용한

SQ 상태 정보 확인 및 관리하는 방법에 대해서 설명한다. 또한 간단한 사용 예제를 통해 애플리케이션 개

발에 있어 SQ의 응용법에 대한 예를 보이고자 한다.

2.1. 환경 설정실제 애플리케이션 개발에 앞서 SQ 시스템을 시작하기 위해서는 기본적인 설정이 필요하다. SQ 시스템

은 노드 단위로 관리되며 Tmax 환경파일의 NODE 절에 적절한 정의를 필요로 한다.

참고

Tmax 환경파일 설정에 대한 더 자세한 사항은 "Tmax Administration Guide"를 참고한다.

2.1.1. NODE

SQ 시스템을 사용하기 위해서는 NODE 절에 SQKEY, SQSIZE, SQMAX, SQKEYMAX, SQTIMEOUT을

설정해 주어야 하며, 이 중 SQ를 사용하려면 SQKEY, SQSIZE, SQMAX는 반드시 설정해 주어야 한다.

설명항목

SQ 저장소로 사용될 공유 메모리 세그먼트(shared memory segment)를 가

리키는 키값을 정의한다.

SQKEY

SQ 저장소로 사용될 공유 메모리 세그먼트의 크기를 정의한다. Kbyte 단위

로서 4 Kbyte 이상으로 지정해야 한다.

SQSIZE

노드에 생성될 수 있는 최대 SQ 개수로서 짝수로 설정해야 한다. 홀수로 설

정할 경우 하나 작아진다.

SQMAX

각 SQ 에서 저장 가능한 최대 키 개수이다. 기본값은 무한대이다.SQKEYMAX

SQ 데이터 보관 타임아웃이다. 단위는 초이며 타임아웃의 경우 데이터가 자

동 삭제된다. 기본값은 무한대이다.

SQTIMEOUT

제2장 사용 및 관리 5

2.1.2. Tmax 환경파일 예제

*DOMAIN

tmax ...

*NODE

tmax1 ...,

SQKEY = 80000, SQSIZE = 8192, SQMAX = 1024, SQKEYMAX = 64,

SQTIMEOUT = 30

2.2. 상태 정보 관리Tmax 시스템이 기동되면 Tmax에서 제공하는 관리 툴인 tmadmin을 이용하여 시스템의 상태를 자세히 관

리할 수 있다.

tmadmin에서 SQ와 관련한 명령으로는 sqinfo(sqi)와 sqpurge(sqp)가 있다. sqinfo는 현재 사용되고 있는

SQ 및 GQ에 대한 사용량 및 키에 대한 정보를 조회할 수 있다. sqpurge는 관리자가 원하는 키에 대해서

강제 삭제할 수 있는 기능을 제공한다.

참고

관리 툴에 대한 자세한 사항은 "Tmax Administration Guide"를 참고한다.

2.2.1. sqinfo

SQ 및 GQ에 대한 사용량 및 키에 대한 정보를 조회할 수 있다. 멀티 노드 환경에서는 노드별로 조회된다.

(GQ의 경우 세션 ID는 “0xffffffff”이다.)

옵션을 주지 않을 경우는 모든 SQ 및 GQ에 대한 사용량 등 큐에 대한 정보를 제공하며, -k 옵션을 사용할

경우에는 지정한 세션에 저장되어 있는 키 리스트에 대한 상세한 정보를 제공한다.

다음은 sqinfo command에 관한 설명이다.

ArgumentOptionCommand

-k-ksqinfo

아래는 sqinfo에 대한 화면 예이다.

$ tmax1 (tmadm): sqi

-----------------------------------------------------------------------

session_id type clhno index issuer count size

-----------------------------------------------------------------------

0xffffffff GLOBAL - - - 5 785

0x00000327 SERVER 0 113 svr_ucs 0 0

6 Tmax Programming Guide (SQ)

0x00004000 CLIENT 1 0 192.168.1.123 0 0

0x00004327 SERVER 1 113 svr_ucs 0 0

-----------------------------------------------------------------------

allocated in total = 4096 bytes, actually used = 2208 bytes

-----------------------------------------------------------------------

Msg from rnode(tmax2):

-----------------------------------------------------------------------

session_id type clhno index issuer count size

-----------------------------------------------------------------------

0xffffffff GLOBAL - - - 0 0

-----------------------------------------------------------------------

allocated in total = 4096 bytes, actually used = 576 bytes

-----------------------------------------------------------------------

(allocated in total은 사용을 위해서 할당된 메모리 크기, actually used는 할당된 메모리 중

실제 사용 중인 메모리 크기를 의미한다.

이 값은 시스템에서 내부적으로 사용하는 메모리 크기를 포함한다.)

$ tmax1 (tmadm): sqi -k 0x00004000

-----------------------------------------------------------------------

ind key(hexa) key(string) klen dlen stime

-----------------------------------------------------------------------

1 61626331 abcd 4 144 10:50:07

2.2.2. sqpurge

마스터 모드의 tmadmin의 경우에만 SQ 및 GQ의 원하는 키를 삭제할 수 있다. 단, 로컬 노드에 있는 키에

대해서만 삭제 가능하다.

아래는 sqpurge에 대한 화면의 예이다.

$ tmax1 (tmadm): sqp 0x00000000

-----------------------------------------------------------------------

ind key(hexa) key(string) klen dlen stime

-----------------------------------------------------------------------

1 61626331 abc1 4 144 10:47:47

select?(1 - 1, 0 for all) 1

1 will be purged.

key = 61626331(abc1), klen(dlen) = 4(144).

ok?(y or n) y

제2장 사용 및 관리 7

purge ok

8 Tmax Programming Guide (SQ)

제3장 API

본 장에서는 실제 애플리케이션 개발을 위한 API의 사용법에 대해서 소개한다.

API는 크게 세 가지 형태로 제공된다. SQ를 사용하기 위한 API, GQ를 사용하기 위한 API, 키 리스트 및

세션에 대한 조회를 위한 API가 있다.

특히 SQ API(“tmax_sq_”로 시작)와 GQ API(“tmax_gq_”로 시작)는 함수 이름만 다를 뿐 동일한 방식으로

수행된다.

참고

각 API 설명 중 에러 코드에 대한 자세한 내용은 Tmax 안내서 중 "Tmax Application Development

Guide"를 참고한다.

3.1. SQ APISQ에서 사용되는 함수에 대해 설명한다.

tmax_sq_put

서버 데이터를 세션 큐에 저장하는 함수이다. 데이터를 SQ에 저장하는 함수로서 키와 데이터 값을 넘겨

야 한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_sq_put(char *key, long keylenl, char *data, long lenl, long flagsl)

● 파라미터

설명파라미터

SQ에 저장할 데이터를 위한 키값을 저장할 버퍼이다.key

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

SQ에 저장할 데이터를 담고 있는 버퍼이다. 반드시 tpalloc()으로 할당된 버

퍼에 대한 포인터이어야 한다.

data

SQ에 저장할 데이터 버퍼의 크기를 지정한다. (Byte 단위)lenl

TPSQ_UPDATE, TPSQ_SYSKEY, TPSQ_KEYGEN이 지정될 수 있다.flagsl

제3장 API 9

다음은 flagsl에 설정되는 값에 대한 설명이다.

설명설정값

키값이 같을 경우 업데이트 한다. 플래그가 설정되어 있지 않으면 TPEMATCH

에러가 반환된다.

TPSQ_UPDATE

tmax_sq_keygen()를 통해 생성된 시스템 키를 사용할 경우 설정한다.TPSQ_SYSKEY

시스템 키를 자동 생성시켜서 저장한다.TPSQ_KEYGEN

key는 SQ_SYSKEY_SIZE 크기로 할당해야 한다( keylenl =

SQ_SYSKEY_SIZE). 성공적으로 수행되면 key에 생성된 키값이 저장된다.

● 반환값

설명반환값

함수 호출에 성공한 경우1

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

현 세션을 위한 SQ가 존재하지 않는다.TPENOENT

사용된 키값이 이미 존재한다.TPEMATCH

SQ 최대 개수를 초과했거나 SQ의 최대 키 개수를 초과하였다.TPELIMIT

tmax_sq_get

데이터를 세션 큐에 저장하는 함수로 SQ에서 데이터를 가져오기 위해 키를 지정하면 해당 키의 데이터를

가져온다. 기본적으로 tmax_sq_get()을 수행하면 큐에서 데이터가 삭제된다. 데이터를 보존하려면 TP

SQ_PEEK 플래그를 설정해야 한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_sq_get(char *key, long keylenl, char **data, long *lenl, long flagsl)

● 파라미터

10 Tmax Programming Guide (SQ)

설명파라미터

SQ에서 가져올 데이터를 위한 키값을 저장할 버퍼이다.key

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

SQ에서 가져올 데이터 버퍼에 대한 포인터이다. 반드시 tpalloc() 으로 할당

된 버퍼에 대한 포인터이어야 한다.

data

SQ에서 가져온 데이터 버퍼의 크기가 저장된다. (Byte 단위)lenl

TPSQ_PEEK이 지정될 수 있다.flagsl

TPSQ_PEEK이 플래그를 지정할 경우 데이터를 큐에서 삭제하지 않는다.

● 반환값

설명반환값

함수 호출에 성공한 경우1

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

현 세션을 위한 SQ가 존재하지 않는다.TPENOENT

지정한 키의 데이터가 존재하지 않는다.TPEMATCH

tmax_sq_count

현재 SQ에 저장된 데이터 개수를 반환하는 함수이다.

● 프로토타입

#include <tmaxapi.h>

int tmax_sq_count(void)

● 반환값

설명반환값

함수 호출에 성공한 경우0

제3장 API 11

설명반환값

함수 호출에 실패한 경우-1

( tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

현 세션을 위한 SQ가 존재하지 않는다.TPENOENT

tmax_sq_purge

SQ의 데이터를 삭제하기 위한 함수이다. 키를 지정할 경우 해당 키의 데이터를 삭제하고 키를 지정하지

않으면 모든 데이터를 삭제한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_sq_purge(char *key, long keylenl)

● 파라미터

설명파라미터

SQ에서 삭제할 데이터를 위한 키값을 저장할 버퍼이다. NULL일 경우 현 세

션 SQ의 모든 데이터를 삭제한다.

key

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

● 반환값

설명반환값

함수 호출에 성공한 경우삭제된 데이터의 개수

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

● 오류

다음은 중요 에러 코드에 대한 설명이다.

12 Tmax Programming Guide (SQ)

설명에러 코드

현 세션을 위한 SQ가 존재하지 않는다.TPENOENT

tmax_sq_keygen

시스템 키 생성 및 가져오기를 위한 함수이다. 시스템 키 사이즈는 SQ_SYSKEY_SIZE(16 Byte)이다. 버

퍼 크기는 시스템 키 사이즈보다 크거나 같게 할당해야 한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_sq_keygen(char *key, long keylenl)

● 파라미터

설명파라미터

생성된 시스템 키값이 저장될 버퍼이다. 버퍼의 크기는 SQ_SYSKEY_SIZE(16

Byte)보다 크게 할당해야 한다.

key

키 버퍼의 크기를 지정한다. 반드시 SQ_SYSKEY_SIZE(16 Byte)보다 커야

한다.

keylenl

● 반환값

설명반환값

함수 호출에 성공한 경우1

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

현 세션을 위한 SQ가 존재하지 않는다.TPENOENT

제3장 API 13

tmax_sq_getkeylist

현 세션 SQ의 키 리스트를 가져오기 위한 함수이다.

키 리스트는 SQ_KEYLIST_T 타입의 핸들이 반환되며, 각 키에 대한 정보는 tmax_keylist_count(),

tmax_keylist_getakey(), tmax_keylist_free() 함수를 통해서 확인할 수 있다. 키 리스트는 Byte 단위로

ASCII 코드값을 비교하여 낮은 값 우선으로 정렬된다. 키값을 지정할 경우 해당 키값보다 크거나 같은 키

리스트가 정렬되어 조회된다. 키값을 NULL로 지정할 경우, 전체 키 리스트가 조회된다.

● 프로토타입

#include <tmaxapi.h>

SQ_KEYLIST_T tmax_sq_getkeylist(char *key, long keylenl)

● 파라미터

설명파라미터

키값을 저장할 버퍼이다.key

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

● 반환값

설명반환값

함수 호출에 성공한 경우SQ_KEYLIST_T

함수 호출에 실패한 경우NULL

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

현 세션을 위한 SQ가 존재하지 않는다.TPENOENT

지정한 키보다 크거나 같은 키가 존재하지 않는다.TPEMATCH

14 Tmax Programming Guide (SQ)

3.2. GQ APIGQ에서 사용되는 함수에 대해 설명한다.

tmax_gq_put

데이터를 GQ에 저장하는 함수로 키와 데이터 값을 전달한다. tmax_gq_keygen() 함수를 통해 생성된 시

스템 키를 사용한다면 TPSQ_SYSKEY 플래그를 사용해야 한다. 시스템 키를 생성하여 저장하려면 TP

SQ_KEYGEN 플래그를 사용해야 한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_gq_put(char *key, long keylenl, char *data, long lenl, long flagsl)

● 파라미터

설명파라미터

GQ에 저장할 데이터를 위한 키값을 저장할 버퍼이다.key

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

GQ에 저장할 데이터를 담고 있는 버퍼이다. 반드시 tpalloc()으로 할당된 버

퍼에 대한 포인터이어야 한다.

data

GQ에 저장할 데이터 버퍼의 크기를 지정한다. (Byte 단위)lenl

TPSQ_UPDATE, TPSQ_SYSKEY, TPSQ_KEYGEN이 지정될 수 있다.flagsl

다음은 flagsl에 설정되는 값에 대한 설명이다.

설명설정값

키값이 같을 경우 업데이트 한다. 이 플래그가 설정되어 있지 않으면 TPE

MATCH 에러가 반환된다.

TPSQ_UPDATE

시스템 키를 사용할 경우 설정한다.TPSQ_SYSKEY

시스템 키를 자동 생성시켜서 저장한다. 이 플래그를 사용할 경우 key는

SQ_SYSKEY_SIZE 크기로 할당해야 한다. ( keylenl = SQ_SYSKEY_SIZE)

성공적으로 수행되면 key에 생성된 키값이 저장된다.

TPSQ_KEYGEN

● 반환값

설명반환값

함수 호출에 성공한 경우1

함수 호출에 실패한 경우-1

제3장 API 15

설명반환값

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

사용된 키값이 이미 존재한다.TPEMATCH

GQ의 최대 키 개수를 초과하였다.TPELIMIT

tmax_gq_get

GQ에서 데이터를 가져오는 함수로 키를 지정하면 해당 키의 데이터를 가져온다. 기본적으로 tmax_gq_get()

을 수행하면 큐에서 데이터가 삭제된다. 데이터를 보존하려면 TPSQ_PEEK 플래그를 설정해야 한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_gq_get(char *key, long keylenl, char **data, long *lenl, long flagsl)

● 파라미터

TPSQ_PEEK이 지정될 수 있다.

설명파라미터

GQ에서 가져올 데이터를 위한 키값을 저장할 버퍼이다.key

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

GQ에서 가져올 데이터 버퍼에 대한 포인터이다. 반드시 tpalloc()으로 할당된

버퍼에 대한 포인터이어야 한다.

data

GQ에서 가져온 데이터 버퍼의 크기가 저장된다. (Byte 단위)lenl

TPSQ_PEEK이 지정될 수 있다.flagsl

TPSQ_PEEK이 플래그를 지정할 경우 데이터를 큐에서 삭제하지 않는다.

● 반환값

설명반환값

함수 호출에 성공한 경우1

함수 호출에 실패한 경우-1

16 Tmax Programming Guide (SQ)

설명반환값

( tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

지정한 키의 데이터가 존재하지 않는다.TPEMATCH

tmax_gq_count

GQ에 저장된 데이터의 개수를 반환한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_gq_count (void)

● 반환값

설명반환값

함수 호출에 성공한 경우0

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

tmax_gq_purge

GQ의 데이터를 삭제하기 위한 함수로서 키를 지정할 경우 해당 키의 데이터를 삭제하고 키를 지정하지

않을 경우 모든 데이터를 삭제한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_gq_purge(char *key, long keylenl)

● 파라미터

제3장 API 17

설명파라미터

GQ에서 삭제할 데이터를 위한 키값을 저장할 버퍼이다.key

NULL일 경우 GQ의 모든 데이터를 삭제한다.

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

● 반환값

설명반환값

함수 호출에 성공한 경우삭제된 데이터의 개수

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

tmax_gq_keygen

시스템 키 생성 및 가져오기를 위한 함수이다. 시스템 키 사이즈는 SQ_SYSKEY_SIZE(16 Byte)이므로 이

보다 버퍼 크기를 크거나 같게 할당해야 한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_gq_keygen(char *key, long keylenl)

● 파라미터

설명파라미터

생성된 시스템 키값이 저장될 버퍼이다. 버퍼의 크기는 SQ_SYSKEY_SIZE(16

Byte) 보다 크게 할당해야 한다.

key

키 버퍼의 크기를 지정한다. 반드시 SQ_SYSKEY_SIZE(16 Byte)보다 커야

한다.

keylenl

● 반환값

설명반환값

함수 호출에 성공한 경우1

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

18 Tmax Programming Guide (SQ)

tmax_gq_getkeylist

GQ의 키 리스트를 가져오기 위한 함수이다. 키 리스트는 SQ_KEYLIST_T타입의 핸들이 반환되며, 각 키

에 대한 정보는 tmax_keylist_count(), tmax_keylist_count(), tmax_keylist_free() 함수를 통해서 확인

할 수 있다. 키 리스트는 바이트 단위로 ASCII 코드값을 비교하여 낮은 값 우선으로 정렬된다. 키값을 지

정할 경우 해당 키값보다 크거나 같은 키 리스트가 정렬되어 조회된다. 키값을 NULL로 지정할 경우, 전체

키 리스트가 조회된다.

● 프로토타입

#include <tmaxapi.h>

SQ_KEYLIST_T tmax_gq_getkeylist(char *key, long keylenl)

● 파라미터

설명파라미터

키값을 저장할 버퍼이다.key

키 버퍼의 크기를 지정한다. (Byte 단위)keylenl

● 반환값

설명반환값

함수 호출에 성공한 경우SQ_KEYLIST_T

함수 호출에 실패한 경우NULL

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

지정한 키보다 크거나 같은 키가 존재하지 않는다.TPEMATCH

제3장 API 19

3.3. 키 및 세션 조회 API

tmax_get_sessionid

현 세션의 ID를 반환하는 함수이다.

● 프로토타입

#include <tmaxapi.h>

int tmax_get_sessionid(void)

● 반환값

설명반환값

함수 호출에 성공한 경우-1이 아닌 값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

세션이 이미 종료 되었다.[TPEPROTO]

참고

기타 에러 코드에 대한 자세한 내용은 Tmax 안내서 중에 "Tmax Application Development Guide"를

참고한다.

tmax_keylist_count

keylist 핸들로부터 키 리스트의 개수를 반환한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_keylist_count(SQ_KEYLIST_T keylist)

● 파라미터

20 Tmax Programming Guide (SQ)

설명파라미터

tmax_sq_getkeylist() 또는 tmax_gq_getkeylist()로부터 넘겨 받은 핸들이다.keylist

● 반환값

설명반환값

함수 호출에 성공한 경우0

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

잘못된 keylist 핸들이다.TPEBADDESC

tmax_keylist_getakey

keylist 핸들로 부터 n번째 키 정보를 가져온다.

● 프로토타입

#include <tmaxapi.h>

int tmax_keylist_getakey(SQ_KEYLIST_T keylist, int nth, SQ_KEYINFO_T *keyinfo)

● 파라미터

설명파라미터

tmax_sq_getkeylist() 또는 tmax_gq_getkeylist()로부터 넘겨 받은 핸들이

다.

keylist

keylist 핸들로 부터 n번째 키이다.nth

n은 0에서 부터 tmax_keylist_count() -1사이의 값이어야 한다.

n번째 키의 정보가 저장될 구조체이다.keyinfo

- long keylen : 키의 크기(Byte 단위)

- long datalen : 데이터의 크기 (Byte 단위)

- time_t starttime : 데이터가 저장 혹은 업데이트된 시간

제3장 API 21

설명파라미터

- char *key : 키값을 담고 있는 버퍼

● 반환값

설명반환값

함수 호출에 성공한 경우1

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명에러 코드

잘못된 keylist 핸들이다.TPEBADDESC

nth의 범위를 벗어났다.TPELIMIT

tmax_keylist_free

keylist 핸들의 메모리나 기타 자원들을 해제한다.

● 프로토타입

#include <tmaxapi.h>

int tmax_keylist_free(SQ_KEYLIST_T keylist)

● 파라미터

설명파라미터

tmax_sq_getkeylist() 또는 tmax_gq_getkeylist()로부터 넘겨 받은 핸들이다.keylist

● 반환값

설명반환값

함수 호출에 성공한 경우-1이 아닌 값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다. )

22 Tmax Programming Guide (SQ)

● 오류

다음은 중요 에러 코드에 대한 설명이다.

설명반환값

잘못된 keylist 핸들이다.TPEBADDESC

제3장 API 23

제4장 예제

4.1. 클라이언트

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

// Put할 Key의 개수

#define KEYCOUNT 3

int get_keylist(char [KEYCOUNT][SQ_SYSKEY_SIZE+1]);

int main(int argc, char *argv[])

{

char *sqbuf, *sndbuf, sqbuf_org[1024];

char put_key[KEYCOUNT][SQ_SYSKEY_SIZE+1];

char get_key[KEYCOUNT][SQ_SYSKEY_SIZE+1];

long sqbuf_len = 0, rlen, flags;

int ret, i, len=0, sys_flag=0;

char key[SQ_SYSKEY_SIZE+1];

if ( (ret = tmaxreadenv( "tmax.env","TMAX" )) == -1 ){

printf( "tmax read env failed[%s]\n", tpstrerror(tperrno) );

return -1;

}

// Tmax 시스템에 접속

if (tpstart((TPSTART_T *)NULL) == -1){

printf("tpstart failed [%s]\n", tpstrerror(tperrno));

return -1;

}

// 세션 큐에 Put할 데이터 할당 (반드시 tpalloc으로 할당)

if ((sqbuf = (char *)tpalloc("STRING", NULL, 0)) == NULL) {

printf("sqbuf alloc failed [%s]\n", tpstrerror(tperrno));

tpend();

return -1;

}

제4장 예제 25

if ((sndbuf = (char *)tpalloc("STRING", NULL, 0)) == NULL) {

printf("sndbuf alloc failed [%s]\n", tpstrerror(tperrno));

tpend();

return -1;

}

if (argc != 3)

{

printf("Usage : %s Key Data\n", argv[0]);

printf(" Key : \"SYSTEM\" or Specific Key Value\n");

exit(1);

}

strcpy(key, argv[1]);

strcpy(sqbuf_org, argv[2]);

// tmax_sq_put 시 사용할 플래그 초기화

flags = 0L;

// 시스템 키 사용할 때

if(!strcmp(key, "SYSTEM"))

{

flags |= TPSQ_SYSKEY;

flags |= TPSQ_KEYGEN;

len = SQ_SYSKEY_SIZE;

sys_flag = 1;

}

else

{

strcpy(put_key[0], key);

len = strlen(key);

}

// 키값이 중복될 경우, 기존의 데이터를 업데이트 한다. 이 플래그가 설정되지 않으면

// 키값 중복 에러

flags |= TPSQ_UPDATE;

for(i=0; i<KEYCOUNT; i++)

{

if( !sys_flag )

{

memset(put_key[i], 0x00, SQ_SYSKEY_SIZE+1);

sprintf(put_key[i], "%s%d", key, i);

}

memset(sqbuf, 0x00, 1024);

sprintf(sqbuf, "%s%d", sqbuf_org, i);

26 Tmax Programming Guide (SQ)

// 세션 큐에 데이터를 PUT 한다.

ret = tmax_sq_put(put_key[i], len+1, sqbuf, strlen(sqbuf), flags);

if(ret < 0)

{

printf("tmax_sq_put error, key = %s [%s]\n", put_key[i],

tpstrerror(tperrno));

tpfree(sqbuf);

tpend();

exit(1);

}

// 키, 데이터 값 출력

printf("PUT : [%d] Key = [%s] , Data = [%s]\n", i, put_key[i], sqbuf);

}

printf("\n");

// Tmax 서비스 호출

ret = tpcall("GET_SQ", (char *)sndbuf, 0, (char **)&sndbuf, &rlen,

TPNOFLAGS);

if(ret < 0)

{

printf("tpcall failed [%s]\n", tpstrerror(tperrno));

tpfree((char *)sndbuf);

tpfree((char *)sqbuf);

tpend();

exit(1);

}

printf("recv data: %s\n", sndbuf);

tpfree((char *)sqbuf);

tpfree((char *)sndbuf);

tpend();

return 0;

}

4.2. 서버

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

#define MAXKEYCNT 10

GET_SQ(TPSVCINFO *msg)

{

제4장 예제 27

char get_key[MAXKEYCNT][SQ_SYSKEY_SIZE+1];

int count;

count = get_keylist(get_key);

sprintf(msg->data, "GET_SQ is done, count=[%d]", count);

tpreturn(TPSUCCESS,0,(char *)msg->data, 0,0);

}

int get_keylist(char get_key[MAXKEYCNT][SQ_SYSKEY_SIZE])

{

char *sqbuf = NULL;

SQ_KEYLIST_T sqh;

SQ_KEYINFO_T keyinfo;

long sqbuf_len = 0;

int count, i, j, ret;

if ((sqbuf = (char *)tpalloc("STRING", NULL, 0)) == NULL) {

printf("sqbuf alloc failed [%s]\n", tpstrerror(tperrno));

}

// SQ에 저장되어 있는 키 리스트를 가져온다.

sqh = tmax_sq_getkeylist(NULL, 0);

if(sqh != NULL)

{

// 키의 개수

count = tmax_keylist_count(sqh);

for(i=0; i<count; i++)

{

memset((char *)&keyinfo, 0x00, sizeof(keyinfo));

// i 순번에 해당하는 키값을 구하여 저장

tmax_keylist_getakey(sqh, i, &keyinfo);

memset(get_key[i], 0x00, SQ_SYSKEY_SIZE);

for(j=0; j< keyinfo.keylen; j++)

get_key[i][j] = keyinfo.key[j];

get_key[i][j] = 0;

// SQ에서 키값에 해당하는 데이터 저장

ret = tmax_sq_get(get_key[i], strlen(get_key[i]),

(char **)&sqbuf, &sqbuf_len, 0);

if(ret < 0)

{

printf("tmax_sq_get failed [%s]\n", t

pstrerror(tperrno));

tpfree(sqbuf);

28 Tmax Programming Guide (SQ)

return -1;

}

printf("GET : [%d] Key = [%s] , Data = [%s]\n", i,

get_key[i], sqbuf);

}

printf("\n");

// sqh 해제

tmax_keylist_free(sqh);

}

return i;

}

제4장 예제 29

Appendix A. 헤더파일

좀 더 자세한 정보를 원하는 사용자를 위해 SQ API 들의 원형과 시스템 변수를 선언한 헤더 파일의 내용

을 예시하였다.

Tmax가 제공하는 헤더 파일들은 TMAXDIR/usrinc에 위치한다.

A.1. tmaxapi.h

/* ------------------------ usrinc/tmaxapi.h ------------------ */

/* */

/* Copyright (c) 2000 - 2004 Tmax Soft Co., Ltd */

/* All Rights Reserved */

/* */

/* ------------------------------------------------------------ */

#ifndef _TMAXAPI_H

#define _TMAXAPI_H

#ifndef _CE_MODULE

#include <sys/types.h>

#endif

#include <usrinc/atmi.h>

#ifdef _WIN32

#ifdef _CE_MODULE

#include <winsock.h>

#else

#include <winsock2.h>

#endif /* _CE_MODULE */

#include <usrinc/svct.h>

#include <usrinc/sdl.h>

#else

#ifndef ORA_PROC

#include <sys/socket.h>

#endif

#endif

/* client logout type */

#define CLIENT_CLOSE_NORMAL 0

#define CLIENT_CLOSE_ABNORMAL 1

#define CLIENT_PRUNED 2

Appendix A. 헤더파일 31

/* RQ Sub-queue type */

#define TMAX_ANY_QUEUE 0

#define TMAX_FAIL_QUEUE 1

#define TMAX_REQ_QUEUE 2

#define TMAX_RPLY_QUEUE 3

#define TMAX_MAX_QUEUE 4

extern char _rq_sub_queue_name[TMAX_MAX_QUEUE][XATMI_SERVICE_NAME_LENGTH];

/* RQ related macros */

#define RQ_NAME_LENGTH 16

/* unsolicited msg type */

#define UNSOL_TPPOST 1

#define UNSOL_TPBROADCAST 2

#define UNSOL_TPNOTIFY 3

#define UNSOL_TPSENDTOCLI 4

#define UNSOL_ANY 5

/* RM type */

#define ORACLE_TYPE 1

#define SYBASE_TYPE 2

#define INFORMIX_TYPE 3

#define DB2_TYPE 4

#define NONXA_MODE 0

#define XA_MODE 1

/* Check SVCINFO cmds */

#define ISSVC_FORWARDED 0x00000001

#define ISSVC_NOREPLY 0x00000002

/* TPEVCTL ctl_flags */

#define TPEV_SVC 0x00000001

#define TPEV_PROC 0x00000002

/* tpgethostaddr flags */

#define GET_SVR_CON 0x00000000

#define GET_CUR_IP 0x00000001

/* tmax_sq_get/tmax_sq_put flags */

#define TPSQ_PEEK 0x00001000

#define TPSQ_UPDATE 0x00002000

#define TPSQ_SYSKEY 0x00004000

#define TPSQ_KEYGEN 0x00008000

#define SQ_KEYLIST_T void*

32 Tmax Programming Guide (SQ)

#define SQ_KEYINFO_T sq_keyinfo_t

#define SQ_SYSKEY_SIZE 16

struct sq_keyinfo_s {

long keylen;

long datalen;

time_t starttime;

char *key;

};

typedef struct sq_keyinfo_s sq_keyinfo_t;

struct tpevctl {

long ctl_flags;

long post_flags;

char svc[XATMI_SERVICE_NAME_LENGTH];

char qname[RQ_NAME_LENGTH];

};

typedef struct tpevctl TPEVCTL;

typedef void __EXPORT Unsolfunc(char *, long, long);

#define TPUNSOLERR ((Unsolfunc *) -1)

struct tptranid {

int info[3];

int flags;

};

typedef struct tptranid TPTRANID;

/* Multicast call related structures */

struct svglist {

int ns_entry; /* number of entries of s_list */

int nf_entry; /* number of entries of f_list */

int *s_list; /* list of server group numbers */

int *f_list; /* list of server group numbers */

};

/* My svrinfo */

#ifndef TMAX_NAME_SIZE

#define TMAX_NAME_SIZE 16

#endif

#ifndef MAX_DBSESSIONID_SIZE

#define MAX_DBSESSIONID_SIZE 128

#endif

Appendix A. 헤더파일 33

typedef struct {

int nodeno; /* node index */

int svgi; /* server group index; unique in the node */

int svri; /* server index; unique in the node */

int spri; /* server process index; unique in the node */

int spr_seqno; /* server process seqno ; unique in the server */

int min, max; /* min/max server process number */

int clhi; /* for RDP only, corresponding CLH id */

char nodename[TMAX_NAME_SIZE];

char svgname[TMAX_NAME_SIZE];

char svrname[TMAX_NAME_SIZE];

char reserved_char[TMAX_NAME_SIZE];

/* for more detail use tmadmin API */

} TMAXSVRINFO;

#define MSGIDLEN 32

#define CORRIDLEN 32

typedef struct { /* control parameters to queue primitives */

int flags; /* indicates which of the values are set */

int deq_time; /* absolute/relative time for dequeuing */

int priority; /* enqueue priority */

int diagnostic; /* indicates reason for failure */

char msgid[MSGIDLEN]; /* id of message before which to queue */

char corrid[CORRIDLEN];/* correlation id used to identify message */

char replyqueue[TMAX_NAME_SIZE]; /* queue name for reply message */

char failurequeue[TMAX_NAME_SIZE];/* queue name for failure message */

CLIENTID cltid; /* client identifier for originating client */

int urcode; /* application user-return code */

int appkey; /* application authentication client key */

int delivery_qos;

int reply_qos;

int exp_time;

} TMQCTL;

#ifdef _WIN32

typedef int (__EXPORT *WinTmaxCallback)(WPARAM, LPARAM);

#endif

/* Macro functions */

#define tpalivechk() tmax_chk_conn(0)

#if defined (__cplusplus)

extern "C" {

#endif

/* ----- unsolicited messaging API ----- */

34 Tmax Programming Guide (SQ)

long __EXPORT tpsubscribe(char *eventexpr, char *filter, TPEVCTL *ctl, long flags);

long __EXPORT tpsubscribe2(char *eventexpr, char *svcname, long flags);

int __EXPORT tpunsubscribe(long sd, long flags);

int __EXPORT tppost(char *eventname, char *data, long len, long flags);

int __EXPORT tpbroadcast(char *lnid, char *usrname, char *cltname, char *data,

long len, long flags);

Unsolfunc *__EXPORT tpsetunsol(Unsolfunc *func);

int __EXPORT tpsetunsol_flag(int flag);

int __EXPORT tpgetunsol(int type, char **data, long *len, long flags);

int __EXPORT tpclearunsol(void);

int __EXPORT tpchkunsol(void);

/* ----- RQS API -------- */

int __EXPORT tpenq(char *qname, char *svc, char *data, long len, long flags);

int __EXPORT tpdeq(char *qname, char *svc, char **data, long *len, long flags);

int __EXPORT tpenq_ctl(char *qname, char *svc, TMQCTL *ctl, char *data, long len,

long flags);

int __EXPORT tpdeq_ctl(char *qname, char *svc, TMQCTL *ctl, char **data, long *len,

long flags);

int __EXPORT tpqstat(char *qname, long type);

int __EXPORT tpqsvcstat(char *qname, char *svc, long type);

int __EXPORT tpextsvcname(char *data, char *svc);

int __EXPORT tpextsvcinfo(char *data, char *svc, int *type, int *errcode);

int __EXPORT tpreissue(char *qname, char *filter, long flags);

char *__EXPORT tpsubqname(int type);

/* ----- server API -------- */

int __EXPORT tpgetminsvr(void);

int __EXPORT tpgetmaxsvr(void);

int __EXPORT tpgetmaxuser(void);

int __EXPORT tpgetsvrseqno(void);

int __EXPORT tpgetmysvrid(void);

int __EXPORT tpgetmysvrno(void);

int __EXPORT tpgetmaxuser(void);

int __EXPORT tpsendtocli(int clid, char *data, long len, long flags);

int __EXPORT tpgetclid(void);

int __EXPORT tpgetpeer_ipaddr(struct sockaddr *name, int *namelen);

int __EXPORT tpchkclid(int clid);

int __EXPORT tmax_clh_maxuser(void);

int __EXPORT tmax_my_svrinfo(TMAXSVRINFO*);

int __EXPORT tmax_cind2clid(int cind);

char *__EXPORT tpgetmynode(int *nodeno);

char *__EXPORT tpgetmysvg(void);

int __EXPORT tpgetmysvgno(void);

int __EXPORT tmax_is_restarted(void);

int __EXPORT tpsuspendtx(TPTRANID *tranid, long flags);

Appendix A. 헤더파일 35

int __EXPORT tpresumetx(TPTRANID *tranid, long flags);

/* ----- etc API ----------- */

int __EXPORT tp_sleep(int sec);

int __EXPORT tp_usleep(int usec);

int __EXPORT tpset_timeout(int sec);

int __EXPORT tpget_timeout(void);

int __EXPORT tmaxreadenv(char *file, char *label);

char *__EXPORT tpgetenv(char* str);

int __EXPORT tpputenv(char* str);

int __EXPORT tpgetsockname(struct sockaddr *name, int *namelen);

int __EXPORT tpgetpeername(struct sockaddr *name, int *namelen);

int __EXPORT tpgetactivesvr(char *nodename, char **outbufp);

int __EXPORT tperrordetail(int i);

int __EXPORT tpreset(void);

int __EXPORT tptobackup(void);

struct svglist *__EXPORT

tpmcall(char *qname, char *svc, char *data, long len, long flags);

struct svglist *__EXPORT tpgetsvglist(char *svc, long flags);

int __EXPORT tpsvgcall(int svgno, char *qname,

char *svc, char *data, long len, long flags);

int __EXPORT tpflush(void);

char *__EXPORT tmaxlastsvc(char *idata, char *odata, long flags);

int __EXPORT tpgetorgnode(int clid);

int __EXPORT tpgetorgclh(int clid);

char *__EXPORT tpgetnodename(int nodeno);

int __EXPORT tpgetnodeno(char *nodename);

int __EXPORT tpgetasize(char *data);

int __EXPORT tpgettype(char *data);

char * __EXPORT tpgetsubtype(char *data);

int __EXPORT tpgetcliaddr(int clid, int *ip, int *port, long flags);

int __EXPORT tmax_chk_conn(int timeout);

int __EXPORT tpgethostaddr(int *ip, int *port, long flags);

char * __EXPORT tpgetdbsessionid(int flags);

int __EXPORT tpcallsvg(int svgno, char *svc, char *idata, long ilen,

char **odata, long *olen, long flags);

int __EXPORT tpacallsvg(int svgno, char *svc, char *data, long len, long flags);

#if defined(_WIN32)

int __EXPORT WinTmaxAcall(TPSTART_T *sinfo, HANDLE wHandle, unsigned int msgType,

char *svc, char *sndbuf, int len, int flags);

int __EXPORT WinTmaxAcall2(TPSTART_T *sinfo, WinTmaxCallback fn,

char *svc, char *sndbuf, int len, int flags);

#endif

#if !defined(_TMAX_KERNEL) && !defined(_TMAX_RCA_H)

/* ------- User supplied routines ---------- */

36 Tmax Programming Guide (SQ)

int __EXPORT tpsvrinit(int argc, char *argv[]);

int __EXPORT tpsvrdone(void);

void __EXPORT tpsvctimeout(TPSVCINFO *msg);

int __EXPORT _tmax_event_handler(char *progname, int pid, int tid, char *msg,

int flags);

int __EXPORT tpsetdbsessionid(char dbsessionid[MAX_DBSESSIONID_SIZE], int flags);

int __EXPORT tpprechk(void);

#endif

/*

Internal functions: ONLY BE CALLED FROM AUTOMATICALLY

GENERATED STUB FILES. DO NOT DIRECTLY CALL THESE FUNCTIONS.

*/

int __EXPORT get_clhfd(void);

int __EXPORT tmax_chk_svcinfo(int cmd);

int __EXPORT _tmax_main(int argc, char *argv[]);

int __EXPORT _tmax_cob_main(int argc, char *argv[]);

#if defined(_WIN32)

int __EXPORT _tmax_regfn(void *initFn, void *doneFn, void *timeoutFn,

void *userMainFn);

int __EXPORT _tmax_regtab(int svcTabSz, _svc_t *svcTab, int funcTabSz,

void *funcTab);

int __EXPORT _tmax_regsdl(int _sdl_table_size2, struct _sdl_struct_s *_sdl_table2,

int _sdl_field_table_size2, struct _sdl_field_s *_sdl_field_table2);

int __EXPORT _tmax_regevthnd(void *evthndFn);

#endif

int __EXPORT _double_encode(char *in, char *out);

int __EXPORT _double_decode(char *in, char *out);

/* --- power builder interface API --- */

int __EXPORT _make_struct_from_pbindata(char *subtype, char *tpidata, int ilen,

char *indata);

int __EXPORT _make_field_from_pbindata(char **tpidata, char *indata);

int __EXPORT _make_pbodata_from_struct(char *subtype, char *odata, int olen,

char *tpodata);

int __EXPORT _make_pbodata_from_field(char *form, char *odata, char *tpodata);

int __EXPORT _make_pbfodata_from_field(char *fform, char *fodata, char *tpodata);

int __EXPORT _get_value_from_pbsdata(char *cur, char *vald);

int __EXPORT _get_name_value_from_pbfdata(char *cur, int *n2);

int __EXPORT _get_name_from_form(char *cur);

int __EXPORT _insert_value_to_pbodata(int type, char *out, char *in,

int asize, int asize2);

int __EXPORT tmax_get_db_usrname(char *svgname, char *usrname, int type);

int __EXPORT tmax_get_db_passwd(char *svgname, char *passwd, int type);

int __EXPORT tmax_get_db_tnsname(char *svgname, char *tnsname, int type);

int __EXPORT tmax_is_xa();

Appendix A. 헤더파일 37

/* 4.0 Sp2 Fix1 added */

int __EXPORT tmax_get_svccnt();

int __EXPORT tmax_get_svclist(char *buf, int bufsize);

/* ----- SessionQ API ----------- */

int __EXPORT tmax_sq_put(char *key, long keylenl, char *data, long lenl,

long flagsl);

int __EXPORT tmax_sq_get(char *key, long keylenl, char **data, long *lenl,

long flagsl);

int __EXPORT tmax_sq_count(void);

int __EXPORT tmax_sq_purge(char *key, long keylenl);

int __EXPORT tmax_sq_keygen(char *key, long keylenl);

SQ_KEYLIST_T __EXPORT tmax_sq_getkeylist(char *key, long keylenl);

int __EXPORT tmax_gq_put(char *key, long keylenl, char *data, long lenl,

long flagsl);

int __EXPORT tmax_gq_get(char *key, long keylenl, char **data, long *lenl,

long flagsl);

int __EXPORT tmax_gq_count();

int __EXPORT tmax_gq_purge(char *key, long keylenl);

int __EXPORT tmax_gq_keygen(char *key, long keylenl);

SQ_KEYLIST_T __EXPORT tmax_gq_getkeylist(char *key, long keylenl);

int __EXPORT tmax_get_sessionid(void);

int __EXPORT tmax_keylist_count(SQ_KEYLIST_T keylist);

int __EXPORT tmax_keylist_getakey(SQ_KEYLIST_T keylist, int nth,

SQ_KEYINFO_T *keyinfo);

int __EXPORT tmax_keylist_free(SQ_KEYLIST_T keylist);

#if defined (__cplusplus)

}

#endif

#endif /* end of _TMAXAPI_H */

38 Tmax Programming Guide (SQ)