in pgxalib.cpp [694:736]
EXTERN_C static int __cdecl xa_commit(XID *xid, int rmid, long flags)
{
int rmcode = XAER_RMERR;
char pgxid[258];
XidToText(*xid, pgxid);
mylog("xa_commit %s rmid=%d flags=%ld\n", pgxid, rmid, flags);
#ifdef _SLEEP_FOR_TEST_
Sleep(2000);
#endif /* _SLEEP_FOR_TEST_ */
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;
SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt);
_snprintf((char *) cmdmsg, sizeof(cmdmsg), "COMMIT 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);
if (_stricmp((char *) sqlstate, "42704") == 0)
rmcode = XA_HEURHAZ;
break;
}
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
}
}
return rmcode;
}