std::vector ClusterTopologyQueryHelper::QueryTopology()

in src/failover/cluster_topology_query_helper.cc [88:135]


std::vector<HostInfo> ClusterTopologyQueryHelper::QueryTopology(SQLHDBC hdbc) {
    SQLHSTMT stmt = SQL_NULL_HANDLE;
    SQLTCHAR node_id[BUFFER_SIZE] = {0};
    bool is_writer;
    SQLREAL cpu_usage;
    SQLINTEGER replica_lag_ms;
    SQLLEN rt = 0;

    if (!OdbcHelper::AllocateHandle(SQL_HANDLE_STMT, hdbc, stmt, "ClusterTopologyQueryHelper failed to allocate handle")) {
        return std::vector<HostInfo>();
    }

    if (!OdbcHelper::ExecuteQuery(stmt, AS_SQLTCHAR(topology_query_.c_str()), "ClusterTopologyQueryHelper failed to execute topology query")) {
        return std::vector<HostInfo>();
    }

    SQLRETURN rc = SQLBindCol(stmt, NODE_ID_COL, SQL_C_TCHAR, &node_id, sizeof(node_id), &rt);
    if (!OdbcHelper::CheckResult(rc, "ClusterTopologyQueryHelper failed to bind node_id column", stmt, SQL_HANDLE_STMT)) {
        OdbcHelper::Cleanup(SQL_NULL_HANDLE, SQL_NULL_HANDLE, stmt);
        return std::vector<HostInfo>();
    }

    rc = SQLBindCol(stmt, IS_WRITER_COL, SQL_BIT, &is_writer, sizeof(is_writer), &rt);
    if (!OdbcHelper::CheckResult(rc, "ClusterTopologyQueryHelper failed to bind is_writer column", stmt, SQL_HANDLE_STMT)) {
        OdbcHelper::Cleanup(SQL_NULL_HANDLE, SQL_NULL_HANDLE, stmt);
        return std::vector<HostInfo>();
    }

    rc = SQLBindCol(stmt, CPU_USAGE_COL, SQL_REAL, &cpu_usage, sizeof(cpu_usage), &rt);
    if (!OdbcHelper::CheckResult(rc, "ClusterTopologyQueryHelper failed to bind cpu_usage column", stmt, SQL_HANDLE_STMT)) {
        OdbcHelper::Cleanup(SQL_NULL_HANDLE, SQL_NULL_HANDLE, stmt);
        return std::vector<HostInfo>();
    }

    rc = SQLBindCol(stmt, REPLICA_LAG_COL, SQL_INTEGER, &replica_lag_ms, sizeof(replica_lag_ms), &rt);
    if (!OdbcHelper::CheckResult(rc, "ClusterTopologyQueryHelper failed to bind replica_lag_ms column", stmt, SQL_HANDLE_STMT)) {
        OdbcHelper::Cleanup(SQL_NULL_HANDLE, SQL_NULL_HANDLE, stmt);
        return std::vector<HostInfo>();
    }

    bool fetch_success = OdbcHelper::FetchResults(stmt, "ClusterTopologyQueryHelper failed to fetch topology from results");
    std::vector<HostInfo> hosts;
    while (fetch_success) {
        hosts.push_back(CreateHost(node_id, is_writer, cpu_usage, replica_lag_ms));
        fetch_success = OdbcHelper::FetchResults(stmt, "ClusterTopologyQueryHelper failed to fetch topology from results");
    }
    return hosts;
}