in pgxalib.cpp [737:797]
EXTERN_C static int __cdecl xa_recover(XID *xids, long count, int rmid, long flags)
{
int rmcode = XAER_RMERR, rcount;
mylog("xa_recover rmid=%d count=%d flags=%ld\n", rmid, count, flags);
map<int, XAConnection>::iterator p;
p = init_crit.xatab.find(rmid);
if (p == init_crit.xatab.end())
return rmcode;
HDBC conn = p->second.ActivateConnection();
if (!conn)
{
if (p->second.AuthenticationError())
rmcode = 0;
mylog("%s returns %d\n", __FUNCTION__, rmcode);
return rmcode;
}
vector<string> &vec = p->second.GetResultVec();
int pos = p->second.GetPos();
if ((flags & TMSTARTRSCAN) != 0)
{
HSTMT stmt;
RETCODE ret;
char buf[512];
vec.clear();
SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt);
ret = SQLExecDirect(stmt, (SQLCHAR *) "select gid from pg_prepared_xacts", SQL_NTS);
if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
{
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
pos = -1;
goto onExit;
}
SQLBindCol(stmt, 1, SQL_C_CHAR, buf, sizeof(buf), NULL);
ret = SQLFetch(stmt);
while (SQL_NO_DATA_FOUND != ret)
{
vec.push_back(buf);
ret = SQLFetch(stmt);
}
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
pos = 0;
}
rcount = (int) vec.size();
rmcode = rcount - pos;
if (rmcode > count)
rmcode = count;
for (int i = 0; i < rmcode; i++, pos++)
TextToXid(xids[i], vec[pos].c_str());
if ((flags & TMENDRSCAN) != 0)
{
vec.clear();
pos = -1;
}
mylog("return count=%d\n", rmcode);
onExit:
p->second.SetPos(pos);
return rmcode;
}