HDBC XAConnection::ActivateConnection()

in pgxalib.cpp [133:190]


HDBC	XAConnection::ActivateConnection(void)
{
	RETCODE	ret;

	MLOCK_ACQUIRE;
	if (!init_crit.env)
	{
		ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &init_crit.env);
		if (!SQL_SUCCEEDED(ret))
		{
			MLOCK_RELEASE;
			return NULL;
		}
	}
	MLOCK_RELEASE;
	if (xaconn)
		return xaconn;

	ret = SQLSetEnvAttr(init_crit.env, SQL_ATTR_ODBC_VERSION, (PTR) SQL_OV_ODBC3, 0);
	ret = SQLAllocHandle(SQL_HANDLE_DBC, init_crit.env, &xaconn);
	if (!SQL_SUCCEEDED(ret))
		return NULL;

	ret = SQLDriverConnect(xaconn, NULL,
		 (SQLCHAR *) dsnstr.c_str(), SQL_NTS, NULL, SQL_NULL_DATA, NULL, SQL_DRIVER_COMPLETE);
	if (SQL_SUCCEEDED(ret))
		return xaconn;
	SQLCHAR	sqlstate[8], errmsg[256];

	SQLGetDiagRec(SQL_HANDLE_DBC, xaconn,
			1, sqlstate, NULL, errmsg,
			sizeof(errmsg), NULL);
	mylog("first SQLDriverConnect return=%d sqlstate=%s error=%s\n", ret, sqlstate, errmsg);
	sqlState = (char *) sqlstate;
	errMsg = (char *) errmsg;
	if (!AuthenticationError())
	{
		SQLFreeHandle(SQL_HANDLE_DBC, xaconn);
		return NULL;
	}
	sqlState.clear();
	errMsg.clear();
	ret = SQLDriverConnect(xaconn, NULL,
		 (SQLCHAR *) (dsnstr + ";Username=postgres;Password=postgres;sslmode=allow").c_str(), SQL_NTS, NULL, SQL_NULL_DATA, NULL, SQL_DRIVER_COMPLETE);
	if (SQL_SUCCEEDED(ret))
	{
		mylog("second SQLDriverConnect success\n");
		return xaconn;
	}

	SQLGetDiagRec(SQL_HANDLE_DBC, xaconn,
			1, sqlstate, NULL, errmsg,
			sizeof(errmsg), NULL);
	mylog("second SQLDriverConnect return=%d sqlstate=%s error=%s\n", ret, sqlstate, errmsg);
	sqlState = (char *) sqlstate;
	errMsg = (char *) errmsg;
	return NULL;
}