in src/limitless/limitless_query_helper.cc [73:116]
std::vector<HostInfo> LimitlessQueryHelper::QueryForLimitlessRouters(SQLHDBC conn, int host_port_to_map) {
HSTMT hstmt = SQL_NULL_HSTMT;
SQLRETURN rc = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
if (!OdbcHelper::CheckResult(rc, "LimitlessQueryHelper: SQLAllocHandle failed", hstmt, SQL_HANDLE_STMT)) {
return std::vector<HostInfo>();
}
// Generally accepted URL endpoint max length + 1 for null terminator
SQLCHAR router_endpoint_value[ROUTER_ENDPOINT_LENGTH] = {0};
SQLLEN ind_router_endpoint_value = 0;
SQLCHAR load_value[LOAD_LENGTH] = {0};
SQLLEN ind_load_value = 0;
rc = SQLBindCol(hstmt, 1, SQL_C_CHAR, &router_endpoint_value, sizeof(router_endpoint_value), &ind_router_endpoint_value);
SQLRETURN rc2 = SQLBindCol(hstmt, 2, SQL_C_CHAR, &load_value, sizeof(load_value), &ind_load_value);
if (!OdbcHelper::CheckResult(rc, "LimitlessQueryHelper: SQLBindCol for router endpoint failed", hstmt, SQL_HANDLE_STMT) ||
!OdbcHelper::CheckResult(rc2, "LimitlessQueryHelper: SQLBindCol for load value failed", hstmt, SQL_HANDLE_STMT)) {
OdbcHelper::Cleanup(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt);
return std::vector<HostInfo>();
}
rc = SQLExecDirect(hstmt, limitless_router_endpoint_query, SQL_NTS);
if (!OdbcHelper::CheckResult(rc, "LimitlessQueryHelper: SQLExecDirect failed", hstmt, SQL_HANDLE_STMT)) {
OdbcHelper::Cleanup(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt);
return std::vector<HostInfo>();
}
SQLLEN row_count = 0;
rc = SQLRowCount(hstmt, &row_count);
if (!OdbcHelper::CheckResult(rc, "LimitlessQueryHelper: SQLRowCount failed", hstmt, SQL_HANDLE_STMT)) {
OdbcHelper::Cleanup(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt);
return std::vector<HostInfo>();
}
std::vector<HostInfo> limitless_routers;
while (SQL_SUCCEEDED(rc = SQLFetch(hstmt))) {
limitless_routers.push_back(create_host(load_value, router_endpoint_value, host_port_to_map));
}
OdbcHelper::Cleanup(SQL_NULL_HENV, SQL_NULL_HDBC, hstmt);
return limitless_routers;
}