in connection.c [1319:1407]
bool GetLimitlessServer(ConnInfo *ci, const char **limitless_err) {
MYLOG(MIN_LOG_LEVEL, "entering...limitless_enabled=%d\n", ci->limitless_enabled);
if (!ci->limitless_enabled) {
return true;
}
int host_port = pg_atoi(ci->port);
ci->limitless_enabled = 0;
char connect_string_encoded[MAX_CONNECT_STRING];
makeConnectString(connect_string_encoded, ci, MAX_CONNECT_STRING);
ci->limitless_enabled = 1;
#ifdef UNICODE_SUPPORT
wchar_t connStr[MAX_CONNECT_STRING];
utf8_to_ucs2(connect_string_encoded, sizeof(connect_string_encoded), connStr, sizeof(connStr));
#endif
// double check that the server supports limitless; if not, disable monitoring for this connection
SQLHENV henv;
SQLRETURN rc = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
if (!SQL_SUCCEEDED(rc)) {
*limitless_err = strdup(ERRMSG_LIMITLESS_COULD_NOT_ALLOCATE);
MYLOG(MIN_LOG_LEVEL, "SQLAllocHandle of SQL_HANDLE_ENV failed\n");
return false;
}
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
SQLHDBC hdbc;
rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (!SQL_SUCCEEDED(rc)) {
*limitless_err = strdup(ERRMSG_LIMITLESS_COULD_NOT_ALLOCATE);
MYLOG(MIN_LOG_LEVEL, "SQLAllocHandle of SQL_HANDLE_DBC failed\n");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return false;
}
#ifdef UNICODE_SUPPORT
SQLSMALLINT connect_string_len = wcslen(connStr), out_len;
rc = SQLDriverConnectW(hdbc, NULL, connStr, connect_string_len, NULL, 0, &out_len, SQL_DRIVER_NOPROMPT);
#else
SQLSMALLINT connect_string_len = strlen(connect_string_encoded), out_len;
rc = SQLDriverConnect(hdbc, NULL, connect_string_encoded, connect_string_len, NULL, 0, &out_len, SQL_DRIVER_NOPROMPT);
#endif
if (!SQL_SUCCEEDED(rc)) {
*limitless_err = RDS_MergeDiagRecs(hdbc, ERRMSG_LIMITLESS_CONNECTION_NOT_ESTABLISHED);
MYLOG(MIN_LOG_LEVEL, "SQLDriverConnect failed before call to CheckLimitlessCluster\n");
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return false;
}
MYLOG(MIN_LOG_LEVEL, "before CheckLimitlessCluster\n");
if (CheckLimitlessCluster(hdbc)) {
MYLOG(MIN_LOG_LEVEL, "CheckLimitlessCluster returned true\n");
} else {
*limitless_err = strdup(ERRMSG_LIMITLESS_NOT_LIMITLESS_CLUSTER);
MYLOG(MIN_LOG_LEVEL, "CheckLimitlessCluster returned false\n");
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return false;
}
// disconnect from this preliminary connection
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
MYLOG(MIN_LOG_LEVEL, "before GetLimitlessInstance\n");
LimitlessInstance db_instance;
db_instance.server = (char *)malloc(MEDIUM_REGISTRY_LEN);
db_instance.server_size = MEDIUM_REGISTRY_LEN;
#ifdef UNICODE_SUPPORT
bool db_instance_ready = GetLimitlessInstance(connStr, host_port, ci->limitless_service_id, MEDIUM_REGISTRY_LEN, &db_instance);
#else
bool db_instance_ready = GetLimitlessInstance(connect_string_encoded, host_port, ci->limitless_service_id, MEDIUM_REGISTRY_LEN, &db_instance);
#endif
if (db_instance_ready) {
MYLOG(MIN_LOG_LEVEL, "GetLimitlessInstance router endpoint: %s\n", db_instance.server);
STRCPY_FIXED(ci->server, db_instance.server);
} else {
MYLOG(MIN_LOG_LEVEL, "GetLimitlessInstance returned false. Not using router endpoint.\n");
}
free(db_instance.server);
*limitless_err = NULL;
return true;
}