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