This is an automated email from the ASF dual-hosted git repository. lidavidm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push: new 4cd05f029 fix(c/driver_manager): ensure CONDA_PREFIX search builds (#3428) 4cd05f029 is described below commit 4cd05f02986da9addc920d6a02ca6dfe7702791e Author: David Li <li.david...@gmail.com> AuthorDate: Mon Sep 22 09:27:37 2025 +0900 fix(c/driver_manager): ensure CONDA_PREFIX search builds (#3428) Closes #3427. --- .github/workflows/native-unix.yml | 2 ++ c/driver_manager/CMakeLists.txt | 6 ++++ c/driver_manager/adbc_driver_manager.cc | 2 +- c/driver_manager/adbc_driver_manager_test.cc | 41 +++++++++++++++++++++++++--- go/adbc/drivermgr/adbc_driver_manager.cc | 2 +- 5 files changed, 47 insertions(+), 6 deletions(-) diff --git a/.github/workflows/native-unix.yml b/.github/workflows/native-unix.yml index 7b50d92e8..a2c3864cd 100644 --- a/.github/workflows/native-unix.yml +++ b/.github/workflows/native-unix.yml @@ -198,6 +198,8 @@ jobs: BUILD_DRIVER_SQLITE: "1" ADBC_DRIVER_MANAGER_USER_CONFIG_TEST: "1" run: | + # Ensure the CONDA_PREFIX searching in driver manager is tested + export CONDA_BUILD=1 ./ci/scripts/cpp_build.sh "$(pwd)" "$(pwd)/build" - name: Test env: diff --git a/c/driver_manager/CMakeLists.txt b/c/driver_manager/CMakeLists.txt index 64ba340a3..7057cc78e 100644 --- a/c/driver_manager/CMakeLists.txt +++ b/c/driver_manager/CMakeLists.txt @@ -69,6 +69,7 @@ foreach(LIB_TARGET ${ADBC_LIBRARIES}) ${REPOSITORY_ROOT}/c/vendor ${REPOSITORY_ROOT}/c/driver) target_compile_definitions(${LIB_TARGET} PRIVATE ADBC_EXPORTING) + # We have to match R Makevars which can only set to 1 or 0 (not define/undefine) if("$ENV{CONDA_BUILD}" STREQUAL "1") target_compile_definitions(${LIB_TARGET} PRIVATE ADBC_CONDA_BUILD=1) else() @@ -109,6 +110,11 @@ if(ADBC_BUILD_TESTS) target_compile_definitions(adbc-driver-manager-test PRIVATE ADBC_DRIVER_MANAGER_TEST_MANIFEST_SYSTEM_LEVEL=1) endif() + if("$ENV{CONDA_BUILD}" STREQUAL "1") + target_compile_definitions(adbc-driver-manager-test PRIVATE ADBC_CONDA_BUILD=1) + else() + target_compile_definitions(adbc-driver-manager-test PRIVATE ADBC_CONDA_BUILD=0) + endif() target_include_directories(adbc-driver-manager-test SYSTEM PRIVATE ${REPOSITORY_ROOT}/c/ ${REPOSITORY_ROOT}/c/include/ ${LIBPQ_INCLUDE_DIRS} ${REPOSITORY_ROOT}/c/driver) diff --git a/c/driver_manager/adbc_driver_manager.cc b/c/driver_manager/adbc_driver_manager.cc index 3169fd480..3943fd81b 100644 --- a/c/driver_manager/adbc_driver_manager.cc +++ b/c/driver_manager/adbc_driver_manager.cc @@ -731,7 +731,7 @@ struct ManagedLibrary { #endif // _WIN32 auto venv = GetEnvPaths(conda_name); if (!venv.empty()) { - for (const auto& venv_path : venv) { + for (const auto& [_, venv_path] : venv) { search_paths.emplace_back(SearchPathSource::kConda, venv_path / "etc" / "adbc" / "drivers"); } diff --git a/c/driver_manager/adbc_driver_manager_test.cc b/c/driver_manager/adbc_driver_manager_test.cc index 0fe83ca65..5ce5a406a 100644 --- a/c/driver_manager/adbc_driver_manager_test.cc +++ b/c/driver_manager/adbc_driver_manager_test.cc @@ -22,10 +22,10 @@ #include <gmock/gmock.h> #include <gtest/gtest.h> -#include <stdlib.h> #include <algorithm> +#include <cstdlib> #include <filesystem> // NOLINT [build/c++17] -#include <memory> +#include <iostream> #include <string> #include <toml++/toml.hpp> #include <vector> @@ -1000,7 +1000,40 @@ TEST_F(DriverManifest, LoadSystemLevelManifest) { } #endif -// TEST CASES -// manifest not found on given paths +TEST_F(DriverManifest, CondaPrefix) { +#if ADBC_CONDA_BUILD + constexpr bool is_conda_build = true; +#else + constexpr bool is_conda_build = false; +#endif // ADBC_CONDA_BUILD + + std::cerr << "ADBC_CONDA_BUILD: " << (is_conda_build ? "defined" : "not defined") + << std::endl; + + auto filepath = temp_dir / "etc" / "adbc" / "drivers" / "sqlite.toml"; + std::filesystem::create_directories(filepath.parent_path()); + std::ofstream test_manifest_file(filepath); + ASSERT_TRUE(test_manifest_file.is_open()); + test_manifest_file << simple_manifest; + test_manifest_file.close(); + +#ifdef _WIN32 + ASSERT_EQ(0, ::_wputenv_s(L"CONDA_PREFIX", temp_dir.native().c_str())); +#else + ASSERT_EQ(0, ::setenv("CONDA_PREFIX", temp_dir.native().c_str(), 1)); +#endif // _WIN32 + + AdbcStatusCode result = + AdbcFindLoadDriver("sqlite", nullptr, ADBC_VERSION_1_1_0, ADBC_LOAD_FLAG_DEFAULT, + nullptr, &driver, &error); + + if constexpr (is_conda_build) { + ASSERT_THAT(result, IsOkStatus(&error)); + } else { + ASSERT_THAT(result, IsStatus(ADBC_STATUS_NOT_FOUND, &error)); + ASSERT_THAT(error.message, + ::testing::HasSubstr("not enabled at build time: Conda prefix")); + } +} } // namespace adbc diff --git a/go/adbc/drivermgr/adbc_driver_manager.cc b/go/adbc/drivermgr/adbc_driver_manager.cc index 3169fd480..3943fd81b 100644 --- a/go/adbc/drivermgr/adbc_driver_manager.cc +++ b/go/adbc/drivermgr/adbc_driver_manager.cc @@ -731,7 +731,7 @@ struct ManagedLibrary { #endif // _WIN32 auto venv = GetEnvPaths(conda_name); if (!venv.empty()) { - for (const auto& venv_path : venv) { + for (const auto& [_, venv_path] : venv) { search_paths.emplace_back(SearchPathSource::kConda, venv_path / "etc" / "adbc" / "drivers"); }