sql_result type_info_query::get_column()

in modules/platforms/cpp/ignite/odbc/query/type_info_query.cpp [191:323]


sql_result type_info_query::get_column(std::uint16_t column_idx, application_data_buffer &buffer) {
    if (!m_executed) {
        m_diag.add_status_record(sql_state::SHY010_SEQUENCE_ERROR, "Query was not executed.");
        return sql_result::AI_ERROR;
    }

    if (m_cursor == m_types.end()) {
        m_diag.add_status_record(sql_state::S24000_INVALID_CURSOR_STATE, "Cursor has reached end of the result set.");
        return sql_result::AI_ERROR;
    }

    auto current_type = *m_cursor;

    switch (result_column(column_idx)) {
        case result_column::TYPE_NAME: {
            buffer.put_string(ignite_type_to_sql_type_name(current_type));

            break;
        }

        case result_column::DATA_TYPE:
        case result_column::SQL_DATA_TYPE: {
            buffer.put_int16(ignite_type_to_sql_type(current_type));

            break;
        }

        case result_column::COLUMN_SIZE: {
            buffer.put_int32(ignite_type_max_column_size(current_type));

            break;
        }

        case result_column::LITERAL_PREFIX: {
            auto prefix = ignite_type_literal_prefix(current_type);
            if (!prefix)
                buffer.put_null();
            else
                buffer.put_string(*prefix);

            break;
        }

        case result_column::LITERAL_SUFFIX: {
            auto suffix = ignite_type_literal_suffix(current_type);
            if (!suffix)
                buffer.put_null();
            else
                buffer.put_string(*suffix);

            break;
        }

        case result_column::CREATE_PARAMS: {
            if (current_type == ignite_type::DECIMAL)
                buffer.put_string("precision,scale");
            else
                buffer.put_null();

            break;
        }

        case result_column::NULLABLE: {
            buffer.put_int32(ignite_type_nullability(current_type));

            break;
        }

        case result_column::CASE_SENSITIVE: {
            if (current_type == ignite_type::STRING)
                buffer.put_int16(SQL_TRUE);
            else
                buffer.put_int16(SQL_FALSE);

            break;
        }

        case result_column::SEARCHABLE: {
            buffer.put_int16(SQL_SEARCHABLE);

            break;
        }

        case result_column::UNSIGNED_ATTRIBUTE: {
            buffer.put_int16(is_ignite_type_unsigned(current_type));

            break;
        }

        case result_column::FIXED_PREC_SCALE:
        case result_column::AUTO_UNIQUE_VALUE: {
            buffer.put_int16(SQL_FALSE);

            break;
        }

        case result_column::LOCAL_TYPE_NAME: {
            buffer.put_null();

            break;
        }

        case result_column::MINIMUM_SCALE:
        case result_column::MAXIMUM_SCALE: {
            buffer.put_int16(std::int16_t(ignite_type_decimal_digits(current_type, -1)));

            break;
        }

        case result_column::SQL_DATETIME_SUB: {
            buffer.put_null();

            break;
        }

        case result_column::NUM_PREC_RADIX: {
            buffer.put_int32(ignite_type_num_precision_radix(current_type));

            break;
        }

        case result_column::INTERVAL_PRECISION: {
            buffer.put_null();

            break;
        }

        default:
            break;
    }

    return sql_result::AI_SUCCESS;
}