| 735 | } |
| 736 | |
| 737 | SQLRETURN SQLSetEnvAttr(SQLHENV env, SQLINTEGER attr, SQLPOINTER value_ptr, |
| 738 | SQLINTEGER str_len) { |
| 739 | ARROW_LOG(DEBUG) << "SQLSetEnvAttr called with env: " << env << ", attr: " << attr |
| 740 | << ", value_ptr: " << value_ptr << ", str_len: " << str_len; |
| 741 | |
| 742 | using ODBC::ODBCEnvironment; |
| 743 | |
| 744 | ODBCEnvironment* environment = reinterpret_cast<ODBCEnvironment*>(env); |
| 745 | |
| 746 | return ODBCEnvironment::ExecuteWithDiagnostics(environment, SQL_ERROR, [=]() { |
| 747 | if (!value_ptr) { |
| 748 | throw DriverException("Invalid null pointer for attribute.", "HY024"); |
| 749 | } |
| 750 | |
| 751 | switch (attr) { |
| 752 | case SQL_ATTR_ODBC_VERSION: { |
| 753 | SQLINTEGER version = |
| 754 | static_cast<SQLINTEGER>(reinterpret_cast<intptr_t>(value_ptr)); |
| 755 | if (version == SQL_OV_ODBC2 || version == SQL_OV_ODBC3) { |
| 756 | environment->SetODBCVersion(version); |
| 757 | |
| 758 | return SQL_SUCCESS; |
| 759 | } else { |
| 760 | throw DriverException("Invalid value for attribute", "HY024"); |
| 761 | } |
| 762 | } |
| 763 | |
| 764 | case SQL_ATTR_OUTPUT_NTS: { |
| 765 | // output nts can not be set to SQL_FALSE, is always SQL_TRUE |
| 766 | SQLINTEGER value = static_cast<SQLINTEGER>(reinterpret_cast<intptr_t>(value_ptr)); |
| 767 | if (value == SQL_TRUE) { |
| 768 | return SQL_SUCCESS; |
| 769 | } else { |
| 770 | throw DriverException("Invalid value for attribute", "HY024"); |
| 771 | } |
| 772 | } |
| 773 | |
| 774 | case SQL_ATTR_CONNECTION_POOLING: { |
| 775 | throw DriverException("Optional feature not supported.", "HYC00"); |
| 776 | } |
| 777 | |
| 778 | default: { |
| 779 | throw DriverException("Invalid attribute", "HY092"); |
| 780 | } |
| 781 | } |
| 782 | }); |
| 783 | } |
| 784 | |
| 785 | SQLRETURN SQLGetConnectAttr(SQLHDBC conn, SQLINTEGER attribute, SQLPOINTER value_ptr, |
| 786 | SQLINTEGER buffer_length, SQLINTEGER* string_length_ptr) { |