| 578 | } |
| 579 | |
| 580 | SQLRETURN SQLGetDiagRec(SQLSMALLINT handle_type, SQLHANDLE handle, SQLSMALLINT rec_number, |
| 581 | SQLWCHAR* sql_state, SQLINTEGER* native_error_ptr, |
| 582 | SQLWCHAR* message_text, SQLSMALLINT buffer_length, |
| 583 | SQLSMALLINT* text_length_ptr) { |
| 584 | ARROW_LOG(DEBUG) << "SQLGetDiagRecW called with handle_type: " << handle_type |
| 585 | << ", handle: " << handle << ", rec_number: " << rec_number |
| 586 | << ", sql_state: " << static_cast<const void*>(sql_state) |
| 587 | << ", native_error_ptr: " << static_cast<const void*>(native_error_ptr) |
| 588 | << ", message_text: " << static_cast<const void*>(message_text) |
| 589 | << ", buffer_length: " << buffer_length |
| 590 | << ", text_length_ptr: " << static_cast<const void*>(text_length_ptr); |
| 591 | using arrow::flight::sql::odbc::Diagnostics; |
| 592 | using ODBC::GetStringAttribute; |
| 593 | using ODBC::ODBCConnection; |
| 594 | using ODBC::ODBCDescriptor; |
| 595 | using ODBC::ODBCEnvironment; |
| 596 | using ODBC::ODBCStatement; |
| 597 | |
| 598 | if (!handle) { |
| 599 | return SQL_INVALID_HANDLE; |
| 600 | } |
| 601 | |
| 602 | // Record number must be greater or equal to 1 |
| 603 | if (rec_number < 1 || buffer_length < 0) { |
| 604 | return SQL_ERROR; |
| 605 | } |
| 606 | |
| 607 | // Set character type to be Unicode by default |
| 608 | const bool is_unicode = true; |
| 609 | Diagnostics* diagnostics = nullptr; |
| 610 | |
| 611 | switch (handle_type) { |
| 612 | case SQL_HANDLE_ENV: { |
| 613 | auto* environment = ODBCEnvironment::Of(handle); |
| 614 | diagnostics = &environment->GetDiagnostics(); |
| 615 | break; |
| 616 | } |
| 617 | |
| 618 | case SQL_HANDLE_DBC: { |
| 619 | auto* connection = ODBCConnection::Of(handle); |
| 620 | diagnostics = &connection->GetDiagnostics(); |
| 621 | break; |
| 622 | } |
| 623 | |
| 624 | case SQL_HANDLE_DESC: { |
| 625 | auto* descriptor = ODBCDescriptor::Of(handle); |
| 626 | diagnostics = &descriptor->GetDiagnostics(); |
| 627 | break; |
| 628 | } |
| 629 | |
| 630 | case SQL_HANDLE_STMT: { |
| 631 | auto* statement = ODBCStatement::Of(handle); |
| 632 | diagnostics = &statement->GetDiagnostics(); |
| 633 | break; |
| 634 | } |
| 635 | |
| 636 | default: |
| 637 | return SQL_INVALID_HANDLE; |