sql_result sql_statement::internal_get_attribute()

in modules/platforms/cpp/ignite/odbc/sql_statement.cpp [305:448]


sql_result sql_statement::internal_get_attribute(int attr, void *buf, SQLINTEGER, SQLINTEGER *value_len) {
    if (!buf) {
        add_status_record("Data buffer is NULL.");

        return sql_result::AI_ERROR;
    }

    switch (attr) {
        case SQL_ATTR_APP_ROW_DESC:
        case SQL_ATTR_APP_PARAM_DESC:
        case SQL_ATTR_IMP_ROW_DESC:
        case SQL_ATTR_IMP_PARAM_DESC: {
            auto *val = reinterpret_cast<SQLPOINTER *>(buf);

            *val = static_cast<SQLPOINTER>(this);

            if (value_len)
                *value_len = SQL_IS_POINTER;

            break;
        }

        case SQL_ATTR_ROW_BIND_TYPE: {
            auto *val = reinterpret_cast<SQLULEN *>(buf);

            *val = SQL_BIND_BY_COLUMN;

            break;
        }

        case SQL_ATTR_ROW_ARRAY_SIZE: {
            auto *val = reinterpret_cast<SQLINTEGER *>(buf);

            *val = static_cast<SQLINTEGER>(m_row_array_size);

            if (value_len)
                *value_len = SQL_IS_INTEGER;

            break;
        }

        case SQL_ATTR_ROWS_FETCHED_PTR: {
            auto **val = reinterpret_cast<SQLULEN **>(buf);

            *val = reinterpret_cast<SQLULEN *>(get_row_fetched_ptr());

            if (value_len)
                *value_len = SQL_IS_POINTER;

            break;
        }

        case SQL_ATTR_ROW_STATUS_PTR: {
            auto **val = reinterpret_cast<SQLUSMALLINT **>(buf);

            *val = reinterpret_cast<SQLUSMALLINT *>(get_row_statuses_ptr());

            if (value_len)
                *value_len = SQL_IS_POINTER;

            break;
        }

        case SQL_ATTR_PARAM_BIND_TYPE: {
            auto *val = reinterpret_cast<SQLULEN *>(buf);

            *val = SQL_PARAM_BIND_BY_COLUMN;

            break;
        }

        case SQL_ATTR_PARAM_BIND_OFFSET_PTR: {
            auto **val = reinterpret_cast<SQLULEN **>(buf);

            *val = reinterpret_cast<SQLULEN *>(m_parameters.get_param_bind_offset_ptr());

            if (value_len)
                *value_len = SQL_IS_POINTER;

            break;
        }

        case SQL_ATTR_ROW_BIND_OFFSET_PTR: {
            auto **val = reinterpret_cast<SQLULEN **>(buf);

            *val = reinterpret_cast<SQLULEN *>(get_column_bind_offset_ptr());

            if (value_len)
                *value_len = SQL_IS_POINTER;

            break;
        }

        case SQL_ATTR_PARAMSET_SIZE: {
            auto *val = reinterpret_cast<SQLULEN *>(buf);

            *val = static_cast<SQLULEN>(m_parameters.get_param_set_size());

            if (value_len)
                *value_len = SQL_IS_UINTEGER;

            break;
        }

        case SQL_ATTR_PARAMS_PROCESSED_PTR: {
            auto **val = reinterpret_cast<SQLULEN **>(buf);

            *val = m_parameters.get_params_processed_ptr();

            if (value_len)
                *value_len = SQL_IS_POINTER;

            break;
        }

        case SQL_ATTR_PARAM_STATUS_PTR: {
            auto **val = reinterpret_cast<SQLUSMALLINT **>(buf);

            *val = m_parameters.get_params_status_ptr();

            if (value_len)
                *value_len = SQL_IS_POINTER;

            break;
        }

        case SQL_ATTR_QUERY_TIMEOUT: {
            auto *u_timeout = reinterpret_cast<SQLULEN *>(buf);

            *u_timeout = static_cast<SQLULEN>(m_timeout);

            break;
        }

        default: {
            add_status_record(
                sql_state::SHYC00_OPTIONAL_FEATURE_NOT_IMPLEMENTED, "Specified attribute is not supported.");

            return sql_result::AI_ERROR;
        }
    }

    return sql_result::AI_SUCCESS;
}