This is an automated email from the ASF dual-hosted git repository.
zeroshade 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 92c26ec62 feat(rust/core): add function to load driver manifests
(#3099)
92c26ec62 is described below
commit 92c26ec6283b8dad394579ec3258fbc3986b0281
Author: Matt Topol <[email protected]>
AuthorDate: Sat Jul 12 18:08:49 2025 -0400
feat(rust/core): add function to load driver manifests (#3099)
Following the pattern of the C++ driver manager and the various bindings
to it, we also have to add support for the Rust driver manager to handle
and load drivers via manifest files too. Since the Rust driver manager
doesn't bind to the C++ one like everyone else, we need to add the
support in rust directly to locate, open, and parse driver manifests.
This PR adds a new function `ManagedDriver::find_load_from_name` along
with constants for the `LoadFlags` to control what paths are searched.
The basic logic mirrors the C++ implementation. Unit tests are also
included.
To control the tests, two new features are added:
`driver_manager_test_lib` which expects an env var
`ADBC_DRIVER_MANAGER_TEST_LIB` to be set, just like the C++ driver
manager tests, to the path for an adbc library to load. And
`driver_manager_test_manifest_user` which controls whether the test that
interacts with the user's config directory should be run or not.
---------
Co-authored-by: David Li <[email protected]>
Co-authored-by: Bryce Mecum <[email protected]>
Co-authored-by: Matthijs Brobbel <[email protected]>
Co-authored-by: eitsupi <[email protected]>
---
.github/workflows/rust.yml | 5 +
ci/scripts/rust_test.sh | 6 +
rust/Cargo.lock | 823 ++++++++++++++++++++------------------
rust/core/Cargo.toml | 30 +-
rust/core/src/driver_manager.rs | 851 +++++++++++++++++++++++++++++++++++++++-
rust/core/src/lib.rs | 11 +
6 files changed, 1335 insertions(+), 391 deletions(-)
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index 4594675c0..66da8e5b9 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -127,10 +127,15 @@ jobs:
if: matrix.os == 'macos-latest'
run: |
echo "DYLD_LIBRARY_PATH=/opt/homebrew/opt/sqlite/lib:${{
github.workspace }}/local/lib:$DYLD_LIBRARY_PATH" >> "$GITHUB_ENV"
+ echo "ADBC_DRIVER_MANAGER_TEST_LIB=${{ github.workspace
}}/local/lib/libadbc_driver_sqlite.dylib" >> "$GITHUB_ENV"
- name: Set dynamic linker path
if: matrix.os == 'macos-13'
run: |
echo "DYLD_LIBRARY_PATH=/usr/local/opt/sqlite/lib:${{
github.workspace }}/local/lib:$DYLD_LIBRARY_PATH" >> "$GITHUB_ENV"
+ echo "ADBC_DRIVER_MANAGER_TEST_LIB=${{ github.workspace
}}/local/lib/libadbc_driver_sqlite.dylib" >> "$GITHUB_ENV"
+ - name: Set test env var
+ if: runner.os == 'Linux'
+ run: echo "ADBC_DRIVER_MANAGER_TEST_LIB=${{ github.workspace
}}/local/lib/libadbc_driver_sqlite.so" >> "$GITHUB_ENV"
- name: Set search dir for Snowflake Go lib
run: echo "ADBC_SNOWFLAKE_GO_LIB_DIR=${{ github.workspace
}}/local/lib" >> "$GITHUB_ENV"
- name: Clippy
diff --git a/ci/scripts/rust_test.sh b/ci/scripts/rust_test.sh
index 439ad5e33..7b304279a 100755
--- a/ci/scripts/rust_test.sh
+++ b/ci/scripts/rust_test.sh
@@ -26,5 +26,11 @@ export
LD_LIBRARY_PATH="${cpp_libs_dir}/lib:${LD_LIBRARY_PATH:-}"
export DYLD_LIBRARY_PATH="${cpp_libs_dir}/lib:${DYLD_LIBRARY_PATH:-}"
pushd "${source_dir}"
+case "$(uname)" in
+ Linux) EXT="so" ;;
+ Darwin) EXT="dylib" ;;
+ MINGW*|MSYS*) EXT="dll" ;;
+esac
+export
ADBC_DRIVER_MANAGER_TEST_LIB="${cpp_libs_dir}/lib/libadbc_driver_sqlite.${EXT:-}"
cargo test --all-features --workspace
popd
diff --git a/rust/Cargo.lock b/rust/Cargo.lock
index 6225dfae3..e67029910 100644
--- a/rust/Cargo.lock
+++ b/rust/Cargo.lock
@@ -10,6 +10,10 @@ dependencies = [
"arrow-schema",
"arrow-select",
"libloading",
+ "tempfile",
+ "toml",
+ "windows-registry",
+ "windows-sys 0.60.2",
]
[[package]]
@@ -53,34 +57,28 @@ dependencies = [
[[package]]
name = "addr2line"
-version = "0.22.0"
+version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678"
+checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
dependencies = [
"gimli",
]
-[[package]]
-name = "adler"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
-
[[package]]
name = "adler2"
-version = "2.0.0"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "ahash"
-version = "0.8.11"
+version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
+checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
dependencies = [
"cfg-if",
"const-random",
- "getrandom 0.2.15",
+ "getrandom 0.3.3",
"once_cell",
"version_check",
"zerocopy",
@@ -112,9 +110,9 @@ dependencies = [
[[package]]
name = "allocator-api2"
-version = "0.2.20"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "android-tzdata"
@@ -133,9 +131,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.93"
+version = "1.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
+checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "arrayref"
@@ -151,9 +149,9 @@ checksum =
"7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "arrow"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3095aaf545942ff5abd46654534f15b03a90fba78299d661e045e5d587222f0d"
+checksum = "f3f15b4c6b148206ff3a2b35002e08929c2462467b62b9c02036d9c34f9ef994"
dependencies = [
"arrow-arith",
"arrow-array",
@@ -172,9 +170,9 @@ dependencies = [
[[package]]
name = "arrow-arith"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00752064ff47cee746e816ddb8450520c3a52cbad1e256f6fa861a35f86c45e7"
+checksum = "30feb679425110209ae35c3fbf82404a39a4c0436bb3ec36164d8bffed2a4ce4"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -186,9 +184,9 @@ dependencies = [
[[package]]
name = "arrow-array"
-version = "55.1.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29ed77e22744475a9a53d00026cf8e166fe73cf42d89c4c4ae63607ee1cfcc3f"
+checksum = "70732f04d285d49054a48b72c54f791bb3424abae92d27aafdf776c98af161c8"
dependencies = [
"ahash",
"arrow-buffer",
@@ -197,15 +195,15 @@ dependencies = [
"chrono",
"chrono-tz",
"half",
- "hashbrown 0.15.1",
+ "hashbrown 0.15.4",
"num",
]
[[package]]
name = "arrow-buffer"
-version = "55.1.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0391c96eb58bf7389171d1e103112d3fc3e5625ca6b372d606f2688f1ea4cce"
+checksum = "169b1d5d6cb390dd92ce582b06b23815c7953e9dfaaea75556e89d890d19993d"
dependencies = [
"bytes",
"half",
@@ -214,9 +212,9 @@ dependencies = [
[[package]]
name = "arrow-cast"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "335f769c5a218ea823d3760a743feba1ef7857cba114c01399a891c2fff34285"
+checksum = "e4f12eccc3e1c05a766cafb31f6a60a46c2f8efec9b74c6e0648766d30686af8"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -235,9 +233,9 @@ dependencies = [
[[package]]
name = "arrow-csv"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "510db7dfbb4d5761826516cc611d97b3a68835d0ece95b034a052601109c0b1b"
+checksum = "012c9fef3f4a11573b2c74aec53712ff9fdae4a95f4ce452d1bbf088ee00f06b"
dependencies = [
"arrow-array",
"arrow-cast",
@@ -245,15 +243,14 @@ dependencies = [
"chrono",
"csv",
"csv-core",
- "lazy_static",
"regex",
]
[[package]]
name = "arrow-data"
-version = "55.1.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf75ac27a08c7f48b88e5c923f267e980f27070147ab74615ad85b5c5f90473d"
+checksum = "8de1ce212d803199684b658fc4ba55fb2d7e87b213de5af415308d2fee3619c2"
dependencies = [
"arrow-buffer",
"arrow-schema",
@@ -263,9 +260,9 @@ dependencies = [
[[package]]
name = "arrow-ipc"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69880a9e6934d9cba2b8630dd08a3463a91db8693b16b499d54026b6137af284"
+checksum = "d9ea5967e8b2af39aff5d9de2197df16e305f47f404781d3230b2dc672da5d92"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -277,9 +274,9 @@ dependencies = [
[[package]]
name = "arrow-json"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8dafd17a05449e31e0114d740530e0ada7379d7cb9c338fd65b09a8130960b0"
+checksum = "5709d974c4ea5be96d900c01576c7c0b99705f4a3eec343648cb1ca863988a9c"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -299,9 +296,9 @@ dependencies = [
[[package]]
name = "arrow-ord"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "895644523af4e17502d42c3cb6b27cb820f0cb77954c22d75c23a85247c849e1"
+checksum = "6506e3a059e3be23023f587f79c82ef0bcf6d293587e3272d20f2d30b969b5a7"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -312,9 +309,9 @@ dependencies = [
[[package]]
name = "arrow-row"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9be8a2a4e5e7d9c822b2b8095ecd77010576d824f654d347817640acfc97d229"
+checksum = "52bf7393166beaf79b4bed9bfdf19e97472af32ce5b6b48169d321518a08cae2"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -325,18 +322,18 @@ dependencies = [
[[package]]
name = "arrow-schema"
-version = "55.1.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73a47aa0c771b5381de2b7f16998d351a6f4eb839f1e13d48353e17e873d969b"
+checksum = "af7686986a3bf2254c9fb130c623cdcb2f8e1f15763e7c71c310f0834da3d292"
dependencies = [
"bitflags",
]
[[package]]
name = "arrow-select"
-version = "55.1.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24b7b85575702b23b85272b01bc1c25a01c9b9852305e5d0078c79ba25d995d4"
+checksum = "dd2b45757d6a2373faa3352d02ff5b54b098f5e21dccebc45a21806bc34501e5"
dependencies = [
"ahash",
"arrow-array",
@@ -348,9 +345,9 @@ dependencies = [
[[package]]
name = "arrow-string"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e7005d858d84b56428ba2a98a107fe88c0132c61793cf6b8232a1f9bfc0452b"
+checksum = "0377d532850babb4d927a06294314b316e23311503ed580ec6ce6a0158f49d40"
dependencies = [
"arrow-array",
"arrow-buffer",
@@ -413,23 +410,23 @@ dependencies = [
[[package]]
name = "autocfg"
-version = "1.3.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "backtrace"
-version = "0.3.73"
+version = "0.3.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a"
+checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
dependencies = [
"addr2line",
- "cc",
"cfg-if",
"libc",
- "miniz_oxide 0.7.4",
+ "miniz_oxide",
"object",
"rustc-demangle",
+ "windows-targets 0.52.6",
]
[[package]]
@@ -459,9 +456,9 @@ dependencies = [
[[package]]
name = "bitflags"
-version = "2.9.0"
+version = "2.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
+checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
[[package]]
name = "blake2"
@@ -496,9 +493,9 @@ dependencies = [
[[package]]
name = "brotli"
-version = "7.0.0"
+version = "8.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd"
+checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -507,9 +504,9 @@ dependencies = [
[[package]]
name = "brotli-decompressor"
-version = "4.0.1"
+version = "5.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362"
+checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03"
dependencies = [
"alloc-no-stdlib",
"alloc-stdlib",
@@ -517,9 +514,9 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.16.0"
+version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
[[package]]
name = "byteorder"
@@ -554,9 +551,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.1.31"
+version = "1.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f"
+checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362"
dependencies = [
"jobserver",
"libc",
@@ -565,15 +562,15 @@ dependencies = [
[[package]]
name = "cfg-if"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "chrono"
-version = "0.4.40"
+version = "0.4.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
+checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
dependencies = [
"android-tzdata",
"iana-time-zone",
@@ -583,9 +580,9 @@ dependencies = [
[[package]]
name = "chrono-tz"
-version = "0.10.0"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd6dd8046d00723a59a2f8c5f295c515b9bb9a331ee4f8f3d4dd49e428acd3b6"
+checksum = "efdce149c370f133a071ca8ef6ea340b7b88748ab0810097a9e2976eaa34b4f3"
dependencies = [
"chrono",
"chrono-tz-build",
@@ -594,9 +591,9 @@ dependencies = [
[[package]]
name = "chrono-tz-build"
-version = "0.4.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94fea34d77a245229e7746bd2beb786cd2a896f306ff491fb8cecb3074b10a7"
+checksum = "8f10f8c9340e31fc120ff885fcdb54a0b48e474bbd77cab557f0c30a3e569402"
dependencies = [
"parse-zoneinfo",
"phf_codegen",
@@ -604,12 +601,11 @@ dependencies = [
[[package]]
name = "comfy-table"
-version = "7.1.2"
+version = "7.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0d05af1e006a2407bedef5af410552494ce5be9090444dbbcb57258c1af3d56"
+checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a"
dependencies = [
- "strum",
- "strum_macros",
+ "unicode-segmentation",
"unicode-width",
]
@@ -628,7 +624,7 @@ version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
dependencies = [
- "getrandom 0.2.15",
+ "getrandom 0.2.16",
"once_cell",
"tiny-keccak",
]
@@ -641,15 +637,15 @@ checksum =
"7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6"
[[package]]
name = "core-foundation-sys"
-version = "0.8.6"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
-version = "0.2.15"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ca741a962e1b0bff6d724a1a0958b686406e853bb14061f218562e1896f95e6"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
@@ -665,15 +661,15 @@ dependencies = [
[[package]]
name = "crossbeam-utils"
-version = "0.8.20"
+version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80"
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "crunchy"
-version = "0.2.2"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
[[package]]
name = "crypto-common"
@@ -699,9 +695,9 @@ dependencies = [
[[package]]
name = "csv-core"
-version = "0.1.11"
+version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
+checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d"
dependencies = [
"memchr",
]
@@ -1367,37 +1363,37 @@ checksum =
"1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
[[package]]
name = "dyn-clone"
-version = "1.0.17"
+version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125"
+checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005"
[[package]]
name = "either"
-version = "1.13.0"
+version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "equivalent"
-version = "1.0.1"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
-version = "0.3.9"
+version = "0.3.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
+checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
dependencies = [
"libc",
- "windows-sys 0.52.0",
+ "windows-sys 0.60.2",
]
[[package]]
name = "fastrand"
-version = "2.2.0"
+version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4"
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]]
name = "fixedbitset"
@@ -1417,13 +1413,13 @@ dependencies = [
[[package]]
name = "flate2"
-version = "1.1.1"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece"
+checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d"
dependencies = [
"crc32fast",
"libz-rs-sys",
- "miniz_oxide 0.8.5",
+ "miniz_oxide",
]
[[package]]
@@ -1434,9 +1430,9 @@ checksum =
"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foldhash"
-version = "0.1.4"
+version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
+checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]]
name = "form_urlencoded"
@@ -1548,38 +1544,38 @@ dependencies = [
[[package]]
name = "getrandom"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi 0.11.1+wasi-snapshot-preview1",
]
[[package]]
name = "getrandom"
-version = "0.3.1"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
+checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.13.3+wasi-0.2.2",
- "windows-targets 0.52.6",
+ "r-efi",
+ "wasi 0.14.2+wasi-0.2.4",
]
[[package]]
name = "gimli"
-version = "0.29.0"
+version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd"
+checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "glob"
-version = "0.3.1"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "half"
@@ -1604,9 +1600,9 @@ dependencies = [
[[package]]
name = "hashbrown"
-version = "0.15.1"
+version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3"
+checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
dependencies = [
"allocator-api2",
"equivalent",
@@ -1638,20 +1634,21 @@ dependencies = [
[[package]]
name = "humantime"
-version = "2.1.0"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f"
[[package]]
name = "iana-time-zone"
-version = "0.1.60"
+version = "0.1.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
+ "log",
"wasm-bindgen",
"windows-core",
]
@@ -1706,9 +1703,9 @@ dependencies = [
[[package]]
name = "icu_locid_transform_data"
-version = "1.5.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
+checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
[[package]]
name = "icu_normalizer"
@@ -1730,9 +1727,9 @@ dependencies = [
[[package]]
name = "icu_normalizer_data"
-version = "1.5.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
+checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
[[package]]
name = "icu_properties"
@@ -1751,9 +1748,9 @@ dependencies = [
[[package]]
name = "icu_properties_data"
-version = "1.5.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
+checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
[[package]]
name = "icu_provider"
@@ -1806,12 +1803,12 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.9.0"
+version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
dependencies = [
"equivalent",
- "hashbrown 0.15.1",
+ "hashbrown 0.15.4",
]
[[package]]
@@ -1851,39 +1848,35 @@ dependencies = [
[[package]]
name = "itoa"
-version = "1.0.11"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "jobserver"
-version = "0.1.32"
+version = "0.1.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
+checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a"
dependencies = [
+ "getrandom 0.3.3",
"libc",
]
[[package]]
name = "js-sys"
-version = "0.3.69"
+version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [
+ "once_cell",
"wasm-bindgen",
]
-[[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
[[package]]
name = "lexical-core"
-version = "1.0.2"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458"
+checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958"
dependencies = [
"lexical-parse-float",
"lexical-parse-integer",
@@ -1894,9 +1887,9 @@ dependencies = [
[[package]]
name = "lexical-parse-float"
-version = "1.0.2"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0"
+checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2"
dependencies = [
"lexical-parse-integer",
"lexical-util",
@@ -1905,9 +1898,9 @@ dependencies = [
[[package]]
name = "lexical-parse-integer"
-version = "1.0.2"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61"
+checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e"
dependencies = [
"lexical-util",
"static_assertions",
@@ -1915,18 +1908,18 @@ dependencies = [
[[package]]
name = "lexical-util"
-version = "1.0.3"
+version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85314db53332e5c192b6bca611fb10c114a80d1b831ddac0af1e9be1b9232ca0"
+checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3"
dependencies = [
"static_assertions",
]
[[package]]
name = "lexical-write-float"
-version = "1.0.2"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809"
+checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd"
dependencies = [
"lexical-util",
"lexical-write-integer",
@@ -1935,9 +1928,9 @@ dependencies = [
[[package]]
name = "lexical-write-integer"
-version = "1.0.2"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162"
+checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978"
dependencies = [
"lexical-util",
"static_assertions",
@@ -1945,9 +1938,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.172"
+version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
+checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "libloading"
@@ -1961,36 +1954,36 @@ dependencies = [
[[package]]
name = "libm"
-version = "0.2.8"
+version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
[[package]]
name = "libz-rs-sys"
-version = "0.5.0"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a"
+checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221"
dependencies = [
"zlib-rs",
]
[[package]]
name = "linux-raw-sys"
-version = "0.4.14"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
+checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
[[package]]
name = "litemap"
-version = "0.7.3"
+version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
+checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856"
[[package]]
name = "lock_api"
-version = "0.4.12"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -1998,17 +1991,17 @@ dependencies = [
[[package]]
name = "log"
-version = "0.4.22"
+version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
+checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "lz4_flex"
-version = "0.11.3"
+version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5"
+checksum = "08ab2867e3eeeca90e844d1940eab391c9dc5228783db2ed999acbc0a9ed375a"
dependencies = [
- "twox-hash 1.6.3",
+ "twox-hash",
]
[[package]]
@@ -2034,24 +2027,15 @@ dependencies = [
[[package]]
name = "memchr"
-version = "2.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.7.4"
+version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08"
-dependencies = [
- "adler",
-]
+checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "miniz_oxide"
-version = "0.8.5"
+version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"adler2",
]
@@ -2063,15 +2047,15 @@ source =
"registry+https://github.com/rust-lang/crates.io-index"
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
dependencies = [
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi 0.11.1+wasi-snapshot-preview1",
"windows-sys 0.59.0",
]
[[package]]
name = "multimap"
-version = "0.10.0"
+version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03"
+checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
[[package]]
name = "num"
@@ -2089,9 +2073,9 @@ dependencies = [
[[package]]
name = "num-bigint"
-version = "0.4.5"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
dependencies = [
"num-integer",
"num-traits",
@@ -2149,18 +2133,18 @@ dependencies = [
[[package]]
name = "object"
-version = "0.36.5"
+version = "0.36.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e"
+checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
dependencies = [
"memchr",
]
[[package]]
name = "object_store"
-version = "0.12.0"
+version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9ce831b09395f933addbc56d894d889e4b226eba304d4e7adbab591e26daf1e"
+checksum = "7781f96d79ed0f961a7021424ab01840efbda64ae7a505aaea195efc91eaaec4"
dependencies = [
"async-trait",
"bytes",
@@ -2176,13 +2160,15 @@ dependencies = [
"tracing",
"url",
"walkdir",
+ "wasm-bindgen-futures",
+ "web-time",
]
[[package]]
name = "once_cell"
-version = "1.20.2"
+version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "ordered-float"
@@ -2195,9 +2181,9 @@ dependencies = [
[[package]]
name = "parking_lot"
-version = "0.12.3"
+version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -2205,9 +2191,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.10"
+version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
@@ -2218,9 +2204,9 @@ dependencies = [
[[package]]
name = "parquet"
-version = "55.0.0"
+version = "55.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd31a8290ac5b19f09ad77ee7a1e6a541f1be7674ad410547d5f1eef6eef4a9c"
+checksum = "b17da4150748086bd43352bc77372efa9b6e3dbd06a04831d2a98c041c225cfa"
dependencies = [
"ahash",
"arrow-array",
@@ -2237,7 +2223,7 @@ dependencies = [
"flate2",
"futures",
"half",
- "hashbrown 0.15.1",
+ "hashbrown 0.15.4",
"lz4_flex",
"num",
"num-bigint",
@@ -2248,7 +2234,7 @@ dependencies = [
"snap",
"thrift",
"tokio",
- "twox-hash 2.1.0",
+ "twox-hash",
"zstd",
]
@@ -2322,18 +2308,18 @@ dependencies = [
[[package]]
name = "phf"
-version = "0.11.2"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
dependencies = [
"phf_shared",
]
[[package]]
name = "phf_codegen"
-version = "0.11.2"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
+checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
dependencies = [
"phf_generator",
"phf_shared",
@@ -2341,9 +2327,9 @@ dependencies = [
[[package]]
name = "phf_generator"
-version = "0.11.2"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
+checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
dependencies = [
"phf_shared",
"rand",
@@ -2351,18 +2337,18 @@ dependencies = [
[[package]]
name = "phf_shared"
-version = "0.11.2"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project-lite"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
name = "pin-utils"
@@ -2372,24 +2358,24 @@ checksum =
"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
-version = "0.3.31"
+version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "ppv-lite86"
-version = "0.2.20"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
"zerocopy",
]
[[package]]
name = "prettyplease"
-version = "0.2.32"
+version = "0.2.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6"
+checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a"
dependencies = [
"proc-macro2",
"syn",
@@ -2419,9 +2405,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.92"
+version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
+checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
dependencies = [
"unicode-ident",
]
@@ -2480,9 +2466,9 @@ dependencies = [
[[package]]
name = "psm"
-version = "0.1.24"
+version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810"
+checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f"
dependencies = [
"cc",
]
@@ -2496,6 +2482,12 @@ dependencies = [
"proc-macro2",
]
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
[[package]]
name = "rand"
version = "0.8.5"
@@ -2523,7 +2515,7 @@ version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
- "getrandom 0.2.15",
+ "getrandom 0.2.16",
]
[[package]]
@@ -2548,9 +2540,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.5.7"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
+checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags",
]
@@ -2590,15 +2582,15 @@ version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ef7fa9ed0256d64a688a3747d0fef7a88851c18a5e1d57f115f38ec2e09366"
dependencies = [
- "hashbrown 0.15.1",
+ "hashbrown 0.15.4",
"memchr",
]
[[package]]
name = "rustc-demangle"
-version = "0.1.24"
+version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
[[package]]
name = "rustc_version"
@@ -2611,28 +2603,28 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.34"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
+checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
name = "rustversion"
-version = "1.0.18"
+version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
+checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
[[package]]
name = "ryu"
-version = "1.0.18"
+version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "same-file"
@@ -2684,9 +2676,9 @@ dependencies = [
[[package]]
name = "seq-macro"
-version = "0.3.5"
+version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
+checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
[[package]]
name = "serde"
@@ -2731,6 +2723,15 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serde_spanned"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
+dependencies = [
+ "serde",
+]
+
[[package]]
name = "serde_tokenstream"
version = "0.2.2"
@@ -2758,9 +2759,9 @@ dependencies = [
[[package]]
name = "sha2"
-version = "0.10.8"
+version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -2781,24 +2782,21 @@ checksum =
"e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
[[package]]
name = "siphasher"
-version = "0.3.11"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "slab"
-version = "0.4.9"
+version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
+checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
[[package]]
name = "smallvec"
-version = "1.13.2"
+version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "snap"
@@ -2836,15 +2834,15 @@ checksum =
"a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "stacker"
-version = "0.1.15"
+version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce"
+checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b"
dependencies = [
"cc",
"cfg-if",
"libc",
"psm",
- "winapi",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -2853,25 +2851,6 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-[[package]]
-name = "strum"
-version = "0.26.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
-
-[[package]]
-name = "strum_macros"
-version = "0.26.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "rustversion",
- "syn",
-]
-
[[package]]
name = "substrait"
version = "0.55.1"
@@ -2905,9 +2884,9 @@ checksum =
"13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
-version = "2.0.100"
+version = "2.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
+checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
dependencies = [
"proc-macro2",
"quote",
@@ -2916,9 +2895,9 @@ dependencies = [
[[package]]
name = "synstructure"
-version = "0.13.1"
+version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
@@ -2927,15 +2906,15 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.11.0"
+version = "3.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53"
+checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
dependencies = [
- "cfg-if",
"fastrand",
+ "getrandom 0.3.3",
"once_cell",
"rustix",
- "windows-sys 0.52.0",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -2953,18 +2932,18 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.11"
+version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
+checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.11"
+version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
+checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
dependencies = [
"proc-macro2",
"quote",
@@ -3030,9 +3009,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.14"
+version = "0.7.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034"
+checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
dependencies = [
"bytes",
"futures-core",
@@ -3041,11 +3020,48 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "toml"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f271e09bde39ab52250160a67e88577e0559ad77e9085de6e9051a2c4353f8f8"
+dependencies = [
+ "serde_spanned",
+ "toml_datetime",
+ "toml_parser",
+ "toml_writer",
+ "winnow",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_parser"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5c1c469eda89749d2230d8156a5969a69ffe0d6d01200581cdc6110674d293e"
+dependencies = [
+ "winnow",
+]
+
+[[package]]
+name = "toml_writer"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b679217f2848de74cabd3e8fc5e6d66f40b7da40f8e1954d92054d9010690fd5"
+
[[package]]
name = "tracing"
-version = "0.1.40"
+version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
dependencies = [
"pin-project-lite",
"tracing-attributes",
@@ -3054,9 +3070,9 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.27"
+version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
+checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
@@ -3065,34 +3081,24 @@ dependencies = [
[[package]]
name = "tracing-core"
-version = "0.1.32"
+version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
dependencies = [
"once_cell",
]
[[package]]
name = "twox-hash"
-version = "1.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675"
-dependencies = [
- "cfg-if",
- "static_assertions",
-]
-
-[[package]]
-name = "twox-hash"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908"
+checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56"
[[package]]
name = "typenum"
-version = "1.17.0"
+version = "1.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]]
name = "typify"
@@ -3143,9 +3149,9 @@ dependencies = [
[[package]]
name = "unicode-ident"
-version = "1.0.14"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "unicode-segmentation"
@@ -3155,9 +3161,9 @@ checksum =
"f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]]
name = "unicode-width"
-version = "0.2.0"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
+checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c"
[[package]]
name = "unsafe-libyaml"
@@ -3190,20 +3196,20 @@ checksum =
"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
-version = "1.16.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
+checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
- "getrandom 0.3.1",
+ "getrandom 0.3.3",
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "version_check"
-version = "0.9.4"
+version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "walkdir"
@@ -3217,49 +3223,63 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasi"
-version = "0.13.3+wasi-0.2.2"
+version = "0.14.2+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
+checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
dependencies = [
"wit-bindgen-rt",
]
[[package]]
name = "wasm-bindgen"
-version = "0.2.92"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [
"cfg-if",
+ "once_cell",
+ "rustversion",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.92"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [
"bumpalo",
"log",
- "once_cell",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "once_cell",
+ "wasm-bindgen",
+ "web-sys",
+]
+
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.92"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -3267,9 +3287,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.92"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
@@ -3280,9 +3300,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.92"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.77"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
[[package]]
name = "web-time"
@@ -3295,58 +3328,82 @@ dependencies = [
]
[[package]]
-name = "winapi"
-version = "0.3.9"
+name = "winapi-util"
+version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
+ "windows-sys 0.59.0",
]
[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
+name = "windows-core"
+version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
[[package]]
-name = "winapi-util"
-version = "0.1.9"
+name = "windows-implement"
+version = "0.60.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
+checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
dependencies = [
- "windows-sys 0.52.0",
+ "proc-macro2",
+ "quote",
+ "syn",
]
[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
+name = "windows-interface"
+version = "0.59.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
[[package]]
-name = "windows-core"
-version = "0.52.0"
+name = "windows-link"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
+
+[[package]]
+name = "windows-registry"
+version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e"
dependencies = [
- "windows-targets 0.52.6",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
]
[[package]]
-name = "windows-link"
-version = "0.1.1"
+name = "windows-result"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
+dependencies = [
+ "windows-link",
+]
[[package]]
-name = "windows-sys"
-version = "0.52.0"
+name = "windows-strings"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
dependencies = [
- "windows-targets 0.52.6",
+ "windows-link",
]
[[package]]
@@ -3358,6 +3415,15 @@ dependencies = [
"windows-targets 0.52.6",
]
+[[package]]
+name = "windows-sys"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.2",
+]
+
[[package]]
name = "windows-targets"
version = "0.52.6"
@@ -3486,11 +3552,17 @@ version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
+[[package]]
+name = "winnow"
+version = "0.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd"
+
[[package]]
name = "wit-bindgen-rt"
-version = "0.33.0"
+version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
dependencies = [
"bitflags",
]
@@ -3518,9 +3590,9 @@ dependencies = [
[[package]]
name = "yoke"
-version = "0.7.4"
+version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5"
+checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
dependencies = [
"serde",
"stable_deref_trait",
@@ -3530,9 +3602,9 @@ dependencies = [
[[package]]
name = "yoke-derive"
-version = "0.7.4"
+version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
+checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
@@ -3542,19 +3614,18 @@ dependencies = [
[[package]]
name = "zerocopy"
-version = "0.7.34"
+version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087"
+checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
- "byteorder",
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.7.34"
+version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b"
+checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",
@@ -3563,18 +3634,18 @@ dependencies = [
[[package]]
name = "zerofrom"
-version = "0.1.4"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55"
+checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
dependencies = [
"zerofrom-derive",
]
[[package]]
name = "zerofrom-derive"
-version = "0.1.4"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
+checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
@@ -3606,33 +3677,33 @@ dependencies = [
[[package]]
name = "zlib-rs"
-version = "0.5.0"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8"
+checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a"
[[package]]
name = "zstd"
-version = "0.13.2"
+version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9"
+checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a"
dependencies = [
"zstd-safe",
]
[[package]]
name = "zstd-safe"
-version = "7.2.1"
+version = "7.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059"
+checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d"
dependencies = [
"zstd-sys",
]
[[package]]
name = "zstd-sys"
-version = "2.0.13+zstd.1.5.6"
+version = "2.0.15+zstd.1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa"
+checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237"
dependencies = [
"cc",
"pkg-config",
diff --git a/rust/core/Cargo.toml b/rust/core/Cargo.toml
index eace211b0..41bbecb83 100644
--- a/rust/core/Cargo.toml
+++ b/rust/core/Cargo.toml
@@ -16,31 +16,41 @@
# under the License.
[package]
-name = "adbc_core"
+authors.workspace = true
+categories.workspace = true
description = "Public abstract API, driver manager and driver exporter"
-version.workspace = true
+documentation.workspace = true
edition.workspace = true
-rust-version.workspace = true
-authors.workspace = true
+homepage.workspace = true
+keywords.workspace = true
license.workspace = true
+name = "adbc_core"
readme = "../README.md"
-documentation.workspace = true
-homepage.workspace = true
repository.workspace = true
-keywords.workspace = true
-categories.workspace = true
+rust-version.workspace = true
+version.workspace = true
[features]
default = []
-driver_manager = ["dep:libloading"]
+driver_manager = ["dep:toml", "dep:libloading", "dep:windows-sys",
"dep:windows-registry"]
+driver_manager_test_lib = ["driver_manager"]
+driver_manager_test_manifest_user = ["driver_manager_test_lib"]
[dependencies]
arrow-array.workspace = true
arrow-schema.workspace = true
-libloading = { version = "0.8", optional = true }
+libloading = {version = "0.8", optional = true}
+toml = { version = "0.9.0", default-features = false, features = [
+ "parse", "display"
+], optional = true }
[dev-dependencies]
arrow-select.workspace = true
+tempfile = "3.20.0"
[package.metadata.docs.rs]
all-features = true
+
+[target.'cfg(windows)'.dependencies]
+windows-sys = {version = ">= 0.59.0", features = ["Win32_UI_Shell"], optional
= true}
+windows-registry = {version = ">= 0.5.3", optional = true}
diff --git a/rust/core/src/driver_manager.rs b/rust/core/src/driver_manager.rs
index 26e55a0dc..12e814667 100644
--- a/rust/core/src/driver_manager.rs
+++ b/rust/core/src/driver_manager.rs
@@ -101,21 +101,29 @@
// would prevent any parallelism between driver calls, which is not desirable.
use std::collections::HashSet;
+use std::env;
use std::ffi::{CStr, CString, OsStr};
+use std::fs;
use std::ops::DerefMut;
use std::os::raw::{c_char, c_void};
+use std::path::{Path, PathBuf};
use std::pin::Pin;
use std::ptr::{null, null_mut};
use std::sync::{Arc, Mutex};
+#[cfg(target_os = "windows")]
+use windows_registry;
+
use arrow_array::ffi::{to_ffi, FFI_ArrowSchema};
use arrow_array::ffi_stream::{ArrowArrayStreamReader, FFI_ArrowArrayStream};
use arrow_array::{Array, RecordBatch, RecordBatchReader, StructArray};
+use toml::de::DeTable;
use crate::{
error::{Error, Status},
options::{self, AdbcVersion, InfoCode, OptionValue},
- PartitionedResult, Result,
+ LoadFlags, PartitionedResult, Result, LOAD_FLAG_ALLOW_RELATIVE_PATHS,
LOAD_FLAG_SEARCH_ENV,
+ LOAD_FLAG_SEARCH_SYSTEM, LOAD_FLAG_SEARCH_USER,
};
use crate::{ffi, ffi::types::driver_method, Optionable};
use crate::{Connection, Database, Driver, Statement};
@@ -148,6 +156,7 @@ impl From<libloading::Error> for Error {
}
}
+#[derive(Debug)]
struct ManagedDriverInner {
driver: ffi::FFI_AdbcDriver,
version: AdbcVersion, // Driver version
@@ -161,8 +170,112 @@ struct ManagedDriverInner {
_library: Option<libloading::Library>,
}
+#[derive(Default)]
+struct DriverInfo {
+ lib_path: std::path::PathBuf,
+ entrypoint: Option<Vec<u8>>,
+ // TODO: until we add more logging these are unused so we'll leave
+ // them out until such time that we do so.
+ // driver_name: String,
+ // version: String,
+ // source: String,
+}
+
+impl DriverInfo {
+ fn load_driver_manifest(manifest_file: &Path, entrypoint: Option<&[u8]>)
-> Result<Self> {
+ let contents = fs::read_to_string(manifest_file).map_err(|e| {
+ Error::with_message_and_status(
+ format!("Could not read manifest '{}': {e}",
manifest_file.display()),
+ Status::InvalidArguments,
+ )
+ })?;
+
+ let manifest = DeTable::parse(&contents)
+ .map_err(|e| Error::with_message_and_status(e.to_string(),
Status::InvalidArguments))?;
+
+ // leave these out until we add logging that would actually utilize
them
+ // let driver_name = get_optional_key(&manifest, "name");
+ // let version = get_optional_key(&manifest, "version");
+ // let source = get_optional_key(&manifest, "source");
+ let (os, arch, extra) = arch_triplet();
+
+ let lib_path = match manifest
+ .get_ref()
+ .get("Driver")
+ .and_then(|v| v.get_ref().get("shared"))
+ .map(|v| v.get_ref())
+ {
+ Some(driver) => {
+ if driver.is_str() {
+ // If the value is a string, we assume it is the path to
the shared library.
+ Ok(PathBuf::from(driver.as_str().unwrap_or_default()))
+ } else if driver.is_table() {
+ // If the value is a table, we look for the specific key
for this OS and architecture.
+ Ok(PathBuf::from(
+ driver
+ .get(format!("{os}_{arch}{extra}"))
+ .and_then(|v| v.get_ref().as_str())
+ .unwrap_or_default(),
+ ))
+ } else {
+ Err(Error::with_message_and_status(
+ format!(
+ "Driver.shared must be a string or a table, found
'{}'",
+ driver.type_str()
+ ),
+ Status::InvalidArguments,
+ ))
+ }
+ }
+ None => Err(Error::with_message_and_status(
+ format!(
+ "Manifest '{}' missing Driver.shared key",
+ manifest_file.display()
+ ),
+ Status::InvalidArguments,
+ )),
+ }?;
+
+ if lib_path.as_os_str().is_empty() {
+ return Err(Error::with_message_and_status(
+ format!(
+ "Manifest '{}' found empty string for library path of
Driver.shared.{os}_{arch}{extra}",
+ lib_path.display()
+ ),
+ Status::InvalidArguments,
+ ));
+ }
+
+ let entrypoint_val = manifest
+ .get_ref()
+ .get("Driver")
+ .and_then(|v| v.get_ref().as_table())
+ .and_then(|t| t.get("entrypoint"))
+ .map(|v| v.get_ref());
+
+ if let Some(entry) = entrypoint_val {
+ if !entry.is_str() {
+ return Err(Error::with_message_and_status(
+ "Driver entrypoint must be a string".to_string(),
+ Status::InvalidArguments,
+ ));
+ }
+ }
+
+ let entrypoint = match entrypoint_val.and_then(|v| v.as_str()) {
+ Some(s) => Some(s.as_bytes().to_vec()),
+ None => entrypoint.map(|s| s.to_vec()),
+ };
+
+ Ok(DriverInfo {
+ lib_path,
+ entrypoint,
+ })
+ }
+}
+
/// Implementation of [Driver].
-#[derive(Clone)]
+#[derive(Clone, Debug)]
pub struct ManagedDriver {
inner: Pin<Arc<ManagedDriverInner>>,
}
@@ -184,6 +297,58 @@ impl ManagedDriver {
Ok(ManagedDriver { inner })
}
+ /// Load a driver either by name, filename, path, or via locating a toml
manifest file.
+ /// The `load_flags` control what directories are searched to locate a
manifest.
+ /// The `entrypoint` allows customizing the name of the driver
initialization function
+ /// if it is not the default `AdbcDriverInit` and isn't described in the
loaded manifest.
+ /// If not provided, an entrypoint will be searched for based on the
driver's name.
+ /// The `version` defines the ADBC revision to attempt to initialize.
+ ///
+ /// The full logic used here is as follows:
+ /// - if `name` has an extension: it is treated as a filename. If the
load_flags does not
+ /// contain `LOAD_FLAG_ALLOW_RELATIVE_PATHS`, then relative paths will
be rejected.
+ /// - if the extension is `toml` then we attempt to load the Driver
Manifest, otherwise
+ /// we defer to the previous logic in
[`Self::load_dynamic_from_filename`] which will attempt to
+ /// load the library
+ /// - if `name` does not have an extension but is an absolute path: we
first check to see
+ /// if there is an existing file with the same name that *does* have a
"toml" extension,
+ /// attempting to load that if it exists. Otherwise we just pass it to
load_dynamic_from_filename.
+ /// - Finally, if there's no extension and it is not an absolute path, we
will search through
+ /// the relevant directories (based on the set load flags) for a
manifest file with this name, and
+ /// if one is not found we see if the name refers to a library on the
LD_LIBRARY_PATH etc.
+ pub fn load_from_name(
+ name: impl AsRef<OsStr>,
+ entrypoint: Option<&[u8]>,
+ version: AdbcVersion,
+ load_flags: LoadFlags,
+ ) -> Result<Self> {
+ let driver_path = Path::new(name.as_ref());
+ let allow_relative = load_flags & LOAD_FLAG_ALLOW_RELATIVE_PATHS != 0;
+ if let Some(ext) = driver_path.extension() {
+ if !allow_relative && driver_path.is_relative() {
+ return Err(Error::with_message_and_status(
+ "Relative paths are not allowed",
+ Status::InvalidArguments,
+ ));
+ }
+
+ if ext == "toml" {
+ Self::load_from_manifest(driver_path, entrypoint, version)
+ } else {
+ Self::load_dynamic_from_filename(driver_path, entrypoint,
version)
+ }
+ } else if driver_path.is_absolute() {
+ let toml_path = driver_path.with_extension("toml");
+ if toml_path.is_file() {
+ return Self::load_from_manifest(&toml_path, entrypoint,
version);
+ }
+
+ Self::load_dynamic_from_filename(driver_path, entrypoint, version)
+ } else {
+ Self::find_driver(driver_path, entrypoint, version, load_flags)
+ }
+ }
+
/// Load a driver from a dynamic library filename.
///
/// Will attempt to load the dynamic library located at `filename`, find
the
@@ -199,10 +364,15 @@ impl ManagedDriver {
entrypoint: Option<&[u8]>,
version: AdbcVersion,
) -> Result<Self> {
- let entrypoint = entrypoint.unwrap_or(b"AdbcDriverInit");
+ let default_entrypoint = get_default_entrypoint(filename.as_ref());
+
+ let entrypoint = entrypoint.unwrap_or(default_entrypoint.as_bytes());
let library = unsafe { libloading::Library::new(filename.as_ref())? };
- let init: libloading::Symbol<ffi::FFI_AdbcDriverInitFunc> =
- unsafe { library.get(entrypoint)? };
+ let init: libloading::Symbol<ffi::FFI_AdbcDriverInitFunc> = unsafe {
+ library
+ .get(entrypoint)
+ .or_else(|_| library.get(b"AdbcDriverInit"))?
+ };
let driver = Self::load_impl(&init, version)?;
let inner = Arc::pin(ManagedDriverInner {
driver,
@@ -276,6 +446,122 @@ impl ManagedDriver {
Ok(database)
}
+
+ fn load_from_manifest(
+ driver_path: &Path,
+ entrypoint: Option<&[u8]>,
+ version: AdbcVersion,
+ ) -> Result<Self> {
+ let info = DriverInfo::load_driver_manifest(driver_path, entrypoint)?;
+ Self::load_dynamic_from_filename(info.lib_path,
info.entrypoint.as_deref(), version)
+ }
+
+ fn search_path_list(
+ driver_path: &Path,
+ path_list: Vec<PathBuf>,
+ entrypoint: Option<&[u8]>,
+ version: AdbcVersion,
+ ) -> Result<Self> {
+ for path in path_list {
+ let mut full_path = path.join(driver_path);
+ full_path.set_extension("toml");
+ if full_path.is_file() {
+ if let Ok(result) = Self::load_from_manifest(&full_path,
entrypoint, version) {
+ return Ok(result);
+ }
+ }
+
+ full_path.set_extension(""); // Remove the extension to try
loading as a dynamic library.
+ if let Ok(result) = Self::load_dynamic_from_filename(full_path,
entrypoint, version) {
+ return Ok(result);
+ }
+ }
+
+ Err(Error::with_message_and_status(
+ format!("Driver not found: {}", driver_path.display()),
+ Status::NotFound,
+ ))
+ }
+
+ #[cfg(target_os = "windows")]
+ fn find_driver(
+ driver_path: &Path,
+ entrypoint: Option<&[u8]>,
+ version: AdbcVersion,
+ load_flags: LoadFlags,
+ ) -> Result<Self> {
+ if load_flags & LOAD_FLAG_SEARCH_ENV != 0 {
+ if let Ok(result) =
+ Self::search_path_list(driver_path, LOAD_FLAG_SEARCH_ENV,
entrypoint, version)
+ {
+ return Ok(result);
+ }
+ }
+
+ if load_flags & LOAD_FLAG_SEARCH_USER != 0 {
+ // first check registry for the driver, then check the user config
path
+ if let Ok(result) = load_driver_from_registry(
+ &windows_registry::CURRENT_USER,
+ driver_path.as_os_str(),
+ entrypoint,
+ ) {
+ return Self::load_dynamic_from_filename(result.lib_path,
entrypoint, version);
+ }
+
+ if let Ok(result) =
+ Self::search_path_list(driver_path, LOAD_FLAG_SEARCH_USER,
entrypoint, version)
+ {
+ return Ok(result);
+ }
+ }
+
+ if load_flags & LOAD_FLAG_SEARCH_SYSTEM != 0 {
+ if let Ok(result) = load_driver_from_registry(
+ &windows_registry::LOCAL_MACHINE,
+ driver_path.as_os_str(),
+ entrypoint,
+ ) {
+ return Self::load_dynamic_from_filename(result.lib_path,
entrypoint, version);
+ }
+
+ if let Ok(result) =
+ Self::search_path_list(driver_path, LOAD_FLAG_SEARCH_SYSTEM,
entrypoint, version)
+ {
+ return Ok(result);
+ }
+ }
+
+ let driver_name =
driver_path.as_os_str().to_string_lossy().into_owned();
+ Self::load_dynamic_from_name(driver_name, entrypoint, version)
+ }
+
+ #[cfg(not(windows))]
+ fn find_driver(
+ driver_path: &Path,
+ entrypoint: Option<&[u8]>,
+ version: AdbcVersion,
+ load_flags: LoadFlags,
+ ) -> Result<Self> {
+ if let Ok(result) = Self::search_path_list(
+ driver_path,
+ get_search_paths(load_flags),
+ entrypoint,
+ version,
+ ) {
+ return Ok(result);
+ }
+
+ // Convert OsStr to String before passing to load_dynamic_from_name
+ let driver_name =
driver_path.as_os_str().to_string_lossy().into_owned();
+ if let Ok(driver) = Self::load_dynamic_from_name(driver_name,
entrypoint, version) {
+ return Ok(driver);
+ }
+
+ Err(Error::with_message_and_status(
+ format!("Driver not found: {}", driver_path.display()),
+ Status::NotFound,
+ ))
+ }
}
impl Driver for ManagedDriver {
@@ -316,6 +602,67 @@ impl Driver for ManagedDriver {
}
}
+#[cfg(target_os = "windows")]
+fn load_driver_from_registry(
+ root: &windows_registry::Key,
+ driver_name: &OsStr,
+ entrypoint: Option<&[u8]>,
+) -> Result<DriverInfo> {
+ const ADBC_DRIVER_REGISTRY: &str = "SOFTWARE\\ADBC\\Drivers";
+ let drivers_key = root.open(ADBC_DRIVER_REGISTRY)?;
+
+ Ok(DriverInfo {
+ driver_name: drivers_key.get_string("name").unwrap_or_default(),
+ entrypoint: entrypoint
+ .or_else(|| drivers_key.get_string("entrypoint").map(|e|
e.into_bytes())),
+ version: drivers_key.get_string("version").unwrap_or_default(),
+ source: drivers_key.get_string("source").unwrap_or_default(),
+ lib_path:
PathBuf::from(drivers_key.get_string("driver").unwrap_or_default()),
+ })
+}
+
+// construct default entrypoint from the library name
+fn get_default_entrypoint(driver_path: impl AsRef<OsStr>) -> String {
+ // - libadbc_driver_sqlite.so.2.0.0 -> AdbcDriverSqliteInit
+ // - adbc_driver_sqlite.dll -> AdbcDriverSqliteInit
+ // - proprietary_driver.dll -> AdbcProprietaryDriverInit
+
+ // potential path -> filename
+ let mut filename = driver_path.as_ref().to_str().unwrap_or_default();
+ if let Some(pos) = filename.rfind(['/', '\\']) {
+ filename = &filename[pos + 1..];
+ }
+
+ // remove all extensions
+ filename = filename
+ .find('.')
+ .map_or_else(|| filename, |pos| &filename[..pos]);
+
+ let mut entrypoint = filename
+ .to_string()
+ .strip_prefix(env::consts::DLL_PREFIX)
+ .unwrap_or(filename)
+ .split(&['-', '_'][..])
+ .map(|s| {
+ // uppercase first character of a string
+ //
https://stackoverflow.com/questions/38406793/why-is-capitalizing-the-first-letter-of-a-string-so-convoluted-in-rust
+ let mut c = s.chars();
+ match c.next() {
+ None => String::new(),
+ Some(f) => f.to_uppercase().collect::<String>() + c.as_str(),
+ }
+ })
+ .collect::<Vec<_>>()
+ .join("");
+
+ if !entrypoint.starts_with("Adbc") {
+ entrypoint = format!("Adbc{entrypoint}");
+ }
+
+ entrypoint.push_str("Init");
+ entrypoint
+}
+
fn set_option_database(
driver: &ffi::FFI_AdbcDriver,
database: &mut ffi::FFI_AdbcDatabase,
@@ -1310,3 +1657,497 @@ impl Drop for ManagedStatement {
unsafe { method(statement.deref_mut(), null_mut()) };
}
}
+
+#[cfg(target_os = "windows")]
+use windows_sys as windows;
+
+#[cfg(target_os = "windows")]
+mod target_windows {
+ use std::ffi::c_void;
+ use std::ffi::OsString;
+ use std::os::windows::ffi::OsStringExt;
+ use std::path::PathBuf;
+ use std::slice;
+
+ use super::windows::Win32::UI::Shell;
+
+ // adapted from
https://github.com/dirs-dev/dirs-sys-rs/blob/main/src/lib.rs#L150
+ fn user_config_dir() -> Option<PathBuf> {
+ unsafe {
+ let mut path_ptr: windows::core::PWSTR = std::ptr::null_mut();
+ let result = Shell::SHGetKnownFolderPath(
+ Shell::FOLDERID_LocalAppData,
+ 0,
+ std::ptr::null_mut(),
+ &mut path_ptr,
+ );
+
+ if result == 0 {
+ let len = windows::Win32::Globalization::lstrlenW(path_ptr) as
usize;
+ let path = slice::from_raw_parts(path_ptr, len);
+ let ostr: OsString = OsStringExt::from_wide(path);
+ windows::Win32::System::Com::CoTaskMemFree(path_ptr as *const
c_void);
+ Some(PathBuf::from(ostr))
+ } else {
+ windows::Win32::System::Com::CoTaskMemFree(path_ptr as *const
c_void);
+ None
+ }
+ }
+ }
+}
+
+fn user_config_dir() -> Option<PathBuf> {
+ #[cfg(target_os = "windows")]
+ {
+ use target_windows::user_config_dir;
+ user_config_dir().map(|mut path| {
+ path.push("ADBC");
+ path.push("drivers");
+ path
+ })
+ }
+
+ #[cfg(target_os = "macos")]
+ {
+ env::var_os("HOME").map(PathBuf::from).map(|mut path| {
+ path.push("Library");
+ path.push("Application Support");
+ path.push("ADBC");
+ path
+ })
+ }
+
+ #[cfg(all(unix, not(target_os = "macos")))]
+ {
+ env::var_os("XDG_CONFIG_HOME")
+ .map(PathBuf::from)
+ .or_else(|| {
+ env::var_os("HOME").map(|home| {
+ let mut path = PathBuf::from(home);
+ path.push(".config");
+ path
+ })
+ })
+ .map(|mut path| {
+ path.push("adbc");
+ path
+ })
+ }
+}
+
+fn get_search_paths(lvls: LoadFlags) -> Vec<PathBuf> {
+ let mut result = Vec::new();
+ if lvls & LOAD_FLAG_SEARCH_ENV != 0 {
+ if let Some(paths) = env::var_os("ADBC_CONFIG_PATH") {
+ for p in env::split_paths(&paths) {
+ result.push(p);
+ }
+ }
+ }
+
+ if lvls & LOAD_FLAG_SEARCH_USER != 0 {
+ if let Some(path) = user_config_dir() {
+ if path.exists() {
+ result.push(path);
+ }
+ }
+ }
+
+ // system level for windows is to search the registry keys
+ #[cfg(not(windows))]
+ if lvls & LOAD_FLAG_SEARCH_SYSTEM != 0 {
+ let system_config_dir = PathBuf::from("/etc/adbc");
+ if system_config_dir.exists() {
+ result.push(system_config_dir);
+ }
+ }
+
+ result
+}
+
+const fn arch_triplet() -> (&'static str, &'static str, &'static str) {
+ #[cfg(target_arch = "x86_64")]
+ const ARCH: &str = "amd64";
+ #[cfg(target_arch = "aarch64")]
+ const ARCH: &str = "arm64";
+ #[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))]
+ const ARCH: &str = std::env::consts::ARCH;
+
+ #[cfg(target_os = "macos")]
+ const OS: &str = "osx";
+ #[cfg(not(target_os = "macos"))]
+ const OS: &str = std::env::consts::OS;
+
+ #[cfg(target_env = "musl")]
+ const EXTRA: &str = "_musl";
+ #[cfg(all(target_os = "windows", target_env = "gnu"))]
+ const EXTRA: &str = "_mingw";
+ #[cfg(not(any(target_env = "musl", all(target_os = "windows", target_env =
"gnu"))))]
+ const EXTRA: &str = "";
+
+ (OS, ARCH, EXTRA)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ use crate::LOAD_FLAG_DEFAULT;
+ use tempfile::Builder;
+
+ fn manifest_without_driver() -> &'static str {
+ r#"
+ name = 'SQLite3'
+ publisher = 'arrow-adbc'
+ version = '1.0.0'
+
+ [ADBC]
+ version = '1.1.0'
+ "#
+ }
+
+ fn simple_manifest() -> String {
+ // if this test is enabled, we expect the env var
ADBC_DRIVER_MANAGER_TEST_LIB
+ // to be defined.
+ let driver_path =
+ PathBuf::from(env::var_os("ADBC_DRIVER_MANAGER_TEST_LIB").expect(
+ "ADBC_DRIVER_MANAGER_TEST_LIB must be set for driver manager
manifest tests",
+ ));
+
+ assert!(
+ driver_path.exists(),
+ "ADBC_DRIVER_MANAGER_TEST_LIB path does not exist: {}",
+ driver_path.display()
+ );
+
+ let (os, arch, extra) = arch_triplet();
+ format!(
+ r#"
+ {}
+
+ [Driver]
+ [Driver.shared]
+ {os}_{arch}{extra} = {driver_path:?}
+ "#,
+ manifest_without_driver()
+ )
+ }
+
+ fn write_manifest_to_tempfile(p: PathBuf, tbl: String) ->
(tempfile::TempDir, PathBuf) {
+ let tmp_dir = Builder::new()
+ .prefix("adbc_tests")
+ .tempdir()
+ .expect("Failed to create temporary directory for driver manager
manifest test");
+
+ let manifest_path = tmp_dir.path().join(p);
+ if let Some(parent) = manifest_path.parent() {
+ std::fs::create_dir_all(parent)
+ .expect("Failed to create parent directory for manifest");
+ }
+
+ std::fs::write(&manifest_path, tbl.as_str())
+ .expect("Failed to write driver manager manifest to temporary
file");
+
+ (tmp_dir, manifest_path)
+ }
+
+ #[test]
+ fn test_default_entrypoint() {
+ for driver in [
+ "adbc_driver_sqlite",
+ "adbc_driver_sqlite.dll",
+ "driver_sqlite",
+ "libadbc_driver_sqlite",
+ "libadbc_driver_sqlite.so",
+ "libadbc_driver_sqlite.so.6.0.0",
+ "/usr/lib/libadbc_driver_sqlite.so",
+ "/usr/lib/libadbc_driver_sqlite.so.6.0.0",
+ "C:\\System32\\adbc_driver_sqlite.dll",
+ ] {
+ assert_eq!(get_default_entrypoint(driver), "AdbcDriverSqliteInit");
+ }
+
+ for driver in [
+ "adbc_sqlite",
+ "sqlite",
+ "/usr/lib/sqlite.so",
+ "C:\\System32\\sqlite.dll",
+ ] {
+ assert_eq!(get_default_entrypoint(driver), "AdbcSqliteInit");
+ }
+
+ for driver in [
+ "proprietary_engine",
+ "libproprietary_engine.so.6.0.0",
+ "/usr/lib/proprietary_engine.so",
+ "C:\\System32\\proprietary_engine.dll",
+ ] {
+ assert_eq!(get_default_entrypoint(driver),
"AdbcProprietaryEngineInit");
+ }
+
+ for driver in ["driver_example", "libdriver_example.so"] {
+ assert_eq!(get_default_entrypoint(driver),
"AdbcDriverExampleInit");
+ }
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_load_driver_env() {
+ // ensure that we fail without the env var set
+ let err =
+ ManagedDriver::load_from_name("sqlite", None, AdbcVersion::V100,
LOAD_FLAG_SEARCH_ENV)
+ .unwrap_err();
+ assert_eq!(err.status, Status::NotFound);
+
+ let (tmp_dir, manifest_path) =
+ write_manifest_to_tempfile(PathBuf::from("sqlite.toml"),
simple_manifest());
+
+ env::set_var(
+ "ADBC_CONFIG_PATH",
+ manifest_path.parent().unwrap().as_os_str(),
+ );
+
+ ManagedDriver::load_from_name("sqlite", None, AdbcVersion::V100,
LOAD_FLAG_SEARCH_ENV)
+ .unwrap();
+
+ env::remove_var("ADBC_CONFIG_PATH");
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_load_driver_env_multiple_paths() {
+ let (tmp_dir, manifest_path) =
+ write_manifest_to_tempfile(PathBuf::from("sqlite.toml"),
simple_manifest());
+
+ let path_os_string = env::join_paths([
+ Path::new("/home"),
+ Path::new(""),
+ manifest_path.parent().unwrap(),
+ ])
+ .unwrap();
+ env::set_var("ADBC_CONFIG_PATH", path_os_string);
+ ManagedDriver::load_from_name("sqlite", None, AdbcVersion::V100,
LOAD_FLAG_SEARCH_ENV)
+ .unwrap();
+
+ env::remove_var("ADBC_CONFIG_PATH");
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_load_non_ascii_path() {
+ let p = PathBuf::from("majestik møøse/sqlite.toml");
+ let (tmp_dir, manifest_path) = write_manifest_to_tempfile(p,
simple_manifest());
+
+ env::set_var(
+ "ADBC_CONFIG_PATH",
+ manifest_path.parent().unwrap().as_os_str(),
+ );
+ ManagedDriver::load_from_name("sqlite", None, AdbcVersion::V100,
LOAD_FLAG_SEARCH_ENV)
+ .unwrap();
+
+ env::remove_var("ADBC_CONFIG_PATH");
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_disallow_env_config() {
+ let (tmp_dir, manifest_path) =
+ write_manifest_to_tempfile(PathBuf::from("sqlite.toml"),
simple_manifest());
+
+ env::set_var(
+ "ADBC_CONFIG_PATH",
+ manifest_path.parent().unwrap().as_os_str(),
+ );
+
+ let load_flags = LOAD_FLAG_DEFAULT & !LOAD_FLAG_SEARCH_ENV;
+ let err = ManagedDriver::load_from_name("sqlite", None,
AdbcVersion::V100, load_flags)
+ .unwrap_err();
+ assert_eq!(err.status, Status::NotFound);
+
+ env::remove_var("ADBC_CONFIG_PATH");
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_load_absolute_path() {
+ let (tmp_dir, manifest_path) =
+ write_manifest_to_tempfile(PathBuf::from("sqlite.toml"),
simple_manifest());
+
+ ManagedDriver::load_from_name(manifest_path, None, AdbcVersion::V100,
LOAD_FLAG_DEFAULT)
+ .unwrap();
+
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_load_absolute_path_no_ext() {
+ let (tmp_dir, mut manifest_path) =
+ write_manifest_to_tempfile(PathBuf::from("sqlite.toml"),
simple_manifest());
+
+ manifest_path.set_extension("");
+ ManagedDriver::load_from_name(manifest_path, None, AdbcVersion::V100,
LOAD_FLAG_DEFAULT)
+ .unwrap();
+
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_load_relative_path() {
+ std::fs::write(PathBuf::from("sqlite.toml"), simple_manifest())
+ .expect("Failed to write driver manager manifest to file");
+
+ let err =
+ ManagedDriver::load_from_name("sqlite.toml", None,
AdbcVersion::V100, 0).unwrap_err();
+ assert_eq!(err.status, Status::InvalidArguments);
+
+ ManagedDriver::load_from_name(
+ "sqlite.toml",
+ None,
+ AdbcVersion::V100,
+ LOAD_FLAG_ALLOW_RELATIVE_PATHS,
+ )
+ .unwrap();
+
+ std::fs::remove_file("sqlite.toml")
+ .expect("Failed to remove temporary driver manifest file");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_manifest_missing_driver() {
+ let (tmp_dir, manifest_path) = write_manifest_to_tempfile(
+ PathBuf::from("sqlite.toml"),
+ manifest_without_driver().to_string(),
+ );
+
+ let err = ManagedDriver::load_from_name(
+ manifest_path,
+ None,
+ AdbcVersion::V100,
+ LOAD_FLAG_DEFAULT,
+ )
+ .unwrap_err();
+ assert_eq!(err.status, Status::InvalidArguments);
+
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(not(feature = "driver_manager_test_lib"), ignore)]
+ fn test_manifest_wrong_arch() {
+ let manifest_wrong_arch = format!(
+ r#"
+ {}
+
+ [Driver]
+ [Driver.shared]
+ non-existing = 'path/to/bad/driver.so'
+ "#,
+ manifest_without_driver()
+ );
+
+ let (tmp_dir, manifest_path) =
+ write_manifest_to_tempfile(PathBuf::from("sqlite.toml"),
manifest_wrong_arch);
+
+ let err = ManagedDriver::load_from_name(
+ manifest_path,
+ None,
+ AdbcVersion::V100,
+ LOAD_FLAG_DEFAULT,
+ )
+ .unwrap_err();
+ assert_eq!(err.status, Status::InvalidArguments);
+
+ tmp_dir
+ .close()
+ .expect("Failed to close/remove temporary directory");
+ }
+
+ #[test]
+ #[cfg_attr(
+ not(all(
+ feature = "driver_manager_test_lib",
+ feature = "driver_manager_test_manifest_user"
+ )),
+ ignore
+ )]
+ fn test_manifest_user_config() {
+ let err = ManagedDriver::load_from_name(
+ "adbc-test-sqlite",
+ None,
+ AdbcVersion::V110,
+ LOAD_FLAG_DEFAULT,
+ )
+ .unwrap_err();
+ assert_eq!(err.status, Status::NotFound);
+
+ let usercfg_dir = user_config_dir().unwrap();
+ let mut created = false;
+ if !usercfg_dir.exists() {
+ std::fs::create_dir_all(&usercfg_dir)
+ .expect("Failed to create user config directory for driver
manager test");
+ created = true;
+ }
+
+ let manifest_path = usercfg_dir.join("adbc-test-sqlite.toml");
+ std::fs::write(&manifest_path, simple_manifest())
+ .expect("Failed to write driver manager manifest to user config
directory");
+
+ // fail to load if the load flag doesn't have LOAD_FLAG_SEARCH_USER
+ let err = ManagedDriver::load_from_name(
+ "adbc-test-sqlite",
+ None,
+ AdbcVersion::V110,
+ LOAD_FLAG_DEFAULT & !LOAD_FLAG_SEARCH_USER,
+ )
+ .unwrap_err();
+ assert_eq!(err.status, Status::NotFound);
+
+ // succeed loading if LOAD_FLAG_SEARCH_USER flag is set
+ ManagedDriver::load_from_name(
+ "adbc-test-sqlite",
+ None,
+ AdbcVersion::V110,
+ LOAD_FLAG_SEARCH_USER,
+ )
+ .unwrap();
+
+ std::fs::remove_file(&manifest_path)
+ .expect("Failed to remove driver manager manifest from user config
directory");
+ if created {
+ std::fs::remove_dir(usercfg_dir).unwrap();
+ }
+ }
+
+ #[test]
+ #[cfg_attr(not(windows), ignore)]
+ fn test_get_search_paths() {
+ let system_path = PathBuf::from("/etc/adbc");
+ let search_paths = get_search_paths(LOAD_FLAG_SEARCH_SYSTEM);
+ if system_path.exists() {
+ assert_eq!(search_paths, vec![system_path]);
+ } else {
+ assert_eq!(search_paths, Vec::<PathBuf>::new());
+ }
+ }
+}
diff --git a/rust/core/src/lib.rs b/rust/core/src/lib.rs
index e04c5c929..b50ebe464 100644
--- a/rust/core/src/lib.rs
+++ b/rust/core/src/lib.rs
@@ -76,6 +76,17 @@ use arrow_schema::Schema;
use error::Result;
use options::{OptionConnection, OptionDatabase, OptionStatement, OptionValue};
+pub type LoadFlags = u32;
+
+pub const LOAD_FLAG_SEARCH_ENV: LoadFlags = 1 << 1;
+pub const LOAD_FLAG_SEARCH_USER: LoadFlags = 1 << 2;
+pub const LOAD_FLAG_SEARCH_SYSTEM: LoadFlags = 1 << 3;
+pub const LOAD_FLAG_ALLOW_RELATIVE_PATHS: LoadFlags = 1 << 4;
+pub const LOAD_FLAG_DEFAULT: LoadFlags = LOAD_FLAG_SEARCH_ENV
+ | LOAD_FLAG_SEARCH_USER
+ | LOAD_FLAG_SEARCH_SYSTEM
+ | LOAD_FLAG_ALLOW_RELATIVE_PATHS;
+
/// Ability to configure an object by setting/getting options.
pub trait Optionable {
type Option: AsRef<str>;