예제

본 장에서는 Tmax XA 서비스를 호출하는 간단한 예제와 Makefile을 설명한다.

1. Tmax XA 서비스 호출 예제

/* Tmax의 xa switch openinfo */
#define OPENINFO
"host=192.168.1.43:7000+dbglvl=1+timeout=10"
/* Tmax의 xa switch closeinfo */
#define CLOSEINFO       ""
extern struct xa_switch_t tmaxxaosw;
struct xa_switch_t _xasw;
int _xa_load(int xaoption)
{
        _xasw.name[0] = 0;
        _xasw = tmaxxaosw;
        if (_xasw.name[0] == 0)
            return -1;
        return 1;
}
int main(int argc, char **argv)
{
    ….
    XID xid;

   // XA 정보 로드
    ret = _xa_load(0);
    if (ret < 0) {
        error processing…
    }

    // xa open
    ret = xa_open(OPENINFO, rmid, TMNOFLAGS);
    if (ret < 0) {
        error processing…
    }
    ….

    // xa start
    ret = xa_start(&xid, rmid, TMNOFLAGS);
    if (ret < 0) {
        error processing…
}

    // Tmax xa 서비스 호출
    ret = call_tmax(“SVCA”, sndbuf, rcvbuf);
    if (ret < 0) {
        error processing…
    }

    // xa end
    ret = xa_end(&xid, rmid, TMSUSPEND);
    if (ret < 0) {
        error processing…
    }

    // xa start
    ret = xa_start(&xid2, rmid, TMRESUME | TMJOIN);
    if (ret < 0) {
        error processing…
    }
    /* tpcall을 포함하는 function */

    // Tmax xa 서비스 호출
    ret = call_tmax(svcname, sndbuf, rcvbuf);
    if (ret < 0) {
         error processing…
    }

    // xa end
    ret = xa_end(&xid2, rmid, TMSUCCESS);
    if (ret < 0) {
        error processing…
    }

    // xa prepare
    ret = xa_prepare(&xid, rmid, TMNOFLAGS);
    if (ret < 0) {
        error processing…
    }
    // xa prepare
    ret = xa_prepare(&xid2, rmid, TMNOFLAGS);
    if (ret < 0) {
        error processing…
    }
        else if (ret == XA_RDONLY) {
        // xa commit
        ret = xa_commit(&xid, rmid, TMNOFLAGS);
        if (ret < 0) {
            error processing…
        }
    }
    else {
        ret = xa_commit(&xid, rmid, TMNOFLAGS);
        if (ret < 0) {
            error processing…
        }
        ret = xa_commit(&xid2, rmid, TMNOFlAGS);
        if (ret < 0) {
            error processing…
        }
    }

    // xa close
    ret = xa_close(CLOSEINFO, rmid, TMNOFLAGS);
    if (ret < 0) {
         error processing…
    }
…
}

// Tmax 서비스 호출 루틴
int call_tmax(char *svcname, char * sndbuf, char * rcvbuf)
{
    …
    ret = tpcall(svcname, (char *)sndbuf, strlen(sndbuf), (char **)&rcvbuf,
                (long *)&rcvlen, TPNOFLAGS);
    if(ret < 0) {
         error processing…
    }
    …
}

2. Makefile

# makefile
TARGET  = $(COMP_TARGET)
APOBJS  = $(TARGET).o

TMAXLIBD= $(TMAXDIR)/lib64

TMAXLIBS= -ltxa
# hp-pa 경우
CFLAGS = -g -Ae +DA2.0W +DD64 +DS2.0 -O -I$(TMAXDIR)

#
.SUFFIXES : .c

.c.o:
        $(CC) $(CFLAGS) -c $<

#
# client compile
#

$(TARGET): $(APOBJS)
#       proc iname=$(TARGET) include=$(TMAXDIR)
        $(CC) $(CFLAGS) -L$(TMAXLIBD) -o $(TARGET) $(APOBJS) $(TMAXLIBS)

$(APOBJS): $(TARGET).c
#       proc iname=$(TARGET) include=$(TMAXDIR)
        $(CC) $(CFLAGS) -c $(TARGET).c
#
clean:
        -rm -f *.o core $(TARGET)