免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3241 | 回复: 2
打印 上一主题 下一主题

informix的XA编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-03 11:03 |只看该作者 |倒序浏览
谁做过informix的XA编程

论坛徽章:
11
数据库技术版块每日发帖之星
日期:2016-06-25 06:20:00数据库技术版块每日发帖之星
日期:2016-06-24 06:20:00数据库技术版块每日发帖之星
日期:2016-05-03 06:20:00数据库技术版块每日发帖之星
日期:2016-04-21 06:20:00数据库技术版块每日发帖之星
日期:2016-01-23 06:20:00数据库技术版块每日发帖之星
日期:2015-12-03 06:20:00综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-19 06:20:00数据库技术版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15数据库技术版块每日发帖之星
日期:2016-07-30 06:20:00
2 [报告]
发表于 2008-04-03 11:07 |只看该作者
/***************************************************************************
*  Licensed Materials - Property of IBM
*
*
*  "Restricted Materials of IBM"
*
*
*
*  IBM Informix Client SDK
*
*
*  (C) Copyright IBM Corporation 1997, 2004 All rights reserved.
*
*
*
*
*
*  Title:          OnePhaseCommitRollback.c
*
*  Description:    Make X/Open XA calls to perform one-phase commit or
*                  one-phase rollback
*
*
***************************************************************************
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#ifndef NO_WIN32
#include <io.h>
#include <windows.h>
#include <conio.h>
#endif

#include "xa.h"
#include "infxcli.h"

#define MAXPROCS 500
#define MAX_ERR_MSG 255
#define ERRMSG_LEN  200

int   error_flag = 0;
struct xa_switch_t *OdbcXaSwitch;

#define xa_open(info, rmid, flags)      \
        ((*OdbcXaSwitch->xa_open_entry)(info,rmid,flags))
#define xa_close(info, rmid, flags)     \
        ((*OdbcXaSwitch->xa_close_entry)(info,rmid,flags))
#define xa_start(gtrid,rmid, flags)     \
        ((*OdbcXaSwitch->xa_start_entry)(gtrid,rmid,flags))
#define xa_end(gtrid,rmid, flags)       \
        ((*OdbcXaSwitch->xa_end_entry)(gtrid,rmid,flags))
#define xa_rollback(gtrid,rmid, flags)     \
        ((*OdbcXaSwitch->xa_rollback_entry)(gtrid,rmid,flags))
#define xa_prepare(gtrid, rmid, flags)   \
        ((*OdbcXaSwitch->xa_prepare_entry)(gtrid,rmid,flags))
#define xa_commit(gtrid, rmid, flags)   \
        ((*OdbcXaSwitch->xa_commit_entry)(gtrid,rmid,flags))
#define xa_recover(gtrid,count,rmid, flags)     \
        ((*OdbcXaSwitch->xa_recover_entry)(gtrid,count,rmid,flags))
#define xa_forget(gtrid,rmid, flags)    \
        ((*OdbcXaSwitch->xa_forget_entry)(gtrid,rmid,flags))
#define xa_complete(handle, retval, rmid, flags)        \
        ((*OdbcXaSwitch->xa_complete_entry)(handle,retval,rmid,flags))

int XAOpen(char *xa_info, int rmid, long flags)
{
    int RCopen;

   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XAOpen: Calling xa_open ...");
    if ((RCopen = xa_open(xa_info, rmid, flags)) != XA_OK)
        {
        printf("\n\tXAOpen: xa_open() returned %d\n", RCopen);
        }
    else
        {
        printf("Success %d.\n", RCopen);
        }

   return(RCopen);
}

int XAClose(char *xa_info, int rmid, long flags)
{
    int RCclose;
   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XAClose: Calling xa_close ...");
    if ((RCclose  = xa_close(xa_info, rmid, flags)) != XA_OK)
    {
        printf("\n\tXAClose: xa_close() returned %d\n", RCclose);
    }
    else
    {
        printf("Success %d.\n", RCclose);
    }
    return(RCclose);
}

int XAStart(XID *var_xid, int rmid, long flags)
{
    int RCstart;

   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XAStart: Calling xa_start ...");
    if ((RCstart = xa_start(var_xid, rmid, flags)) != XA_OK)
    {
        printf("\n\tXAStart: xa_start() returned %d\n", RCstart);
    }
    else
    {
        printf("Success %d.\n", RCstart);
    }
    return(RCstart);
}

int XAEnd(XID *var_xid, int rmid, long flags)
{
    int RCend;
   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XAEnd: Calling xa_end ...");
    if ((RCend = xa_end(var_xid, rmid, flags)) != XA_OK)
    {
        printf("\n\tXAEnd: xa_end() returned %d\n",RCend);
    }
    else
    {
        printf("Success %d.\n", RCend);
    }
    return(RCend);
}

int XAPrepare(XID *var_xid, int rmid, long flags)
{
    int RCPrepare;
   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XAPrepare: Calling xa_prepare ...");
    if ((RCPrepare = xa_prepare(var_xid, rmid, flags)) != XA_OK)
    {
        printf("\n\tXAPrepare: xa_prepare() returned %d\n",RCPrepare);
    }
    else
    {
        printf("Success %d.\n", RCPrepare);
    }
    return(RCPrepare);
}

XACommit(XID *var_xid, int rmid, long flags)
{
    int RCCommit;
   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XACommit: Calling xa_commit...");
    if ((RCCommit = xa_commit(var_xid, rmid, flags)) != XA_OK)
    {
        printf("\n\tXACommit: xa_commit() returned %d\n", RCCommit);
    }
   else
    {
        printf("Success %d.\n", RCCommit);
    }
    return(RCCommit);
}

XARollback(XID *var_xid, int rmid, long flags)
{
    int RCRollback;
   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XARollback: Calling xa_rollback...");
    if ((RCRollback = xa_rollback(var_xid, rmid, flags)) != XA_OK)
    {
        printf("\n\tXARollback: xa_rollback() returned %d\n", RCRollback);
    }
    else
    {
        printf("Success %d.\n", RCRollback);
    }
    return(RCRollback);
}

XARecover(XID *var_xid, long count, int rmid, long flags)
{
    int RCRecover;
   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XARecover: Calling xa_recover...");
    if ((RCRecover = xa_recover(var_xid, count, rmid, flags)) != XA_OK)
    {
        printf("\n\tXARecover: xa_recover() returned %d\n", RCRecover);
    }
    else
    {
        printf("Success %d.\n", RCRecover);
    }
    return(RCRecover);
}

XAForget(XID *var_xid, int rmid, long flags)
{
    int RCForget;
   OdbcXaSwitch = _fninfx_xa_switch();
    printf("XAForget: Calling xa_forget...");
    if ((RCForget = xa_forget(var_xid, rmid, flags)) != XA_OK)
    {
        printf("\n\tXAForget: xa_forget() returned %d\n", RCForget);
    }
    else
    {
        printf("Success %d.\n", RCForget);
    }
    return(RCForget);
}

SQLINTEGER checkError (SQLRETURN       rc,
                SQLSMALLINT     handleType,
                                SQLHANDLE       handle,
                                SQLCHAR*            errmsg)
{
    SQLRETURN       retcode = SQL_SUCCESS;
    SQLSMALLINT     errNum = 1;
        SQLCHAR                    sqlState[6];
    SQLINTEGER      nativeError;
        SQLCHAR                    errMsg[ERRMSG_LEN];
    SQLSMALLINT     textLengthPtr;

    if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO))
    {
        while (retcode != SQL_NO_DATA)
        {
            retcode = SQLGetDiagRec (handleType, handle, errNum, sqlState, &nativeError, errMsg, ERRMSG_LEN, &textLengthPtr);

            if (retcode == SQL_INVALID_HANDLE)
            {
                fprintf (stderr, "checkError function was called with an invalid handle!!\n");
                return 1;
            }

            if ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO))
                fprintf (stderr, "ERROR: %d:  %s : %s \n", nativeError, sqlState, errMsg);

            errNum++;
        }

        fprintf (stderr, "%s\n", errmsg);
        return 1;   /* all errors on this handle have been reported */
    }
        else
                return 0;        /* no errors to report */
}



main(int argc, char *argv[])
{
        SQLCHAR defDsn[] = "odbc_demo";
        char applTokenStr[] = "123";
        char openInfo[60];
        SQLCHAR        dsn[40]; /*name of the DSN used for connecting to the database*/
        XID var_xid1, var_xid2;
        RETCODE rc;
        HANDLE hdbc, hstmt;
        HENV henv;
        int rmid =0;
        int applToken;

    /* If(dsn is not explicitly passed in as arg) */
    if (argc != 2)
    {
        /* Use default dsn - odbc_demo */
        fprintf (stdout, "\nUsing default DSN : %s\n", defDsn);
        strcpy ((char *)dsn, (char *)defDsn);
    }
    else
    {
        /* Use specified dsn */
        strcpy ((char *)dsn, (char *)argv[1]);
        fprintf (stdout, "\nUsing specified DSN : %s\n", dsn);
        }
    applToken = atoi(applTokenStr);
        strcpy(openInfo, applTokenStr);
        strcat(openInfo, (char *)"|");
        strcat(openInfo, (char *)dsn);

        fprintf (stdout, "\nUsing specified openInfo : %s\n", openInfo);

    var_xid1.formatID = 100;
    var_xid1.gtrid_length = 3;
    var_xid1.bqual_length = 3;
    var_xid1.data[0] = 'A';
    var_xid1.data[1] = 'B';
    var_xid1.data[2] = 'A';
    var_xid1.data[3] = 'B';
    var_xid1.data[4] = 'A';
    var_xid1.data[5] = 'B';

    var_xid2.formatID = 102;
    var_xid2.gtrid_length = 3;
    var_xid2.bqual_length = 3;
    var_xid2.data[0] = 'C';
    var_xid2.data[1] = 'D';
    var_xid2.data[2] = 'C';
    var_xid2.data[3] = 'D';
    var_xid2.data[4] = 'C';
    var_xid2.data[5] = 'D';

    if ((rc = XAOpen(openInfo, rmid, TMNOFLAGS)) == XA_OK)
        {
            printf("\nXAOpen done ...");
            printf("\nRmid set: [%i]\n",rmid);
        }
                else
        {
                printf("\n XAOpen Failed ... Aborting ...");
                exit(1);
        }

    rc = IFMX_SQLGetXaHenv(applToken, &henv);
        if (rc)
        {
                printf("\nIFMX_SQLGetXaHenv Failed ... Aborting ...");
                exit(1);
        }

    rc = IFMX_SQLGetXaHdbc(applToken, &hdbc);
        if (rc)
        {
                printf("\nIFMX_SQLGetXaHdbc Failed ... Aborting ...");
                exit(1);
        }

    rc = XAStart(&var_xid1, rmid, TMNOFLAGS);
        if (rc)
        {
                printf("\nXAStart Failed ... Aborting ...");
                exit(1);
        }

    rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    if (checkError (rc, SQL_HANDLE_DBC, hdbc, (SQLCHAR *) "SQLAllocHandle failed\nExiting!!\n"))
                return (1);

    printf("\n Inserting Values ...");

        rc = SQLExecDirect(hstmt, (SQLCHAR *)"INSERT INTO xa_tab1 VALUES(1)", SQL_NTS);
    if (checkError (rc, SQL_HANDLE_STMT, hstmt, (SQLCHAR *) "SQLExecDirect failed\nExiting!!\n"))
                return (1);

    printf ("\n Calling XAEnd on first transaction ...");

    rc = XAEnd(&var_xid1, rmid, TMSUCCESS);
    if (rc)
        {
                printf("\nXAEnd Failed ... Aborting ...Error Code: %d", rc);
                exit(1);
        }

    rc = XACommit(&var_xid1, rmid, TMONEPHASE);
    if (rc)
        {
                printf("\nXACommit Failed ... Aborting ...Error Code: %d", rc);
                exit(1);
        }
    printf("\nCalling XAStart on second transaction...");

    rc = XAStart(&var_xid2, rmid, TMNOFLAGS);
    if (rc)
        {
                printf("\nXAStart Failed ... Aborting ...Error Code: %d", rc);
                exit(1);
        }
    rc = SQLExecDirect(hstmt, (SQLCHAR *)"INSERT INTO xa_tab1 VALUES(2)", SQL_NTS);
    if (checkError (rc, SQL_HANDLE_STMT, hstmt, (SQLCHAR *) "SQLExecDirect failed\nExiting!!\n"))
                return (1);

    rc = XAEnd(&var_xid2, rmid, TMSUCCESS);
    if (rc)
        {
                printf("\nXAEnd Failed ... Aborting ...Error Code: %d", rc);
                exit(1);
        }
    rc = XARollback(&var_xid2, rmid, TMNOFLAGS);
    if (rc)
        {
                printf("\nXARollback Failed ... Aborting ...Error Code: %d", rc);
                exit(1);
        }
    rc = SQLFreeStmt(hstmt, SQL_CLOSE);
    if (checkError (rc, SQL_HANDLE_STMT, hstmt, (SQLCHAR *) "SQLFreeStmt failed\nExiting!!\n"))
                return (1);

    rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    if (checkError (rc, SQL_HANDLE_DBC, hdbc, (SQLCHAR *) "SQLFreeHandle failed\nExiting!!\n"))
                return (1);

    rc = XAClose(openInfo, rmid, TMNOFLAGS);
    if (rc)
      {
        printf("\nXARollback Failed ... Aborting ...Error Code: %d", rc);
        exit(1);
      }
        exit(0);
}

论坛徽章:
0
3 [报告]
发表于 2008-04-03 11:34 |只看该作者
太感谢你了。
直接esql就行吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP