| 379 | } |
| 380 | |
| 381 | void ODBCStatement::GetStmtAttr(SQLINTEGER statement_attribute, SQLPOINTER output, |
| 382 | SQLINTEGER buffer_size, SQLINTEGER* str_len_ptr, |
| 383 | bool is_unicode) { |
| 384 | std::optional<Statement::Attribute> spi_attribute; |
| 385 | switch (statement_attribute) { |
| 386 | // Descriptor accessor attributes |
| 387 | case SQL_ATTR_APP_PARAM_DESC: |
| 388 | DescriptorToHandle(output, current_apd_, str_len_ptr); |
| 389 | return; |
| 390 | case SQL_ATTR_APP_ROW_DESC: |
| 391 | DescriptorToHandle(output, current_ard_, str_len_ptr); |
| 392 | return; |
| 393 | case SQL_ATTR_IMP_PARAM_DESC: |
| 394 | DescriptorToHandle(output, ipd_.get(), str_len_ptr); |
| 395 | return; |
| 396 | case SQL_ATTR_IMP_ROW_DESC: |
| 397 | DescriptorToHandle(output, ird_.get(), str_len_ptr); |
| 398 | return; |
| 399 | |
| 400 | // Attributes that are descriptor fields |
| 401 | case SQL_ATTR_PARAM_BIND_OFFSET_PTR: |
| 402 | current_apd_->GetHeaderField(SQL_DESC_BIND_OFFSET_PTR, output, buffer_size, |
| 403 | str_len_ptr); |
| 404 | return; |
| 405 | case SQL_ATTR_PARAM_BIND_TYPE: |
| 406 | current_apd_->GetHeaderField(SQL_DESC_BIND_TYPE, output, buffer_size, str_len_ptr); |
| 407 | if (output) { |
| 408 | // Convert SQLINTEGER output to SQLULEN, since SQL_DESC_BIND_TYPE is SQLINTEGER |
| 409 | // and SQL_ATTR_PARAM_BIND_TYPE is SQLULEN |
| 410 | SQLINTEGER* output_int_ptr = reinterpret_cast<SQLINTEGER*>(output); |
| 411 | SQLINTEGER output_int = *output_int_ptr; |
| 412 | SQLULEN* typed_output = reinterpret_cast<SQLULEN*>(output); |
| 413 | *typed_output = static_cast<SQLULEN>(output_int); |
| 414 | } |
| 415 | return; |
| 416 | case SQL_ATTR_PARAM_OPERATION_PTR: |
| 417 | current_apd_->GetHeaderField(SQL_DESC_ARRAY_STATUS_PTR, output, buffer_size, |
| 418 | str_len_ptr); |
| 419 | return; |
| 420 | case SQL_ATTR_PARAM_STATUS_PTR: |
| 421 | ipd_->GetHeaderField(SQL_DESC_ARRAY_STATUS_PTR, output, buffer_size, str_len_ptr); |
| 422 | return; |
| 423 | case SQL_ATTR_PARAMS_PROCESSED_PTR: |
| 424 | ipd_->GetHeaderField(SQL_DESC_ROWS_PROCESSED_PTR, output, buffer_size, str_len_ptr); |
| 425 | return; |
| 426 | case SQL_ATTR_PARAMSET_SIZE: |
| 427 | current_apd_->GetHeaderField(SQL_DESC_ARRAY_SIZE, output, buffer_size, str_len_ptr); |
| 428 | return; |
| 429 | case SQL_ATTR_ROW_ARRAY_SIZE: |
| 430 | current_ard_->GetHeaderField(SQL_DESC_ARRAY_SIZE, output, buffer_size, str_len_ptr); |
| 431 | return; |
| 432 | case SQL_ATTR_ROW_BIND_OFFSET_PTR: |
| 433 | current_ard_->GetHeaderField(SQL_DESC_BIND_OFFSET_PTR, output, buffer_size, |
| 434 | str_len_ptr); |
| 435 | return; |
| 436 | case SQL_ATTR_ROW_BIND_TYPE: |
| 437 | current_ard_->GetHeaderField(SQL_DESC_BIND_TYPE, output, buffer_size, str_len_ptr); |
| 438 | if (output) { |
no test coverage detected