std::vector LimitlessQueryHelper::QueryForLimitlessRouters()

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;
}