예제
본 장에서는 실제 Tmax SQ 시스템 예제를 통해서 사용법에 대해서 설명한다.
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; } 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); // 세션 큐에 데이터를 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; }
2. 서버 프로그램
다음은 서버 프로그램에 대한 예제이다.
#include <stdio.h> #include <usrinc/atmi.h> #include <usrinc/tmaxapi.h> #define MAXKEYCNT 10 GET_SQ(TPSVCINFO *msg) { 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); return -1; } printf("GET : [%d] Key = [%s] , Data = [%s]\n", i, get_key[i], sqbuf); } printf("\n"); // sqh 해제 tmax_keylist_free(sqh); } return i; }