更新时间:2026-07-28 GMT+08:00
分享

使用XA接口

此示例为XA接口使用。在编译时需要动态链接gsxalib库。

具体代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libpq-fe.h>
#include <xa.h>
void execute_query(PGconn *conn, const char *query) {
    PGresult *res = PQexec(conn, query);
    if (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK) {
        fprintf(stderr, "Query execution failed: %s", PQerrorMessage(conn));
        PQclear(res);
        PQfinish(conn);
        exit(1);
    }
    PQclear(res);
}

int main(int argc, char **argv)
{
    char xa_info[256] = {0};
    int rmid = 1;
    XID xid;
    int ret = 0;
    PGconn *conn = NULL;
    /* 此处user、passwd等变量应从环境变量或配置文件读取,环境变量需用户自己按需配置;非环境变量情况下可直接赋值字符串 */
    char *passwd = getenv("EXAMPLE_PASSWD_ENV");
    char *port = getenv("EXAMPLE_PORT_ENV");
    char *host = getenv("EXAMPLE_HOST_ENV");
    char *username = getenv("EXAMPLE_USERNAME_ENV");
    char *dbname = getenv("EXAMPLE_DBNAME_ENV");
    sprintf(xa_info, "dbname=%s port=%s host=%s user=%s password=%s", dbname, port, host, username, passwd);
    // Init XID structure
    memset(&xid, 0, sizeof(XID));
    xid.formatID = 12345;
    xid.gtrid_length = 4;
    xid.bqual_length = 4;
    memcpy(xid.data, "GID1", xid.gtrid_length);
    memcpy(xid.data + xid.gtrid_length, "BID1", xid.bqual_length);
    ret = xagsw.xa_open_entry(xa_info, rmid, TMNOFLAGS);
    if (ret != XA_OK) {
        fprintf(stderr, "xa_open_entry failed, code:%d.\n", ret);
    }
    conn = get_xapg_conn(rmid);
    if (PQstatus(conn) != CONNECTION_OK) {
        fprintf(stderr, "Connection to database failed: %s\n", PQerrorMessage(conn));
    }
    ret = xagsw.xa_start_entry(&xid, rmid, TMNOFLAGS);
    if (ret != XA_OK) {
        fprintf(stderr, "xa_start_entry failed, code:%d.\n", ret);
    }
    // Perform operations
    execute_query(conn, "drop table if exists test_xa;CREATE TABLE test_xa (i int4, t text);");
    execute_query(conn, "INSERT INTO test_xa values (1, 'ho there');");
    ret = xagsw.xa_end_entry(&xid, rmid, TMSUCCESS);
    if (ret != XA_OK) {
        fprintf(stderr, "xa_end_entry failed, code:%d.\n", ret);
    }
    ret = xagsw.xa_prepare_entry(&xid, rmid, TMNOFLAGS);
    if (ret != XA_OK) {
        fprintf(stderr, "xa_prepare_entry failed, code:%d.\n", ret);
    }
    XID xids[10] = {0};
    int count = xagsw.xa_recover_entry(xids, 10, rmid, TMNOFLAGS);
    if (count < 0) {
        fprintf(stderr, "xa_recover_entry failed, code:%d.\n", count);
    } else {
        for (int i = 0; i < count; ++i) {
            printf("xid%d [formatID]:%d [gtrid_length]:%d [bqual_length]:%d [data]:%s\n",
                i,
                xids[i].formatID,
                xids[i].gtrid_length,
                xids[i].bqual_length,
                xids[i].data);
        }
    }
    ret = xagsw.xa_commit_entry(&xid, rmid, TMNOFLAGS);
    if (ret != XA_OK) {
        fprintf(stderr, "xa_commit_entry failed, code:%d.\n", ret);
    }
    ret = xagsw.xa_close_entry(xa_info, rmid, TMNOFLAGS);
    if (ret != XA_OK) {
        fprintf(stderr, "xa_commit_entry failed, code:%d.\n", ret);
    }
    printf("All things done successfully.\n");
    return 0;
}

示例运行结果如下:

NOTICE:  table "test_xa" does not exist, skipping
xid0 [formatID]:12345 [gtrid_length]:4 [bqual_length]:4 [data]:GID1BID1
All things done successfully.

相关文档