From 2d65421bada05820e9b223d36f392891867967d9 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Fri, 28 Nov 2025 15:15:52 -0800 Subject: [PATCH 1/4] Enable ODBC installer build in ODBC Workflow Minor fix for DSN Window So ODBC installed by installer works as intended Change Arrow odbc component name to `arrow_flight_sql_odbc` Add component name for `ARROW_BUILD_UTILITIES` * change component name for Flight SQL ODBC to be more consistent Use targets instead of hard-coded dll regex Add `RUNTIME ` removes `.lib` file Clean up Attempt to fix CI ODBC msi Add debug message for odbc bin install path Add ODBC Installer definitions Move path for Windows install files Extract ODBC installer Need to add `component` to other parts to be able to select the ODBC components Add product ID to Windows installer With stable product and upgrade id, Windows will be able to properly recognize ODBC installer as the same product, and prevent double-installation from happening. Update README Co-Authored-By: vic-tsang Co-Authored-By: alinalibq --- .github/workflows/cpp_extra.yml | 20 +++- .gitignore | 3 + ci/scripts/cpp_build.sh | 2 + cpp/CMakeLists.txt | 8 +- cpp/CMakePresets.json | 1 + cpp/cmake_modules/BuildUtils.cmake | 17 +++- cpp/cmake_modules/DefineOptions.cmake | 6 ++ cpp/cmake_modules/ThirdpartyToolchain.cmake | 13 ++- cpp/src/arrow/CMakeLists.txt | 13 ++- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 90 +++++++++++++++++- cpp/src/arrow/flight/sql/odbc/README | 63 ++++++++++++ .../windows/arrow-flight-sql-odbc-patch.xml | 22 +++++ .../install/windows/arrow-flight-sql-odbc.wxs | 37 +++++++ .../odbc/install/windows/arrow-wix-banner.bmp | Bin 0 -> 29930 bytes .../odbc/install/windows/versioninfo.rc.in | 54 +++++++++++ .../odbc/odbc_impl/config/configuration.cc | 4 +- .../sql/odbc/odbc_impl/config/configuration.h | 2 +- cpp/src/arrow/ipc/CMakeLists.txt | 3 +- cpp/tools/parquet/CMakeLists.txt | 2 +- 19 files changed, 337 insertions(+), 23 deletions(-) create mode 100644 cpp/src/arrow/flight/sql/odbc/README create mode 100644 cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc-patch.xml create mode 100644 cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs create mode 100644 cpp/src/arrow/flight/sql/odbc/install/windows/arrow-wix-banner.bmp create mode 100644 cpp/src/arrow/flight/sql/odbc/install/windows/versioninfo.rc.in diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index 612175e60f6..5dce7e979ba 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -346,6 +346,7 @@ jobs: ARROW_BUILD_TYPE: release ARROW_DEPENDENCY_SOURCE: VCPKG ARROW_FLIGHT_SQL_ODBC: ON + ARROW_FLIGHT_SQL_ODBC_INSTALLER: ON ARROW_SIMD_LEVEL: AVX2 CMAKE_GENERATOR: Ninja CMAKE_INSTALL_PREFIX: /usr @@ -433,7 +434,24 @@ jobs: # GH-48269 TODO: Enable Flight & Flight SQL testing in MSVC CI # GH-48547 TODO: enable ODBC tests after GH-48270 and GH-48269 are resolved. - # GH-47787 TODO: Build ODBC installer + - name: Install WiX Toolset + shell: pwsh + run: | + Invoke-WebRequest -Uri https://github.com/wixtoolset/wix/releases/download/v6.0.0/wix-cli-x64.msi -OutFile wix-cli-x64.msi + Start-Process -FilePath wix-cli-x64.msi -ArgumentList '/quiet', 'Include_freethreaded=1' -Wait + echo "C:\Program Files\WiX Toolset v6.0\bin\" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + - name: Build MSI ODBC installer + shell: pwsh + run: | + # Verify WiX version + wix --version + cd "${{ github.workspace }}\build\cpp" + cpack + - name: Upload the artifacts to the job + uses: actions/upload-artifact@v6 + with: + name: flight-sql-odbc-msi-installer + path: ${{ github.workspace }}\build\cpp\Apache Arrow Flight SQL ODBC-1.0.0-win64.msi report-extra-cpp: if: github.event_name == 'schedule' && always() diff --git a/.gitignore b/.gitignore index 8354aa8f816..9f0d37a756f 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,6 @@ java/.mvn/.develocity/ # rat filtered_rat.txt rat.txt + +# rc +*.rc diff --git a/ci/scripts/cpp_build.sh b/ci/scripts/cpp_build.sh index 904b5cccb42..79b64dbc2a4 100755 --- a/ci/scripts/cpp_build.sh +++ b/ci/scripts/cpp_build.sh @@ -65,6 +65,7 @@ if [ "${ARROW_ENABLE_THREADING:-ON}" = "OFF" ]; then ARROW_FLIGHT=OFF ARROW_FLIGHT_SQL=OFF ARROW_FLIGHT_SQL_ODBC=OFF + ARROW_FLIGHT_SQL_ODBC_INSTALLER=OFF ARROW_GCS=OFF ARROW_JEMALLOC=OFF ARROW_MIMALLOC=OFF @@ -213,6 +214,7 @@ else -DARROW_FLIGHT=${ARROW_FLIGHT:-OFF} \ -DARROW_FLIGHT_SQL=${ARROW_FLIGHT_SQL:-OFF} \ -DARROW_FLIGHT_SQL_ODBC=${ARROW_FLIGHT_SQL_ODBC:-OFF} \ + -DARROW_FLIGHT_SQL_ODBC_INSTALLER=${ARROW_FLIGHT_SQL_ODBC_INSTALLER:-OFF} \ -DARROW_FUZZING=${ARROW_FUZZING:-OFF} \ -DARROW_GANDIVA_PC_CXX_FLAGS=${ARROW_GANDIVA_PC_CXX_FLAGS:-} \ -DARROW_GANDIVA=${ARROW_GANDIVA:-OFF} \ diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 5b260c0eb68..bc365b0cefe 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -720,9 +720,13 @@ endif() install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE.txt ${CMAKE_CURRENT_SOURCE_DIR}/../NOTICE.txt - ${CMAKE_CURRENT_SOURCE_DIR}/README.md DESTINATION "${ARROW_DOC_DIR}") + ${CMAKE_CURRENT_SOURCE_DIR}/README.md + DESTINATION "${ARROW_DOC_DIR}" + COMPONENT arrow_doc) -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gdb_arrow.py DESTINATION "${ARROW_GDB_DIR}") +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gdb_arrow.py + DESTINATION "${ARROW_GDB_DIR}" + COMPONENT arrow_gdb) # # Validate and print out Arrow configuration options diff --git a/cpp/CMakePresets.json b/cpp/CMakePresets.json index e6c2e7e43a6..e2904db0de6 100644 --- a/cpp/CMakePresets.json +++ b/cpp/CMakePresets.json @@ -180,6 +180,7 @@ "ARROW_BUILD_EXAMPLES": "ON", "ARROW_BUILD_UTILITIES": "ON", "ARROW_FLIGHT_SQL_ODBC": "ON", + "ARROW_FLIGHT_SQL_ODBC_INSTALLER": "ON", "ARROW_TENSORFLOW": "ON", "PARQUET_BUILD_EXAMPLES": "ON", "PARQUET_BUILD_EXECUTABLES": "ON" diff --git a/cpp/cmake_modules/BuildUtils.cmake b/cpp/cmake_modules/BuildUtils.cmake index db760400f7c..d66547315b0 100644 --- a/cpp/cmake_modules/BuildUtils.cmake +++ b/cpp/cmake_modules/BuildUtils.cmake @@ -178,10 +178,12 @@ function(arrow_install_cmake_package PACKAGE_NAME EXPORT_NAME) write_basic_package_version_file("${BUILT_CONFIG_VERSION_CMAKE}" COMPATIBILITY SameMajorVersion) install(FILES "${BUILT_CONFIG_CMAKE}" "${BUILT_CONFIG_VERSION_CMAKE}" - DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}") + DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}" + COMPONENT ${EXPORT_NAME}_config_cmake_files) set(TARGETS_CMAKE "${PACKAGE_NAME}Targets.cmake") install(EXPORT ${EXPORT_NAME} DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}" + COMPONENT ${EXPORT_NAME}_target_export NAMESPACE "${PACKAGE_NAME}::" FILE "${TARGETS_CMAKE}") endfunction() @@ -403,8 +405,11 @@ function(ADD_ARROW_LIB LIB_NAME) install(TARGETS ${LIB_NAME}_shared ${INSTALL_IS_OPTIONAL} EXPORT ${LIB_NAME}_targets ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR} + COMPONENT ${LIB_NAME}_shared_archive LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR} + COMPONENT ${LIB_NAME}_shared_library RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} + COMPONENT ${LIB_NAME}_shared_runtime INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() @@ -471,8 +476,11 @@ function(ADD_ARROW_LIB LIB_NAME) install(TARGETS ${LIB_NAME}_static ${INSTALL_IS_OPTIONAL} EXPORT ${LIB_NAME}_targets ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR} + COMPONENT ${LIB_NAME}_static_library LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR} + COMPONENT ${LIB_NAME}_static_library RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} + COMPONENT ${LIB_NAME}_static_library INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() @@ -934,7 +942,9 @@ function(ARROW_INSTALL_ALL_HEADERS PATH) endif() list(APPEND PUBLIC_HEADERS ${HEADER}) endforeach() - install(FILES ${PUBLIC_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PATH}") + install(FILES ${PUBLIC_HEADERS} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PATH}" + COMPONENT ${HEADER}_header) endfunction() function(ARROW_ADD_PKG_CONFIG MODULE) @@ -944,7 +954,8 @@ function(ARROW_ADD_PKG_CONFIG MODULE) OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$/${MODULE}.pc" INPUT "${CMAKE_CURRENT_BINARY_DIR}/${MODULE}.pc.generate.in") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$/${MODULE}.pc" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/") + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/" + COMPONENT ${MODULE}_pkg_config) endfunction() # Implementations of lisp "car" and "cdr" functions diff --git a/cpp/cmake_modules/DefineOptions.cmake b/cpp/cmake_modules/DefineOptions.cmake index 0f6674c7143..2e5e3b60662 100644 --- a/cpp/cmake_modules/DefineOptions.cmake +++ b/cpp/cmake_modules/DefineOptions.cmake @@ -347,6 +347,12 @@ takes precedence over ccache if a storage backend is configured" ON) ARROW_FLIGHT_SQL ARROW_COMPUTE) + define_option(ARROW_FLIGHT_SQL_ODBC_INSTALLER + "Build the Arrow Flight SQL ODBC installer" + OFF + DEPENDS + ARROW_FLIGHT_SQL_ODBC) + define_option(ARROW_GANDIVA "Build the Gandiva libraries" OFF diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 42fa5e34b3c..16a71880685 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -236,7 +236,8 @@ function(provide_cmake_module MODULE_NAME ARROW_CMAKE_PACKAGE_NAME) message(STATUS "Providing CMake module for ${MODULE_NAME} as part of ${ARROW_CMAKE_PACKAGE_NAME} CMake package" ) install(FILES "${module}" - DESTINATION "${ARROW_CMAKE_DIR}/${ARROW_CMAKE_PACKAGE_NAME}") + DESTINATION "${ARROW_CMAKE_DIR}/${ARROW_CMAKE_PACKAGE_NAME}" + COMPONENT ${MODULE_NAME}_module) endif() endfunction() @@ -2445,20 +2446,22 @@ function(build_gtest) endforeach() install(DIRECTORY "${googletest_SOURCE_DIR}/googlemock/include/" "${googletest_SOURCE_DIR}/googletest/include/" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + COMPONENT gtest_dir) add_library(arrow::GTest::gtest_headers INTERFACE IMPORTED) target_include_directories(arrow::GTest::gtest_headers INTERFACE "${googletest_SOURCE_DIR}/googlemock/include/" "${googletest_SOURCE_DIR}/googletest/include/") install(TARGETS gmock gmock_main gtest gtest_main EXPORT arrow_testing_targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT gtest_runtime + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT gtest_archive + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT gtest_library) if(MSVC) install(FILES $ $ $ $ DESTINATION "${CMAKE_INSTALL_BINDIR}" + COMPONENT gtest_pdb OPTIONAL) endif() add_library(arrow::GTest::gmock ALIAS gmock) diff --git a/cpp/src/arrow/CMakeLists.txt b/cpp/src/arrow/CMakeLists.txt index df9b783d531..36350794bdd 100644 --- a/cpp/src/arrow/CMakeLists.txt +++ b/cpp/src/arrow/CMakeLists.txt @@ -349,7 +349,8 @@ string(REPLACE "${CMAKE_BINARY_DIR}" "" REDACTED_CXX_FLAGS configure_file("util/config.h.cmake" "util/config.h" ESCAPE_QUOTES) configure_file("util/config_internal.h.cmake" "util/config_internal.h" ESCAPE_QUOTES) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/util/config.h" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/util") + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/util" + COMPONENT arrow_config) set(ARROW_SRCS builder.cc @@ -1051,7 +1052,8 @@ if(ARROW_BUILD_BUNDLED_DEPENDENCIES) get_target_property(arrow_bundled_dependencies_path arrow_bundled_dependencies IMPORTED_LOCATION) install(FILES ${arrow_bundled_dependencies_path} ${INSTALL_IS_OPTIONAL} - DESTINATION ${CMAKE_INSTALL_LIBDIR}) + DESTINATION ${CMAKE_INSTALL_LIBDIR} + COMPONENT arrow_bundled_dependencies) string(PREPEND ARROW_PC_LIBS_PRIVATE " -larrow_bundled_dependencies") list(INSERT ARROW_STATIC_INSTALL_INTERFACE_LIBS 0 "Arrow::arrow_bundled_dependencies") endif() @@ -1168,6 +1170,7 @@ if(ARROW_BUILD_SHARED AND NOT WIN32) if(ARROW_GDB_AUTO_LOAD_LIBARROW_GDB_INSTALL) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libarrow_gdb.py" DESTINATION "${ARROW_GDB_AUTO_LOAD_LIBARROW_GDB_DIR}" + COMPONENT arrow_gdb RENAME "$-gdb.py") endif() endif() @@ -1231,11 +1234,13 @@ arrow_install_all_headers("arrow") config_summary_cmake_setters("${CMAKE_CURRENT_BINARY_DIR}/ArrowOptions.cmake") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ArrowOptions.cmake - DESTINATION "${ARROW_CMAKE_DIR}/Arrow") + DESTINATION "${ARROW_CMAKE_DIR}/Arrow" + COMPONENT arrow_options_cmake) # For backward compatibility for find_package(arrow) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/arrow-config.cmake - DESTINATION "${ARROW_CMAKE_DIR}/Arrow") + DESTINATION "${ARROW_CMAKE_DIR}/Arrow" + COMPONENT arrow_config_cmake) # # Unit tests diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index ac18a9bc7cd..4144b3df890 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -19,8 +19,6 @@ # GH-44792: Arrow will switch to C++ 20 set(CMAKE_CXX_STANDARD 20) -add_custom_target(arrow_flight_sql_odbc) - if(WIN32) if(MSVC_VERSION GREATER_EQUAL 1900) set(ODBCINST legacy_stdio_definitions odbccp32 shlwapi) @@ -38,10 +36,28 @@ add_subdirectory(tests) arrow_install_all_headers("arrow/flight/sql/odbc") +# ODBC Release information +set(ODBC_PACKAGE_VERSION_MAJOR "1") +set(ODBC_PACKAGE_VERSION_MINOR "0") +set(ODBC_PACKAGE_VERSION_PATCH "0") +set(ODBC_PACKAGE_NAME "Apache Arrow Flight SQL ODBC") +set(ODBC_PACKAGE_VENDOR "Apache Arrow") + set(ARROW_FLIGHT_SQL_ODBC_SRCS entry_points.cc odbc_api.cc) if(WIN32) - list(APPEND ARROW_FLIGHT_SQL_ODBC_SRCS odbc.def) + set(VER_FILEVERSION + "${ODBC_PACKAGE_VERSION_MAJOR},${ODBC_PACKAGE_VERSION_MINOR},${ODBC_PACKAGE_VERSION_PATCH},0" + ) + set(VER_FILEVERSION_STR + ${ODBC_PACKAGE_VERSION_MAJOR}.${ODBC_PACKAGE_VERSION_MINOR}.${ODBC_PACKAGE_VERSION_PATCH} + ) + set(VER_COMPANYNAME_STR ${ODBC_PACKAGE_VENDOR}) + set(VER_PRODUCTNAME_STR ${ODBC_PACKAGE_NAME}) + + configure_file("install/windows/versioninfo.rc.in" "install/versioninfo.rc" @ONLY) + + list(APPEND ARROW_FLIGHT_SQL_ODBC_SRCS odbc.def install/versioninfo.rc) endif() add_arrow_lib(arrow_flight_sql_odbc @@ -75,3 +91,71 @@ add_arrow_lib(arrow_flight_sql_odbc foreach(LIB_TARGET ${ARROW_FLIGHT_SQL_ODBC_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_FLIGHT_SQL_ODBC_EXPORTING) endforeach() + +# Construct ODBC Windows installer. Only Release installer is supported +if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) + + include(InstallRequiredSystemLibraries) + + set(CPACK_RESOURCE_FILE_LICENSE + "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../LICENSE.txt") + # Tentative version 1.0.0 + set(CPACK_PACKAGE_VERSION_MAJOR ${ODBC_PACKAGE_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${ODBC_PACKAGE_VERSION_MINOR}) + set(CPACK_PACKAGE_VERSION_PATCH ${ODBC_PACKAGE_VERSION_PATCH}) + + set(CPACK_PACKAGE_NAME ${ODBC_PACKAGE_NAME}) + set(CPACK_PACKAGE_VENDOR ${ODBC_PACKAGE_VENDOR}) + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache Arrow Flight SQL ODBC Driver") + set(CPACK_PACKAGE_CONTACT "#GH-47787 TODO arrow maintainers") + + # GH-47876 TODO: set up `arrow_flight_sql_odbc` component for macOS Installer + # GH-47877 TODO: set up `arrow_flight_sql_odbc` component for Linux Installer + if(WIN32) + # Install ODBC and its Arrow dependencies + install(TARGETS arrow_shared + arrow_compute_shared + arrow_flight_shared + arrow_flight_sql_shared + arrow_flight_sql_odbc_shared + RUNTIME_DEPENDENCIES + PRE_EXCLUDE_REGEXES + "api-ms-.*" + "ext-ms-.*" + POST_EXCLUDE_REGEXES + ".*system32/.*\\.dll" + RUNTIME DESTINATION bin COMPONENT arrow_flight_sql_odbc) + + set(CPACK_WIX_EXTRA_SOURCES + "${CMAKE_CURRENT_SOURCE_DIR}/install/windows/arrow-flight-sql-odbc.wxs") + set(CPACK_WIX_PATCH_FILE + "${CMAKE_CURRENT_SOURCE_DIR}/install/windows/arrow-flight-sql-odbc-patch.xml") + + set(CPACK_WIX_UI_BANNER + "${CMAKE_CURRENT_SOURCE_DIR}/install/windows/arrow-wix-banner.bmp") + endif() + + get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS) + set(CPACK_COMPONENTS_ALL Unspecified) + list(APPEND CPACK_COMPONENTS_ALL "arrow_flight_sql_odbc") + + if(WIN32) + # WiX msi installer on Windows + # CPack is compatible with WiX V.5 and V.6 + set(CPACK_GENERATOR "WIX") + set(CPACK_WIX_VERSION 4) + + # Upgrade GUID is required to be unchanged for ODBC installer to upgrade + set(CPACK_WIX_UPGRADE_GUID "DBF27A18-F8BF-423F-9E3A-957414D52C4B") + set(CPACK_WIX_PRODUCT_GUID "279D087B-93B5-4DC3-BA69-BCF485022A26") + endif() + # GH-47876 TODO: create macOS Installer using cpack + # GH-47877 TODO: create Linux Installer using cpack + + # Load CPack after all CPACK* variables are set + include(CPack) + cpack_add_component(arrow_flight_sql_odbc + DISPLAY_NAME "ODBC library" + DESCRIPTION "ODBC library bin, required to install" + REQUIRED) +endif() diff --git a/cpp/src/arrow/flight/sql/odbc/README b/cpp/src/arrow/flight/sql/odbc/README new file mode 100644 index 00000000000..1ba24b3f764 --- /dev/null +++ b/cpp/src/arrow/flight/sql/odbc/README @@ -0,0 +1,63 @@ + + +## Steps to Register the 64-bit Apache Arrow ODBC driver on Windows + +After the build succeeds, the ODBC DLL will be located in +`build\debug\Debug` for a debug build and `build\release\Release` for a release build. + +1. Open Windows Power Shell as administrator. + +2. Register your ODBC DLL: + Need to replace with actual path to repository in the commands. + + i. `cd to repo.` + ii. `cd ` + iii. Run script to register your ODBC DLL as Apache Arrow Flight SQL ODBC Driver + `.\cpp\src\arrow\flight\sql\odbc\tests\install_odbc.cmd \cpp\build\< release | debug >\< Release | Debug>\arrow_flight_sql_odbc.dll` + Example command for reference: + `.\cpp\src\arrow\flight\sql\odbc\tests\install_odbc.cmd C:\path\to\arrow\cpp\build\release\Release\arrow_flight_sql_odbc.dll` + +If the registration is successful, then Apache Arrow Flight SQL ODBC Driver +should show as an available ODBC driver in the x64 ODBC Driver Manager. + +## Steps to Generate Windows Installer +1. Install WiX toolset v6 from [GitHub](https://github.com/wixtoolset/wix/releases/). +2. Build with `ARROW_FLIGHT_SQL_ODBC=ON` and `ARROW_FLIGHT_SQL_ODBC_INSTALLER=ON`. +3. `cd` to `build` folder. +4. Run `cpack`. + +If the generation is successful, you will find `Apache Arrow Flight SQL ODBC--win64.msi` generated under the `build` folder. + + +## Steps to Enable Logging +Arrow Flight SQL ODBC driver uses Arrow's internal logging framework. By default, the log messages are printed to the terminal. +1. Set environment variable `ARROW_ODBC_LOG_LEVEL` to any of the following valid values to enable logging. If `ARROW_ODBC_LOG_LEVEL` is set to a non-empty string that does not match any of the following values, `DEBUG` level is used by default. + +The characters are case-insensitive. +- TRACE +- DEBUG +- INFO +- WARNING +- ERROR +- FATAL + +The Windows ODBC driver currently does not support writing log files. `ARROW_USE_GLOG` is required to write log files, and `ARROW_USE_GLOG` is disabled on Windows platform since plasma using `glog` is not fully tested on windows. + +Note: GH-47670 running more than 1 tests with logging enabled is not fully supported. diff --git a/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc-patch.xml b/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc-patch.xml new file mode 100644 index 00000000000..f1a63ce5d3b --- /dev/null +++ b/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc-patch.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs b/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs new file mode 100644 index 00000000000..6607731efce --- /dev/null +++ b/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-wix-banner.bmp b/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-wix-banner.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0c82036f4ecfc1e8c34fcb7eae56ccd7d9be4731 GIT binary patch literal 29930 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 MS>rLo%F*-teproperties_; } -std::vector Configuration::GetCustomKeys() const { +std::vector Configuration::GetCustomKeys() const { Connection::ConnPropertyMap copy_props(properties_); for (auto& key : FlightSqlConnection::ALL_KEYS) { copy_props.erase(std::string(key)); } - std::vector keys; + std::vector keys; boost::copy(copy_props | boost::adaptors::map_keys, std::back_inserter(keys)); return keys; } diff --git a/cpp/src/arrow/flight/sql/odbc/odbc_impl/config/configuration.h b/cpp/src/arrow/flight/sql/odbc/odbc_impl/config/configuration.h index 0390a57e52f..9b59f346b29 100644 --- a/cpp/src/arrow/flight/sql/odbc/odbc_impl/config/configuration.h +++ b/cpp/src/arrow/flight/sql/odbc/odbc_impl/config/configuration.h @@ -60,7 +60,7 @@ class Configuration { */ const Connection::ConnPropertyMap& GetProperties() const; - std::vector GetCustomKeys() const; + std::vector GetCustomKeys() const; private: Connection::ConnPropertyMap properties_; diff --git a/cpp/src/arrow/ipc/CMakeLists.txt b/cpp/src/arrow/ipc/CMakeLists.txt index 6e73c71d897..0bcb649cb3d 100644 --- a/cpp/src/arrow/ipc/CMakeLists.txt +++ b/cpp/src/arrow/ipc/CMakeLists.txt @@ -59,7 +59,8 @@ if(ARROW_BUILD_UTILITIES OR ARROW_BUILD_INTEGRATION) if(ARROW_BUILD_UTILITIES) install(TARGETS arrow-file-to-stream arrow-stream-to-file ${INSTALL_IS_OPTIONAL} - DESTINATION ${CMAKE_INSTALL_BINDIR}) + DESTINATION ${CMAKE_INSTALL_BINDIR} + COMPONENT arrow_ipc_utilities) endif() if(ARROW_BUILD_INTEGRATION) diff --git a/cpp/tools/parquet/CMakeLists.txt b/cpp/tools/parquet/CMakeLists.txt index 5aaa456dcae..dd479ef561c 100644 --- a/cpp/tools/parquet/CMakeLists.txt +++ b/cpp/tools/parquet/CMakeLists.txt @@ -34,7 +34,7 @@ if(PARQUET_BUILD_EXECUTABLES) # Avoid unsetting RPATH when installing set_target_properties(${TOOL} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) install(TARGETS ${TOOL} ${INSTALL_IS_OPTIONAL} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT parquet_${TOOL}) endforeach(TOOL) add_dependencies(parquet ${PARQUET_TOOLS}) From 6731c9cbe548880da4cd8bc738767a4ee9cf667e Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Tue, 6 Jan 2026 14:11:01 -0800 Subject: [PATCH 2/4] Apply David's suggestion --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9f0d37a756f..12f12df3aa6 100644 --- a/.gitignore +++ b/.gitignore @@ -108,5 +108,5 @@ java/.mvn/.develocity/ filtered_rat.txt rat.txt -# rc +# for ODBC DLL *.rc From 19a72c291b36cd32016a54d92dcf41ba4587d4f0 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Tue, 6 Jan 2026 15:32:55 -0800 Subject: [PATCH 3/4] Remove unneeded component code --- cpp/CMakeLists.txt | 8 ++------ cpp/cmake_modules/BuildUtils.cmake | 17 +++-------------- cpp/cmake_modules/DefineOptions.cmake | 6 ------ cpp/cmake_modules/ThirdpartyToolchain.cmake | 13 +++++-------- cpp/src/arrow/CMakeLists.txt | 13 ++++--------- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 6 ++++-- cpp/src/arrow/ipc/CMakeLists.txt | 3 +-- cpp/tools/parquet/CMakeLists.txt | 2 +- 8 files changed, 20 insertions(+), 48 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index bc365b0cefe..5b260c0eb68 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -720,13 +720,9 @@ endif() install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE.txt ${CMAKE_CURRENT_SOURCE_DIR}/../NOTICE.txt - ${CMAKE_CURRENT_SOURCE_DIR}/README.md - DESTINATION "${ARROW_DOC_DIR}" - COMPONENT arrow_doc) + ${CMAKE_CURRENT_SOURCE_DIR}/README.md DESTINATION "${ARROW_DOC_DIR}") -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gdb_arrow.py - DESTINATION "${ARROW_GDB_DIR}" - COMPONENT arrow_gdb) +install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gdb_arrow.py DESTINATION "${ARROW_GDB_DIR}") # # Validate and print out Arrow configuration options diff --git a/cpp/cmake_modules/BuildUtils.cmake b/cpp/cmake_modules/BuildUtils.cmake index d66547315b0..db760400f7c 100644 --- a/cpp/cmake_modules/BuildUtils.cmake +++ b/cpp/cmake_modules/BuildUtils.cmake @@ -178,12 +178,10 @@ function(arrow_install_cmake_package PACKAGE_NAME EXPORT_NAME) write_basic_package_version_file("${BUILT_CONFIG_VERSION_CMAKE}" COMPATIBILITY SameMajorVersion) install(FILES "${BUILT_CONFIG_CMAKE}" "${BUILT_CONFIG_VERSION_CMAKE}" - DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}" - COMPONENT ${EXPORT_NAME}_config_cmake_files) + DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}") set(TARGETS_CMAKE "${PACKAGE_NAME}Targets.cmake") install(EXPORT ${EXPORT_NAME} DESTINATION "${ARROW_CMAKE_DIR}/${PACKAGE_NAME}" - COMPONENT ${EXPORT_NAME}_target_export NAMESPACE "${PACKAGE_NAME}::" FILE "${TARGETS_CMAKE}") endfunction() @@ -405,11 +403,8 @@ function(ADD_ARROW_LIB LIB_NAME) install(TARGETS ${LIB_NAME}_shared ${INSTALL_IS_OPTIONAL} EXPORT ${LIB_NAME}_targets ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR} - COMPONENT ${LIB_NAME}_shared_archive LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR} - COMPONENT ${LIB_NAME}_shared_library RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} - COMPONENT ${LIB_NAME}_shared_runtime INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() @@ -476,11 +471,8 @@ function(ADD_ARROW_LIB LIB_NAME) install(TARGETS ${LIB_NAME}_static ${INSTALL_IS_OPTIONAL} EXPORT ${LIB_NAME}_targets ARCHIVE DESTINATION ${INSTALL_ARCHIVE_DIR} - COMPONENT ${LIB_NAME}_static_library LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR} - COMPONENT ${LIB_NAME}_static_library RUNTIME DESTINATION ${INSTALL_RUNTIME_DIR} - COMPONENT ${LIB_NAME}_static_library INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() @@ -942,9 +934,7 @@ function(ARROW_INSTALL_ALL_HEADERS PATH) endif() list(APPEND PUBLIC_HEADERS ${HEADER}) endforeach() - install(FILES ${PUBLIC_HEADERS} - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PATH}" - COMPONENT ${HEADER}_header) + install(FILES ${PUBLIC_HEADERS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PATH}") endfunction() function(ARROW_ADD_PKG_CONFIG MODULE) @@ -954,8 +944,7 @@ function(ARROW_ADD_PKG_CONFIG MODULE) OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/$/${MODULE}.pc" INPUT "${CMAKE_CURRENT_BINARY_DIR}/${MODULE}.pc.generate.in") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/$/${MODULE}.pc" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/" - COMPONENT ${MODULE}_pkg_config) + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/") endfunction() # Implementations of lisp "car" and "cdr" functions diff --git a/cpp/cmake_modules/DefineOptions.cmake b/cpp/cmake_modules/DefineOptions.cmake index 2e5e3b60662..0f6674c7143 100644 --- a/cpp/cmake_modules/DefineOptions.cmake +++ b/cpp/cmake_modules/DefineOptions.cmake @@ -347,12 +347,6 @@ takes precedence over ccache if a storage backend is configured" ON) ARROW_FLIGHT_SQL ARROW_COMPUTE) - define_option(ARROW_FLIGHT_SQL_ODBC_INSTALLER - "Build the Arrow Flight SQL ODBC installer" - OFF - DEPENDS - ARROW_FLIGHT_SQL_ODBC) - define_option(ARROW_GANDIVA "Build the Gandiva libraries" OFF diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 16a71880685..42fa5e34b3c 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -236,8 +236,7 @@ function(provide_cmake_module MODULE_NAME ARROW_CMAKE_PACKAGE_NAME) message(STATUS "Providing CMake module for ${MODULE_NAME} as part of ${ARROW_CMAKE_PACKAGE_NAME} CMake package" ) install(FILES "${module}" - DESTINATION "${ARROW_CMAKE_DIR}/${ARROW_CMAKE_PACKAGE_NAME}" - COMPONENT ${MODULE_NAME}_module) + DESTINATION "${ARROW_CMAKE_DIR}/${ARROW_CMAKE_PACKAGE_NAME}") endif() endfunction() @@ -2446,22 +2445,20 @@ function(build_gtest) endforeach() install(DIRECTORY "${googletest_SOURCE_DIR}/googlemock/include/" "${googletest_SOURCE_DIR}/googletest/include/" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - COMPONENT gtest_dir) + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") add_library(arrow::GTest::gtest_headers INTERFACE IMPORTED) target_include_directories(arrow::GTest::gtest_headers INTERFACE "${googletest_SOURCE_DIR}/googlemock/include/" "${googletest_SOURCE_DIR}/googletest/include/") install(TARGETS gmock gmock_main gtest gtest_main EXPORT arrow_testing_targets - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT gtest_runtime - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT gtest_archive - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT gtest_library) + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}") if(MSVC) install(FILES $ $ $ $ DESTINATION "${CMAKE_INSTALL_BINDIR}" - COMPONENT gtest_pdb OPTIONAL) endif() add_library(arrow::GTest::gmock ALIAS gmock) diff --git a/cpp/src/arrow/CMakeLists.txt b/cpp/src/arrow/CMakeLists.txt index 36350794bdd..df9b783d531 100644 --- a/cpp/src/arrow/CMakeLists.txt +++ b/cpp/src/arrow/CMakeLists.txt @@ -349,8 +349,7 @@ string(REPLACE "${CMAKE_BINARY_DIR}" "" REDACTED_CXX_FLAGS configure_file("util/config.h.cmake" "util/config.h" ESCAPE_QUOTES) configure_file("util/config_internal.h.cmake" "util/config_internal.h" ESCAPE_QUOTES) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/util/config.h" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/util" - COMPONENT arrow_config) + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/util") set(ARROW_SRCS builder.cc @@ -1052,8 +1051,7 @@ if(ARROW_BUILD_BUNDLED_DEPENDENCIES) get_target_property(arrow_bundled_dependencies_path arrow_bundled_dependencies IMPORTED_LOCATION) install(FILES ${arrow_bundled_dependencies_path} ${INSTALL_IS_OPTIONAL} - DESTINATION ${CMAKE_INSTALL_LIBDIR} - COMPONENT arrow_bundled_dependencies) + DESTINATION ${CMAKE_INSTALL_LIBDIR}) string(PREPEND ARROW_PC_LIBS_PRIVATE " -larrow_bundled_dependencies") list(INSERT ARROW_STATIC_INSTALL_INTERFACE_LIBS 0 "Arrow::arrow_bundled_dependencies") endif() @@ -1170,7 +1168,6 @@ if(ARROW_BUILD_SHARED AND NOT WIN32) if(ARROW_GDB_AUTO_LOAD_LIBARROW_GDB_INSTALL) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libarrow_gdb.py" DESTINATION "${ARROW_GDB_AUTO_LOAD_LIBARROW_GDB_DIR}" - COMPONENT arrow_gdb RENAME "$-gdb.py") endif() endif() @@ -1234,13 +1231,11 @@ arrow_install_all_headers("arrow") config_summary_cmake_setters("${CMAKE_CURRENT_BINARY_DIR}/ArrowOptions.cmake") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ArrowOptions.cmake - DESTINATION "${ARROW_CMAKE_DIR}/Arrow" - COMPONENT arrow_options_cmake) + DESTINATION "${ARROW_CMAKE_DIR}/Arrow") # For backward compatibility for find_package(arrow) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/arrow-config.cmake - DESTINATION "${ARROW_CMAKE_DIR}/Arrow" - COMPONENT arrow_config_cmake) + DESTINATION "${ARROW_CMAKE_DIR}/Arrow") # # Unit tests diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index 4144b3df890..ce2a2325c28 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -113,6 +113,9 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) # GH-47877 TODO: set up `arrow_flight_sql_odbc` component for Linux Installer if(WIN32) # Install ODBC and its Arrow dependencies + install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} + DESTINATION bin + COMPONENT arrow_flight_sql_odbc) install(TARGETS arrow_shared arrow_compute_shared arrow_flight_shared @@ -136,8 +139,7 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) endif() get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS) - set(CPACK_COMPONENTS_ALL Unspecified) - list(APPEND CPACK_COMPONENTS_ALL "arrow_flight_sql_odbc") + set(CPACK_COMPONENTS_ALL "arrow_flight_sql_odbc") if(WIN32) # WiX msi installer on Windows diff --git a/cpp/src/arrow/ipc/CMakeLists.txt b/cpp/src/arrow/ipc/CMakeLists.txt index 0bcb649cb3d..6e73c71d897 100644 --- a/cpp/src/arrow/ipc/CMakeLists.txt +++ b/cpp/src/arrow/ipc/CMakeLists.txt @@ -59,8 +59,7 @@ if(ARROW_BUILD_UTILITIES OR ARROW_BUILD_INTEGRATION) if(ARROW_BUILD_UTILITIES) install(TARGETS arrow-file-to-stream arrow-stream-to-file ${INSTALL_IS_OPTIONAL} - DESTINATION ${CMAKE_INSTALL_BINDIR} - COMPONENT arrow_ipc_utilities) + DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() if(ARROW_BUILD_INTEGRATION) diff --git a/cpp/tools/parquet/CMakeLists.txt b/cpp/tools/parquet/CMakeLists.txt index dd479ef561c..5aaa456dcae 100644 --- a/cpp/tools/parquet/CMakeLists.txt +++ b/cpp/tools/parquet/CMakeLists.txt @@ -34,7 +34,7 @@ if(PARQUET_BUILD_EXECUTABLES) # Avoid unsetting RPATH when installing set_target_properties(${TOOL} PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE) install(TARGETS ${TOOL} ${INSTALL_IS_OPTIONAL} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT parquet_${TOOL}) + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endforeach(TOOL) add_dependencies(parquet ${PARQUET_TOOLS}) From 4a2c6607fc7270d8f5de18d63b30275708dee8c5 Mon Sep 17 00:00:00 2001 From: "Alina (Xi) Li" Date: Wed, 7 Jan 2026 14:26:18 -0800 Subject: [PATCH 4/4] Work on Kou's comments - Simplify CI - Update installer files - Update README.md Change to `README.md` --- .github/workflows/cpp_extra.yml | 5 +++-- cpp/src/arrow/flight/sql/odbc/CMakeLists.txt | 15 +++++++------- .../flight/sql/odbc/{README => README.md} | 20 +++++++++++-------- .../install/windows/arrow-flight-sql-odbc.wxs | 2 +- 4 files changed, 24 insertions(+), 18 deletions(-) rename cpp/src/arrow/flight/sql/odbc/{README => README.md} (81%) diff --git a/.github/workflows/cpp_extra.yml b/.github/workflows/cpp_extra.yml index 5dce7e979ba..8a2159062b0 100644 --- a/.github/workflows/cpp_extra.yml +++ b/.github/workflows/cpp_extra.yml @@ -445,13 +445,14 @@ jobs: run: | # Verify WiX version wix --version - cd "${{ github.workspace }}\build\cpp" + cd build/cpp cpack - name: Upload the artifacts to the job uses: actions/upload-artifact@v6 with: name: flight-sql-odbc-msi-installer - path: ${{ github.workspace }}\build\cpp\Apache Arrow Flight SQL ODBC-1.0.0-win64.msi + path: build/cpp/Apache Arrow Flight SQL ODBC-*-win64.msi + if-no-files-found: error report-extra-cpp: if: github.event_name == 'schedule' && always() diff --git a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt index ce2a2325c28..c18a8e5de95 100644 --- a/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt +++ b/cpp/src/arrow/flight/sql/odbc/CMakeLists.txt @@ -37,11 +37,12 @@ add_subdirectory(tests) arrow_install_all_headers("arrow/flight/sql/odbc") # ODBC Release information -set(ODBC_PACKAGE_VERSION_MAJOR "1") -set(ODBC_PACKAGE_VERSION_MINOR "0") -set(ODBC_PACKAGE_VERSION_PATCH "0") +# Flight SQL ODBC version uses Arrow version +set(ODBC_PACKAGE_VERSION_MAJOR "${arrow_VERSION_MAJOR}") +set(ODBC_PACKAGE_VERSION_MINOR "${arrow_VERSION_MINOR}") +set(ODBC_PACKAGE_VERSION_PATCH "${arrow_VERSION_PATCH}") set(ODBC_PACKAGE_NAME "Apache Arrow Flight SQL ODBC") -set(ODBC_PACKAGE_VENDOR "Apache Arrow") +set(ODBC_PACKAGE_VENDOR "Apache Software Foundation") set(ARROW_FLIGHT_SQL_ODBC_SRCS entry_points.cc odbc_api.cc) @@ -99,7 +100,7 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../LICENSE.txt") - # Tentative version 1.0.0 + set(CPACK_PACKAGE_VERSION_MAJOR ${ODBC_PACKAGE_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${ODBC_PACKAGE_VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${ODBC_PACKAGE_VERSION_PATCH}) @@ -107,7 +108,7 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) set(CPACK_PACKAGE_NAME ${ODBC_PACKAGE_NAME}) set(CPACK_PACKAGE_VENDOR ${ODBC_PACKAGE_VENDOR}) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache Arrow Flight SQL ODBC Driver") - set(CPACK_PACKAGE_CONTACT "#GH-47787 TODO arrow maintainers") + set(CPACK_PACKAGE_CONTACT "dev@arrow.apache.org") # GH-47876 TODO: set up `arrow_flight_sql_odbc` component for macOS Installer # GH-47877 TODO: set up `arrow_flight_sql_odbc` component for Linux Installer @@ -158,6 +159,6 @@ if(ARROW_FLIGHT_SQL_ODBC_INSTALLER) include(CPack) cpack_add_component(arrow_flight_sql_odbc DISPLAY_NAME "ODBC library" - DESCRIPTION "ODBC library bin, required to install" + DESCRIPTION "Apache Arrow Flight SQL ODBC library bin, required to install" REQUIRED) endif() diff --git a/cpp/src/arrow/flight/sql/odbc/README b/cpp/src/arrow/flight/sql/odbc/README.md similarity index 81% rename from cpp/src/arrow/flight/sql/odbc/README rename to cpp/src/arrow/flight/sql/odbc/README.md index 1ba24b3f764..c40ba3636e1 100644 --- a/cpp/src/arrow/flight/sql/odbc/README +++ b/cpp/src/arrow/flight/sql/odbc/README.md @@ -25,14 +25,18 @@ After the build succeeds, the ODBC DLL will be located in 1. Open Windows Power Shell as administrator. 2. Register your ODBC DLL: - Need to replace with actual path to repository in the commands. - - i. `cd to repo.` - ii. `cd ` - iii. Run script to register your ODBC DLL as Apache Arrow Flight SQL ODBC Driver - `.\cpp\src\arrow\flight\sql\odbc\tests\install_odbc.cmd \cpp\build\< release | debug >\< Release | Debug>\arrow_flight_sql_odbc.dll` - Example command for reference: - `.\cpp\src\arrow\flight\sql\odbc\tests\install_odbc.cmd C:\path\to\arrow\cpp\build\release\Release\arrow_flight_sql_odbc.dll` + + Need to replace with actual path to repository in the commands. + 1. `cd to repo.` + 2. `cd ` + 3. Run script to register your ODBC DLL as Apache Arrow Flight SQL ODBC Driver + ``` + .\cpp\src\arrow\flight\sql\odbc\tests\install_odbc.cmd \cpp\build\< release | debug >\< Release | Debug>\arrow_flight_sql_odbc.dll + ``` + Example command for reference: + ``` + .\cpp\src\arrow\flight\sql\odbc\tests\install_odbc.cmd C:\path\to\arrow\cpp\build\release\Release\arrow_flight_sql_odbc.dll + ``` If the registration is successful, then Apache Arrow Flight SQL ODBC Driver should show as an available ODBC driver in the x64 ODBC Driver Manager. diff --git a/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs b/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs index 6607731efce..faf009b1cef 100644 --- a/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs +++ b/cpp/src/arrow/flight/sql/odbc/install/windows/arrow-flight-sql-odbc.wxs @@ -1,4 +1,4 @@ - +