in pgxalib.cpp [624:669]
EXTERN_C static int __cdecl xa_rollback(XID *xid, int rmid, long flags)
{
int rmcode = XAER_RMERR;
char pgxid[258];
XidToText(*xid, pgxid);
mylog("xa_rollback %s rmid=%d flags=%ld\n", pgxid, rmid, flags);
map<int, XAConnection>::iterator p;
p = init_crit.xatab.find(rmid);
if (p != init_crit.xatab.end())
{
HDBC conn = p->second.ActivateConnection();
if (conn)
{
SQLCHAR cmdmsg[512], sqlstate[8];
HSTMT stmt;
RETCODE ret;
ret = SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt);
if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
{
mylog("Statement allocation error\n");
return rmcode;
}
_snprintf((char *) cmdmsg, sizeof(cmdmsg), "ROLLBACK PREPARED '%s'", pgxid);
ret = SQLExecDirect(stmt, (SQLCHAR *) cmdmsg, SQL_NTS);
switch (ret)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
rmcode = XA_OK;
break;
case SQL_ERROR:
SQLGetDiagRec(SQL_HANDLE_STMT, stmt,
1, sqlstate, NULL, cmdmsg,
sizeof(cmdmsg), NULL);
mylog("xa_commit error %s '%s'\n", sqlstate, cmdmsg);
if (_stricmp((char *) sqlstate, "42704") == 0)
rmcode = XA_HEURHAZ;
break;
}
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
}
}
return rmcode;
}