bool FailoverService::is_connected_to_reader()

in src/failover/failover_service.cc [354:386]


bool FailoverService::is_connected_to_reader(SQLHDBC hdbc) {
    if (SQL_NULL_HDBC == hdbc) {
        LOG(WARNING) << "[Failover Service] null HDBC passed to reader check.";
        return false;
    }

    SQLHSTMT stmt = SQL_NULL_HANDLE;
    bool is_reader = false;

    if (!odbc_helper_->AllocateHandle(SQL_HANDLE_STMT, hdbc, stmt, "[Failover Service] reader check failed to allocate handle")) {
        return false;
    }

    if (!odbc_helper_->ExecuteQuery(stmt, AS_SQLTCHAR(dialect_->GetIsReaderQuery().c_str()),
                                  "[Failover Service] reader check failed to execute topology query")) {
        return false;
    }

    SQLLEN rt = 0;
    SQLRETURN rc = SQLBindCol(stmt, 1, SQL_BIT, &is_reader, sizeof(is_reader), &rt);
    if (!OdbcHelper::CheckResult(rc, "[Failover Service] reader check failed to bind is_reader column", stmt, SQL_HANDLE_STMT)) {
        OdbcHelper::Cleanup(SQL_NULL_HANDLE, SQL_NULL_HANDLE, stmt);
        return false;
    }

    if (!odbc_helper_->FetchResults(stmt, "[Failover Service] failed to fetch if is_reader from results")) {
        return false;
    }

    LOG(INFO) << "[Failover Service] check reader queried: " << is_reader;
    OdbcHelper::Cleanup(SQL_NULL_HANDLE, SQL_NULL_HANDLE, stmt);
    return is_reader;
}