개발및운영 Tibero ProC 전환및 Tmax 설정 2014. 05. 16.
목차 1. 환경변수... 3 1.1. OS별환경변수설정... 3 2. ESQL 시작... 4 2.1. ESQL 프로그램생성젃차... 4 3. 오라클 Pro*C 젂환... 5 3.1 Precompiler 변경... 5 3.2 확장자 *.pc를 *.tbc로변경... 5 3.3 티베로젂환시주의사항... 6 4. Tmax에서 Tibero설정... 6 4.1 RM 설정... 6 4.2 TMS 생성... 7 4.3 TMAX OPENINFO(TIBERO)... 7 4.4 TMAX 환경설정... 8 4.5 연동예제 (HP-Itanium)... 8 2
Tibero ProC 전환및 Tmax 설정 본문서에서는타 DB 에서 Tibero 로 proc 젂환에대한내용과및 Tmax 설정하는방법을소개한다. 1. 환경변수 1.1. OS 별환경변수설정 아래환경변수에 $TB_HOME/client/lib 를포함시킨다. OS(CPU) 64BIT 32BIT HP-UX(IA64) LD_LIBRARY_PATH LD_LIBRARY_PATH HP-UX(PA-RISC) LD_LIBRARY_PATH 없을시 SHLIB_PATH SHLIB_PATH SOLARIS LD_LIBRARY_PATH_64 없을시 LD_LIBRARY_PATH LD_LIBRARY_PATH AIX LIBPATH 없을시 LD_LIBRARY_PATH LIBPATH 없을시 LD_LIBRARY_PATH LINUX LD_LIBRARY_PATH LD_LIBRARY_PATH WINDOWS PATH PATH 3
2. ESQL 시작 2.1. ESQL 프로그램생성절차 ESQL 프로그램생성 EDITOR ESQL SOURCE tbpc Precompiler C Source Program Compiler Linker ESQL 프로그램개발젃차는제공되는매뉴얼 Tibero tbesql/c 안내서참조 4
3. 오라클 Pro*C 전환 3.1 Precompiler 변경 오라클 proc 를티베로 tbpc 로변경 proc include=$tb_home/client/include \ include=$tdir/include \ include=$tdir/include/header \ include=$tdir/include/comm \ include=$tdir/include/incl \ lines=yes \ mode=oracle \ unsafe_null=yes \ hold_cursor=yes \ ORACA=YES \ release_cursor=no \ iname=$pgm.pc select_error=no \ userid=$tb_userid/$tb_passwd SQLCHECK=SYNTAX 2>&1 >$PGM.err tbpc include=$tb_home/client/include \ include=$hitdir/include \ include=$hitdir/include/header \ include=$hitdir/include/comm \ include=$hitdir/include/incl \ lines=yes \ mode=oracle \ unsafe_null=yes \ hold_cursor=yes \ ORACA=YES \ release_cursor=no \ iname=$pgm.tbc select_error=no \ userid=$tb_userid/$tb_passwd SQLCHECK=SYNTAX 2>&1 >$PGM.err 3.2 확장자 *.pc 를 *.tbc 로변경 확장자를변경할.pc 파일이많을경우다음스크립트를이용 (unix) 하여변경한다.! /usr/bin/ksh for file in *.pc do newext=`echo $file sed -e 's/pc$/tbc/'` rm $file mv $file $newext done 5
3.3 티베로전환시주의사항 EXEC SQL INCLUDE sqlca.h( 공백 ); include되어지는헤더파일이름과세미콜론 (;) 사이에공백이있으면파싱오류가발생할수있으므로 EXEC SQL INCLUDE sqlca.h; 로수정필요변경시킬파일이많을경우아래스크립트를이용하여변경 OS상에설치된 sed 에따라실행이되지않는경우가있으니 2개의스크립트중해당시스템에서실행가능한스크립트를선택해서적용 script1) find. -name '*.tbc' -exec sed -i 's/sqlca.h /sqlca.h/g' \; script2)! /usr/bin/ksh for file in *.tbc do newname=`echo $file sed -e 's/tbc$/new/'` sed -e 's/sqlca.h /sqlca.h/' $file >$newname rm $file mv $newname $file done "testesql.tbc", line 95: error 2020: identifier "oraca" is undefined sqlctx.oraca = (void *)&oraca; 오라클에서 tibero로젂환시 oraca.h헤더를소스에추가로포함시켜야정상컴파일가능 oraca.h헤더파일을추가할소스가많을경우 sqlca.h파일에 oraca.h파일을병합하면헤더를일일이추가해야하는작업을줄일수있음. 4. Tmax 에서 Tibero 설정 4.1 RM 설정 $TMAXDIR/config/RM 파일에다음을추가 NON XA Tibero_NONXA:nonxa:-L$TB_HOME/client/lib ltbertl ltbcli lclialloc lm -lpthread XA Tibero_XA:tbs:-L$TB_HOME/client/lib -ltbertl -ltbxa -lm -lpthreads 6
4.2 TMS 생성 dumy.c 파일준비 int i; tms_tbr.mk 파일준비 TMS Makefile for Tibero HP Itanium 64bit TBLIBDIR = $(TB_HOME)/client/lib TBLIB =-ltbxa -ltbertl -ltbcli -lm -lpthread TARGET = tms_tbr APOBJ = dumy.o APPDIR = $(TMAXDIR)/appbin TMAXLIBD= $(TMAXDIR)/lib64 TMAXLIBS= -ltms -ltbs CFLAGS = -O -Ae -w +DSblended +DD64 -D_HP all : $(TARGET) $(TARGET): $(APOBJ) $(CC) $(CFLAGS) -o $(TARGET) $(TMAXINC) -L$(TMAXLIBD) $(TMAXLIBS) $(APOBJ) - L$(TBLIBDIR) $(TBLIB) mv $(TARGET) $(APPDIR)/. $(APOBJ): $(CC) $(CFLAGS) -c dumy.c clean: -rm -f *.o core $(APPDIR)/$(TARGET) TMS 컴파일 make f tms_tbr.mk all 4.3 TMAX OPENINFO(TIBERO) tibero용 OPENINFO 가능파라미터 TIBERO_XA 구문에가장먼저기술 user tibero 계정 pwd tibero 암호 db tibero SID conn_id 설정하지않으면 db 파라미터와동일값이자동설정됨 sestm session timeout default 60 seswt session waittime default 60 loose_coupling default false *LogDir 은 tibero4, tibero5 모두현재지원하지않고있음 7
4.4 TMAX 환경설정 *SVRGROUP svg1 NODENAME = "tmax", DBNAME = TIBERO, OPENINFO = "TIBERO_XA:user=tibero,pwd=tmax,sestm=60,db=tibero4", TMSNAME = tms_tbr *SERVER tbrtest *SERVICE TBRINS TBRSEL TBRUPT TBRDEL SVGNAME=svg1 SVRNAME = tbrtest SVRNAME = tbrtest SVRNAME = tbrtest SVRNAME = tbrtest 4.5 연동예제 (HP-Itanium) compile 파일준비!/bin/sh program compile main Param=$1 case "$Param" in c) COMP_TARGET=$2; export COMP_TARGET make -f Makefile.c;; ucs) COMP_TARGET=$2; export COMP_TARGET make -f Makefile.ucs;; sdl) COMP_TARGET=$2; export COMP_TARGET make -f Makefile.sdl;; tbc) COMP_TARGET=$2; export COMP_TARGET make -f Makefile.tbc all;; pc) COMP_TARGET=$2; export COMP_TARGET make -f Makefile.pc all;; psdl) COMP_TARGET=$2; export COMP_TARGET make -f Makefile.psdl all;; clean) make -f Makefile.pc clean;; *) echo "Usage: $0 argument";; esac 서버용 Makefile.tbc 파일준비 Server tbpc makefile TBINC = $(TB_HOME)/client/include TBLIBDIR = $(TB_HOME)/client/lib TBLIB = -ltbxa -ltbertl -ltbcli -lm -lpthread TARGET = $(COMP_TARGET) APOBJS = $(TARGET).o NSDLOBJ = $(TMAXDIR)/lib64/sdl.o Tibero LIBS = -lsvr -ltbs OBJS = $(APOBJS) $(SVCTOBJ) 8
SVCTOBJ = $(TARGET)_svctab.o CFLAGS = -O -Ae -w +DSblended +DD64 -D_HP -I$(TMAXDIR) APPDIR = $(TMAXDIR)/appbin SVCTDIR = $(TMAXDIR)/svct TMAXLIBDIR = $(TMAXDIR)/lib64.SUFFIXES :.c.c.o: $(CC) $(CFLAGS) -c $< server compile all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(CFLAGS) -L$(TMAXLIBDIR) -o $(TARGET) -L$(TBLIBDIR) $(TBLIB) $(OBJS) $(LIBS) $(NSDLOBJ) mv $(TARGET) $(APPDIR)/. rm -f $(OBJS) $(APOBJS): $(TARGET).tbc tbpc iname=$(target) include=$(tmaxdir) $(CC) $(CFLAGS) -L$(TBLIBDIR) -I$(TBINC) $(TBLIB) -c $(TARGET).c $(SVCTOBJ): cp -f $(SVCTDIR)/$(TARGET)_svctab.c. touch./$(target)_svctab.c $(CC) $(CFLAGS) -c./$(target)_svctab.c clean: -rm -f *.o core $(APPDIR)/$(TARGET) $(TARGET).lis tbrtest.h 헤더파일준비 ifndef _SVC_H_ define _SVC_H_ include <stdio.h> include <stdlib.h> include <string.h> include <usrinc/atmi.h> include <usrinc/tmaxapi.h> include <usrinc/tx.h> include <usrinc/fbuf.h> define SQLOK 0 define SQLDUP 1 define SQLNOTFOUND 1403 define MAXLEN 50 define NAMELEN 11 define COMMIT 1 define ROLLBACK 2 9
struct temp_str int empno; char ename[maxlen]; char job[maxlen]; char date[maxlen]; float sal; int commit_yn; /* 1:tx_commit, other except 1 : tx_rollback */ char svcname[xatmi_service_name_length]; ; typedef struct temp_str *str; void print_input(str sndbuf); void print_output(char *rcvbuf); void print_input(str sndbuf) printf("sndbuf->empno = [%d]\n", sndbuf->empno); printf("sndbuf->sal = [%d]\n", sndbuf->sal); printf("sndbuf->ename = [%s]\n", sndbuf->ename); printf("sndbuf->job = [%s]\n", sndbuf->job); printf("sndbuf->date = [%s]\n", sndbuf->date); printf("sndbuf->svcname = [%s]\n", sndbuf->svcname); void print_output(char *rcvbuf) printf("rcvbuf=[%s]\n", rcvbuf); endif 서버 tbrtest.tbc 파일준비 include "tbrtest.h" EXEC SQL INCLUDE SQLCA.H; EXEC SQL BEGIN DECLARE SECTION; int h_empno; char h_ename[maxlen]; char h_job[maxlen]; char h_date[maxlen]; int h_count; float h_sal; EXEC SQL END DECLARE SECTION; TBRINS( TPSVCINFO *msg ) str sndbuf; char *rcvbuf; char tmp[1024]; sndbuf = (str)msg->data; if _DBG print_input(sndbuf); endif rcvbuf=(char *)tpalloc("string", NULL, 4096); if(rcvbuf==null) printf("tpalloc failed (rcvbuf) : %s\n", tpstrerror(tperrno)); tpreturn(tpfail, -1, NULL, 0, 0); 10
h_empno = h_sal = 0; memset( h_ename, 0x00, sizeof( h_ename ) ); memset( h_job, 0x00, sizeof( h_job ) ); memset( h_date, 0x00, sizeof( h_date ) ); h_empno = sndbuf->empno; h_sal = sndbuf->sal; strcpy( h_ename, sndbuf->ename ); strcpy( h_job, sndbuf->job ); strcpy( h_date, sndbuf->date ); EXEC SQL INSERT INTO emp( empno, ename, job, hiredate,sal) VALUES (:h_empno, :h_ename, :h_job, to_date(:h_date,'yymmdd'), :h_sal ); if ( sqlca.sqlcode!= SQLOK ) sprintf(tmp, "[%s] emp Insert Fail", msg->name); strcpy(rcvbuf, tmp); printf("[%s] %d \n", rcvbuf, sqlca.sqlcode); tpreturn( TPFAIL, sqlca.sqlcode, rcvbuf, strlen(rcvbuf), 0 ); sprintf(tmp, "[%s] emp Insert Success", msg->name); strcpy(rcvbuf, tmp); if _DBG print_output(rcvbuf); endif tpreturn( TPSUCCESS, 0, rcvbuf, strlen(rcvbuf), 0 ); TBRUPT( TPSVCINFO *msg ) str sndbuf; char *rcvbuf; char tmp[1024]; sndbuf = (str)msg->data; if _DBG print_input(sndbuf); endif rcvbuf=(char *)tpalloc("string", NULL, 4096); if(rcvbuf==null) printf("tpalloc failed (rcvbuf) : %s\n", tpstrerror(tperrno)); tpreturn(tpfail, -1, NULL, 0, 0); h_empno = h_sal = 0; memset( h_ename, 0x00, sizeof( h_ename ) ); memset( h_job, 0x00, sizeof( h_job ) ); memset( h_date, 0x00, sizeof( h_date ) ); memset( tmp, 0x00, sizeof( tmp ) ); h_empno = sndbuf->empno; h_sal = sndbuf->sal; strcpy( h_ename, sndbuf->ename ); strcpy( h_job, sndbuf->job ); strcpy( h_date, sndbuf->date ); 11
EXEC SQL UPDATE emp SET empno = :h_empno+1, ename = :h_ename, job = 'UPDATE' WHERE empno = :h_empno; if ( sqlca.sqlcode!= SQLOK ) sprintf(tmp, "[%s] emp Update Fail", msg->name); strcpy(rcvbuf, tmp); printf("[%s] %d \n", rcvbuf, sqlca.sqlcode); tpreturn( TPFAIL, sqlca.sqlcode, rcvbuf, strlen(rcvbuf), 0 ); sprintf(tmp, "[%s] emp Update Success", msg->name); strcpy(rcvbuf, tmp); if _DBG print_output(rcvbuf); endif tpreturn( TPSUCCESS, 0, rcvbuf, strlen(rcvbuf), 0 ); TBRDEL( TPSVCINFO *msg ) str sndbuf; char *rcvbuf; char tmp[1024]; sndbuf = (str)msg->data; if _DBG print_input(sndbuf); endif rcvbuf=(char *)tpalloc("string", NULL, 4096); if(rcvbuf==null) printf("tpalloc failed (rcvbuf) : %s\n", tpstrerror(tperrno)); tpreturn(tpfail, -1, NULL, 0, 0); h_empno = h_sal = 0; memset( h_ename, 0x00, sizeof( h_ename ) ); memset( h_job, 0x00, sizeof( h_job ) ); memset( h_date, 0x00, sizeof( h_date ) ); memset( tmp, 0x00, sizeof( tmp ) ); h_empno = sndbuf->empno; h_sal = sndbuf->sal; strcpy( h_ename, sndbuf->ename ); strcpy( h_job, sndbuf->job ); strcpy( h_date, sndbuf->date ); EXEC SQL DELETE emp WHERE empno = :h_empno; if ( sqlca.sqlcode!= SQLOK ) sprintf(tmp, "[%s] emp Delete Fail", msg->name); strcpy(rcvbuf, tmp); printf("[%s] %d \n", rcvbuf, sqlca.sqlcode); 12
tpreturn( TPFAIL, sqlca.sqlcode, rcvbuf, strlen(rcvbuf), 0 ); sprintf(tmp, "[%s] emp Delete Success", msg->name); strcpy(rcvbuf, tmp); if _DBG print_output(rcvbuf); endif tpreturn( TPSUCCESS, 0, rcvbuf, strlen(rcvbuf), 0 ); TBRSEL( TPSVCINFO *msg ) str sndbuf; char *rcvbuf; char tmp[1024]; sndbuf = (str)msg->data; if _DBG print_input(sndbuf); endif rcvbuf=(char *)tpalloc("string", NULL, 4096); if(rcvbuf==null) printf("tpalloc failed (rcvbuf) : %s\n", tpstrerror(tperrno)); tpreturn(tpfail, -1, NULL, 0, 0); h_empno = h_sal = h_count = 0; memset( h_ename, 0x00, sizeof( h_ename ) ); memset( h_job, 0x00, sizeof( h_job ) ); memset( h_date, 0x00, sizeof( h_date ) ); memset( tmp, 0x00, sizeof( tmp ) ); h_empno = sndbuf->empno; h_sal = sndbuf->sal; strcpy( h_ename, sndbuf->ename ); strcpy( h_job, sndbuf->job ); strcpy( h_date, sndbuf->date ); EXEC SQL SELECT COUNT(*) INTO :h_count FROM emp WHERE empno = :h_empno; if ( ( sqlca.sqlcode!= SQLOK ) && ( sqlca.sqlcode!= SQLNOTFOUND ) ) sprintf(tmp, "[%s] emp Select Fail", msg->name); strcpy(rcvbuf, tmp); printf("[%s] %d \n", rcvbuf, sqlca.sqlcode); tpreturn( TPFAIL, sqlca.sqlcode, rcvbuf, strlen(rcvbuf), 0 ); sprintf(tmp, "[%s] emp Select Success [%d]", msg->name, h_count); strcpy(rcvbuf, tmp); if _DBG print_output(rcvbuf); endif 13
tpreturn( TPSUCCESS, 0, rcvbuf, strlen(rcvbuf), 0 ); 서버컴파일방법./compile tbc tbrtest 클라이언트 Makefile.c 파일준비 TARGET APOBJS = $(COMP_TARGET) = $(TARGET).o TMAXLIBD= $(TMAXDIR)/lib64 TMAXLIBS= -lcli CFLAGS = -O -Ae -w +DSblended +DD64 -D_HP -I$(TMAXDIR).SUFFIXES :.c.c.o: $(CC) $(CFLAGS) -c $< client compile $(TARGET): $(APOBJS) $(CC) $(CFLAGS) -L$(TMAXLIBD) -o $(TARGET) $(APOBJS) $(TMAXLIBS) clean: -rm -f *.o core $(TARGET) 클라이언트헤더 tbr_main.h 파일준비 ifndef _CLI_H_ define _CLI_H_ include <stdio.h> include <stdlib.h> include <string.h> include <usrinc/atmi.h> include <usrinc/tx.h> include <usrinc/tmaxapi.h> define SQLOK 0 define SQLDUP 1 define SQLNOTFOUND 1403 define MAXLEN 50 define NAMELEN 11 define COMMIT 1 define ROLLBACK 2 14
define V_EMPNO 1000 define V_ENAME "tmaxqmc" define V_JOB "tmaxqmc" define V_SAL 10 define V_HIREDATE "051119" /* flags */ define INSERT 1 define UPDATE 2 define DELETE 3 define SELECT 4 struct temp_str int empno; char ename[maxlen]; char job[maxlen]; char date[maxlen]; float sal; int commit_yn; /* 1:tx_commit, other except 1 : tx_rollback */ char svcname[xatmi_service_name_length]; ; typedef struct temp_str *str; void print_input(str sndbuf); void print_output(char *rcvbuf); int carray_sel(str sndbuf, char *rcvbuf, char *myname); void print_input(str sndbuf) printf("sndbuf->empno = [%d]\n", sndbuf->empno); printf("sndbuf->sal = [%d]\n", sndbuf->sal); printf("sndbuf->ename = [%s]\n", sndbuf->ename); printf("sndbuf->job = [%s]\n", sndbuf->job); printf("sndbuf->date = [%s]\n", sndbuf->date); printf("sndbuf->svcname = [%s]\n", sndbuf->svcname); void print_output(char *rcvbuf) printf("rcvbuf=[%s]\n", rcvbuf); int carray_sel(str sndbuf, char *rcvbuf, char *myname) int ret, cd; long rlen; cd = tpcall(sndbuf->svcname, (char *)sndbuf, sizeof(struct temp_str), (char **)&rcvbuf, (long *)&rlen, 0 ); if(cd < 0) printf("[%s] tpcall %s is failed [%s]\n", myname, sndbuf->svcname, rcvbuf); tx_rollback(); printf("[%s] [%s]\n", myname, rcvbuf); return 0; endif 15
클라이언트 tbr_main.c 파일준비 include "tbr_main.h" int carray_db(str sndbuf, char *rcvbuf, int flag, int iud); char myname[100]; main(int argc, char *argv[]) int in_num; int i, ret, empno, loop_cnt, ins_flag, upt_flag, del_flag; str sndbuf; char *rcvbuf; long rcvlen; int flags; if (argc!= 6) printf("usage: %s empno loop_cnt ins_flag upt_flag del_flag\n", argv[0]); printf("flag : 1 0 \n"); if ((ret = tmaxreadenv("tmax.env","tmax")) == -1) printf("<%-15s> tmaxreadenv fail [%s]", FILE, tpstrerror(tperrno)); if ( tpstart((tpstart_t *)NULL) == -1 ) printf("<%-15s> tpstart fail [%s]", FILE, tpstrerror(tperrno)); sndbuf=(str)tpalloc("carray", NULL, 4096); if(sndbuf==null) printf("<%-15s> tpalloc fail [%s]", FILE, tpstrerror(tperrno)); tpend(); rcvbuf=(char *)tpalloc("string", NULL, 4096); if(rcvbuf==null) printf("<%-15s> tpalloc fail [%s]", FILE, tpstrerror(tperrno)); tpend(); strcpy(myname, argv[0]); empno = atoi(argv[1]); loop_cnt = atoi(argv[2]); ins_flag = atoi(argv[3]); upt_flag = atoi(argv[4]); del_flag = atoi(argv[5]); sndbuf->empno = empno; sndbuf->sal = V_SAL; strcpy(sndbuf->ename, V_ENAME); strcpy(sndbuf->job, V_JOB); strcpy(sndbuf->date, V_HIREDATE); for (i=1; i<=loop_cnt; i++) 16
printf("\n LOOP COUNT = %d \n", i); if (ins_flag == 1) flags = INSERT; printf(">> INSERT : COMMIT TEST \n"); carray_db (sndbuf, rcvbuf, COMMIT, flags); strcpy(sndbuf->svcname, "TBRSEL"); carray_sel(sndbuf, rcvbuf, argv[0]); if (upt_flag == 1) flags = UPDATE; printf(">> UPDATE : COMMIT TEST \n"); carray_db (sndbuf, rcvbuf, COMMIT, flags); sndbuf->empno++; strcpy(sndbuf->svcname, "TBRSEL"); carray_sel(sndbuf, rcvbuf, myname); if (del_flag == 1) flags = DELETE; printf(">> DELETE : ROLLBACK TEST \n"); carray_db (sndbuf, rcvbuf, ROLLBACK, flags); strcpy(sndbuf->svcname, "TBRSEL"); carray_sel(sndbuf, rcvbuf, myname); printf(">> DELETE : COMMIT TEST \n"); carray_db (sndbuf, rcvbuf, COMMIT, flags); strcpy(sndbuf->svcname, "TBRSEL"); carray_sel(sndbuf, rcvbuf, myname); tpfree((char *)sndbuf); tpfree((char *)rcvbuf); tpend(); int carray_db(str sndbuf, char *rcvbuf, int flag, int iud) int ret, cd; long rlen; ret = tx_begin(); if(ret < 0) printf("<%-15s> tx_begin fail [%s]", FILE, tpstrerror(tperrno)); if(iud == INSERT) strcpy(sndbuf->svcname, "TBRINS"); else if(iud == UPDATE) strcpy(sndbuf->svcname, "TBRUPT"); else if(iud == DELETE) strcpy(sndbuf->svcname, "TBRDEL"); 17
else printf("[%s] flags must be INSERT or UPDATE or DELETE\n", myname); cd = tpcall(sndbuf->svcname, (char *)sndbuf, sizeof(struct temp_str), (char **)&rcvbuf, (long *)&rlen, 0 ); if(cd < 0) printf("[%s] [%s]\n", myname, rcvbuf); tx_rollback(); printf("[%s] [%s]\n", myname, rcvbuf); if(flag == COMMIT) ret = tx_commit(); if(ret < 0) printf("<%-15s> tx_commit fail [%s]", FILE, tpstrerror(tperrno)); else ret = tx_rollback(); if(ret < 0) printf("<%-15s> tx_rollback fail [%s]", FILE, tpstrerror(tperrno)); return 0; 클라이언트컴파일방법./compile c tbr_main 18
Copyright 2014 TmaxData Co., Ltd. All Rights Reserved. Trademarks Tibero RDBMS is a registered trademark of TmaxData Co., Ltd. Other products, titles or services may be registered trademarks of their respective companies. Contact Information TmaxData can be contacted at the following addresses to arrange for a consulting team to visit your company and discuss your options. Korea TmaxData Co., Ltd 5, Hwangsaeul-ro 329beon-gil, Bundang-gu, Seongnam-si, Gyeonggi-do. South Korea Tel: +82-31-779-7113 Fax: +82-31-779-7119 Email: info@tmax.co.kr Web (Korean): http://www.tmaxdata.com Technical Support: 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: info@tmaxsoft.com Web (English): http://www.tmaxsoft.com Russia Tmax Russia L.L.C. Grand Setun Plaza, No A204 Gorbunova st.2, Moscow, 121596 Tel: +7(495)970-01-35 Email: info.rus@tmaxsoft.com Web (Russian): http://ru.tmaxsoft.com Singapore Tmax Singapore Pte. Ltd. 430 Lorong 6, Toa Payoh 10-02, OrangeTee Building. Singapore 319402 Tel: +65-6259-7223 Email: info.sg@tmaxsoft.com United Kingdom TmaxSoft UK Ltd. Surrey House, Suite 221, 34 Eden Street, Kingston-Upon- Thames, KT1 1ER United Kingdom Tel: + 44-(0)20-8481-3776 Email: info.uk@tmaxsoft.com 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: info.jp@tmaxsoft.com Web (Japanese): http://www.tmaxsoft.co.jp 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: info.cn@tmaxsoft.com Web (Chinese): http://www.tmaxsoft.com.cn Brazil TmaxSoft Brazil Avenida Copacabana, 177-3 andar 18 do Forte Empresarial, Alphaville - Barueri, Sao Paulo, SP-Brasil CEP 06472-001 Email: contato.brasil@tmaxsoft.com TN-TR3P-D0516101 19