├── numbers.clickhouse
├── .gitignore
├── .gitmodules
├── .cargo
└── config.toml
├── src
├── wasm_lib.rs
├── clickhouse_scan.rs
└── lib.rs
├── test
└── sql
│ └── chsql_native.test
├── .github
└── workflows
│ ├── scheduled-1.4.yml
│ └── MainDistributionPipeline.yml
├── Cargo.toml
├── Makefile
├── README.md
└── Cargo.lock
/numbers.clickhouse:
--------------------------------------------------------------------------------
1 | version()String24.12.1.1273numberUInt64
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 | build
3 | configure
4 | .idea
5 | duckdb_unittest_tempdir
6 | /test/bin
7 | venv
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "extension-ci-tools"]
2 | path = extension-ci-tools
3 | url = https://github.com/duckdb/extension-ci-tools
4 |
--------------------------------------------------------------------------------
/.cargo/config.toml:
--------------------------------------------------------------------------------
1 | # statically linking the C runtime on windows seems sensible?
2 | [target.x86_64-pc-windows-msvc]
3 | rustflags = ["-Ctarget-feature=+crt-static"]
--------------------------------------------------------------------------------
/src/wasm_lib.rs:
--------------------------------------------------------------------------------
1 | #![allow(special_module_name)]
2 |
3 | mod lib;
4 |
5 | // To build the Wasm target, a `staticlib` crate-type is required
6 | //
7 | // This is different than the default needed in native, and there is
8 | // currently no way to select crate-type depending on target.
9 | //
10 | // This file sole purpose is remapping the content of lib as an
11 | // example, do not change the content of the file.
12 | //
13 | // To build the Wasm target explicitly, use:
14 | // cargo build --example $PACKAGE_NAME
15 |
--------------------------------------------------------------------------------
/test/sql/chsql_native.test:
--------------------------------------------------------------------------------
1 | # name: test/sql/rusty_quack.test
2 | # description: test rusty_quack extension
3 | # group: [quack]
4 |
5 | # Before we load the extension, this will fail
6 | statement error
7 | SELECT clickhouse_native('Sam');
8 | ----
9 | Catalog Error: Scalar Function with name clickhouse_native does not exist!
10 |
11 | # Require statement will ensure the extension is loaded from now on
12 | require chsql_native
13 |
14 | require icu
15 |
16 | # Confirm the extension works
17 | query I
18 | SELECT count(*) FROM clickhouse_native('./numbers.clickhouse');
19 | ----
20 | 1
21 |
22 | # Remote
23 | # query I
24 | # SELECT * FROM clickhouse_scan("SELECT 1");
25 | # ----
26 | # 1
27 |
--------------------------------------------------------------------------------
/.github/workflows/scheduled-1.4.yml:
--------------------------------------------------------------------------------
1 | name: Scheduled Trigger for 1.4
2 |
3 | on:
4 | schedule:
5 | - cron: '0 12 * * *' # Runs at 12:00 UTC every day
6 | workflow_dispatch: # Allows manual trigger
7 |
8 | jobs:
9 | trigger:
10 | runs-on: ubuntu-latest
11 | permissions:
12 | actions: write # Allow triggering workflows
13 | steps:
14 | - name: Checkout repository # Required for gh to work
15 | uses: actions/checkout@v4
16 |
17 | - name: Install GitHub CLI
18 | run: |
19 | sudo apt update && sudo apt install gh -y
20 |
21 | - name: Authenticate GH CLI
22 | run: |
23 | echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
24 |
25 | - name: Trigger Workflow on my-branch
26 | run: |
27 | gh workflow run MainDistributionPipeline.yml --ref v1.4
28 |
--------------------------------------------------------------------------------
/.github/workflows/MainDistributionPipeline.yml:
--------------------------------------------------------------------------------
1 | #
2 | # This workflow calls the main distribution pipeline from DuckDB to build, test and (optionally) release the extension
3 | #
4 | name: Main Extension Distribution Pipeline
5 | on:
6 | push:
7 | paths-ignore:
8 | - "**/*.yml"
9 | - "**/*.md"
10 | pull_request:
11 | workflow_dispatch:
12 |
13 | concurrency:
14 | group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref || '' }}-${{ github.base_ref || '' }}-${{ github.ref != 'refs/heads/main' || github.sha }}
15 | cancel-in-progress: true
16 |
17 | jobs:
18 | duckdb-stable-build:
19 | name: Build extension binaries
20 | uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@main
21 | with:
22 | duckdb_version: main
23 | ci_tools_version: main
24 | extension_name: chsql_native
25 | extra_toolchains: rust;python3
26 | exclude_archs: "windows_amd64_rtools;windows_amd64;windows_amd64_mingw;wasm_mvp;wasm_eh;wasm_threads;linux_amd64_musl"
27 |
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "chsql_native"
3 | version = "0.1.3"
4 | edition = "2021"
5 |
6 | [lib]
7 | crate-type = ["cdylib"]
8 |
9 | [profile.release]
10 | lto = true
11 | strip = true
12 |
13 | [[example]]
14 | # crate-type can't be (at the moment) be overriden for specific targets
15 | # src/wasm_lib.rs forwards to src/lib.rs so that we can change from cdylib
16 | # (that is needed while compiling natively) to staticlib (needed since the
17 | # actual linking will be done via emcc
18 | name = "chsql_native"
19 | path = "src/wasm_lib.rs"
20 | crate-type = ["staticlib"]
21 |
22 | [dependencies]
23 | duckdb = { version = "1.3.2", features = ["vtab-loadable"] }
24 | duckdb-loadable-macros = "0.1.5"
25 | libduckdb-sys = { version = "1.3.2", features = ["loadable-extension"] }
26 | byteorder = "1.4"
27 | serde_derive = "1.0.217"
28 | serde_json = "1.0.134"
29 | tokio = { version = "1.42.0", features = ["rt", "rt-multi-thread"] }
30 | serde = "1.0.217"
31 | clickhouse-rs = { version = "1.1.0-alpha.1", features = ["tokio_io", "tls"] }
32 | chrono = "0.4.39"
33 | openssl = { version = "0.10", features = ["vendored"] }
34 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .PHONY: clean clean_all
2 |
3 | PROJ_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
4 |
5 | # Set to 1 to enable Unstable API (binaries will only work on TARGET_DUCKDB_VERSION, forwards compatibility will be broken)
6 | # Note: currently extension-template-rs requires this, as duckdb-rs relies on unstable C API functionality
7 | USE_UNSTABLE_C_API=1
8 |
9 | # TODO: these values are currently duplicated in lib.rs. There's a PR open in duckdb-rs that fixes this
10 | EXTENSION_NAME=chsql_native
11 | MINIMUM_DUCKDB_VERSION=v1.3.2
12 | TARGET_DUCKDB_VERSION=v1.3.2
13 |
14 | all: configure debug
15 |
16 | # Include makefiles from DuckDB
17 | include extension-ci-tools/makefiles/c_api_extensions/base.Makefile
18 | include extension-ci-tools/makefiles/c_api_extensions/rust.Makefile
19 |
20 | configure: venv platform extension_version
21 |
22 | debug: build_extension_library_debug build_extension_with_metadata_debug
23 | release: build_extension_library_release build_extension_with_metadata_release
24 |
25 | test: test_debug
26 | test_debug: test_extension_debug
27 | test_release: test_extension_release
28 |
29 | clean: clean_build clean_rust
30 | clean_all: clean_configure clean
31 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | # DuckDB Clickhouse Native Extension for [chsql](https://github.com/quackscience/duckdb-extension-clickhouse-sql)
6 | Experimental ClickHouse Native Client and Native file reader for DuckDB chsql
7 |
8 |
9 | ### 📦 Installation
10 | ```sql
11 | INSTALL chsql_native FROM community;
12 | LOAD chsql_native;
13 | ```
14 |
15 | ## 🤖 Native Client
16 | The extension provides an experimental clickhouse native client: `clickhouse_scan`
17 | ### 🏁 Settings
18 | ```bash
19 | # Local Setup, Insecure
20 | export CLICKHOUSE_URL="tcp://localhost:9000"
21 | # Remote Setup, Secure
22 | export CLICKHOUSE_URL="tcp://user:pass@remote:9440/?secure=true&skip_verify=true"
23 | ```
24 | ### ✏️ Usage
25 | ```sql
26 | D SELECT * FROM clickhouse_scan("SELECT version(), 'hello', 123");
27 | ┌────────────┬─────────┬────────┐
28 | │ version() │ 'hello' │ 123 │
29 | │ varchar │ varchar │ uint32 │
30 | ├────────────┼─────────┼────────┤
31 | │ 24.10.2.80 │ hello │ 123 │
32 | └────────────┴─────────┴────────┘
33 | ```
34 |
35 | ## 🤖 Native Reader
36 | The extension provides an experimental clickhouse native file reader: `clickhouse_native`
37 |
38 | ### 🏁 Input
39 | Generate some native files with `clickhouse-local` or `clickhouse-server`
40 |
41 | ```sql
42 | --- simple w/ one row, two columns
43 | SELECT version(), number FROM numbers(1) INTO OUTFILE '/tmp/numbers.clickhouse' FORMAT Native;
44 | --- simple w/ one column, 100000 rows
45 | SELECT number FROM numbers(100000) INTO OUTFILE '/tmp/100000.clickhouse' FORMAT Native;
46 | --- complex w/ multiple types
47 | SELECT * FROM system.functions LIMIT 10 INTO OUTFILE '/tmp/functions.clickhouse' FORMAT Native;
48 | ```
49 |
50 | ### ✏️ Usage
51 | Read ClickHouse Native files with DuckDB. Reads are full-scans at this time.
52 |
53 | ```sql
54 | D SELECT * FROM clickhouse_native('/tmp/numbers.clickhouse');
55 | ┌──────────────┬─────────┐
56 | │ version() │ number │
57 | │ varchar │ int32 │
58 | ├──────────────┼─────────┤
59 | │ 24.12.1.1273 │ 0 │
60 | └──────────────┴─────────┘
61 | ```
62 | ```sql
63 | D SELECT count(*), max(number) FROM clickhouse_native('/tmp/100000.clickhouse');
64 | ┌──────────────┬─────────────┐
65 | │ count_star() │ max(number) │
66 | │ int64 │ int32 │
67 | ├──────────────┼─────────────┤
68 | │ 100000 │ 99999 │
69 | └──────────────┴─────────────┘
70 | ```
71 | ```sql
72 | D SELECT * FROM clickhouse_native('/tmp/functions.clickhouse') WHERE alias_to != '' LIMIT 10;
73 | ┌────────────────────┬──────────────┬──────────────────┬──────────────────────┬──────────────┬─────────┬───┬─────────┬───────────┬────────────────┬──────────┬────────────┐
74 | │ name │ is_aggregate │ case_insensitive │ alias_to │ create_query │ origin │ … │ syntax │ arguments │ returned_value │ examples │ categories │
75 | │ varchar │ int32 │ int32 │ varchar │ varchar │ varchar │ │ varchar │ varchar │ varchar │ varchar │ varchar │
76 | ├────────────────────┼──────────────┼──────────────────┼──────────────────────┼──────────────┼─────────┼───┼─────────┼───────────┼────────────────┼──────────┼────────────┤
77 | │ connection_id │ 0 │ 1 │ connectionID │ │ System │ … │ │ │ │ │ │
78 | │ rand32 │ 0 │ 0 │ rand │ │ System │ … │ │ │ │ │ │
79 | │ INET6_ATON │ 0 │ 1 │ IPv6StringToNum │ │ System │ … │ │ │ │ │ │
80 | │ INET_ATON │ 0 │ 1 │ IPv4StringToNum │ │ System │ … │ │ │ │ │ │
81 | │ truncate │ 0 │ 1 │ trunc │ │ System │ … │ │ │ │ │ │
82 | │ ceiling │ 0 │ 1 │ ceil │ │ System │ … │ │ │ │ │ │
83 | │ replace │ 0 │ 1 │ replaceAll │ │ System │ … │ │ │ │ │ │
84 | │ from_utc_timestamp │ 0 │ 1 │ fromUTCTimestamp │ │ System │ … │ │ │ │ │ │
85 | │ mapFromString │ 0 │ 0 │ extractKeyValuePairs │ │ System │ … │ │ │ │ │ │
86 | │ str_to_map │ 0 │ 1 │ extractKeyValuePairs │ │ System │ … │ │ │ │ │ │
87 | ├────────────────────┴──────────────┴──────────────────┴──────────────────────┴──────────────┴─────────┴───┴─────────┴───────────┴────────────────┴──────────┴────────────┤
88 | │ 10 rows 12 columns (11 shown) │
89 | └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
90 | ```
91 |
92 | #### Notes
93 |
94 | > The reader is a clear room implementation of the ClickHouse Native file format using no code or libraries from ClickHouse Inc. As such it is potentially incomplete, imperfect and might not be compatible with all files. USE AT YOUR OWN RISK!
95 |
96 | ### 🐎 Performance
97 | Simple CLI _cold start_ count() test using `duckdb` vs. `clickhouse-local` and 1M rows
98 | #### DuckDB
99 | ```sql
100 | # time duckdb -c "LOAD chsql_native; SELECT count(*) FROM clickhouse_native('/tmp/1M.clickhouse');"
101 | ┌──────────────┐
102 | │ count_star() │
103 | │ int64 │
104 | ├──────────────┤
105 | │ 1000000 │
106 | └──────────────┘
107 |
108 | real 0m0.095s
109 | user 0m0.077s
110 | sys 0m0.029s
111 | ```
112 | #### clickhouse-local
113 | ```sql
114 | # time clickhouse local "SELECT count(*) FROM '/tmp/1M.clickhouse'";
115 | 1000000
116 |
117 | real 0m0.141s
118 | user 0m0.086s
119 | sys 0m0.043s
120 | ```
121 |
122 |
123 |
124 | ### ⛑️ Extension Status
125 | - [x] Basic Fomat Reading
126 | - [x] Column Extraction
127 | - [x] Blocks Parser & Iterator
128 | - [x] Type Mapping WIP
129 | - [x] Strings
130 | - [x] Integers
131 | - [x] Enums
132 | - [ ] ??? as String
133 | - [ ] Compression support
134 | - [x] Basic Native Client
135 | - [x] clickhouse-rs binding
136 | - [x] TLS Support
137 | - [x] Type Mapping WIP
138 | - [x] Strings
139 | - [x] Integers
140 | - [ ] Everything Else
141 |
142 |
143 |
144 |
145 | ### ⚙️ Dev Build
146 | You can easily modify the code and build a local extension for testing and development.
147 |
148 | #### Requirements
149 | - Rust
150 |
151 | 1) Clone and Compile the extension on your system
152 |
153 | ```bash
154 | cd /usr/src
155 | git clone --recurse-submodules https://github.com/quackscience/duckdb-extension-clickhouse-native
156 | cd duckdb-extension-clickhouse-native
157 | make configure && make
158 | ```
159 |
160 | 2) Download and Run DuckDB with -unsigned
161 | ```
162 | wget https://github.com/duckdb/duckdb/releases/download/v1.1.3/duckdb_cli-linux-amd64.zip && unzip duckdb_cli-linux-amd64.zip
163 | ./duckdb -unsigned
164 | ```
165 |
166 | 3) Load your local extension build
167 | ```sql
168 | D LOAD '/usr/src/duckdb-extension-clickhouse-native/build/debug/clickhouse_native.duckdb_extension';
169 | ```
170 |
171 |
172 | ----
173 |
174 | ###### Disclaimer
175 | > DuckDB ® is a trademark of DuckDB Foundation.
176 | > ClickHouse® is a trademark of ClickHouse Inc. All trademarks, service marks, and logos mentioned or depicted are the property of their respective owners. The use of any third-party trademarks, brand names, product names, and company names is purely informative or intended as parody and does not imply endorsement, affiliation, or association with the respective owners.
177 |
--------------------------------------------------------------------------------
/src/clickhouse_scan.rs:
--------------------------------------------------------------------------------
1 | use clickhouse_rs::{types::SqlType, Pool};
2 | use duckdb::{
3 | core::{DataChunkHandle, Inserter, LogicalTypeHandle, LogicalTypeId},
4 | vtab::{BindInfo, InitInfo, TableFunctionInfo, VTab},
5 | Connection, Result,
6 | };
7 | use std::{error::Error, sync::Arc};
8 | use tokio::runtime::Runtime;
9 |
10 | #[repr(C)]
11 | struct ClickHouseScanBindData {
12 | url: String,
13 | user: String,
14 | password: String,
15 | query: String,
16 | column_names: Vec,
17 | column_types: Vec,
18 | }
19 |
20 | #[repr(C)]
21 | struct ClickHouseScanInitData {
22 | runtime: Option>,
23 | block_data: Option>>,
24 | column_types: Vec,
25 | column_names: Vec,
26 | current_row: usize,
27 | total_rows: usize,
28 | done: bool,
29 | }
30 |
31 | fn map_clickhouse_type(sql_type: SqlType) -> LogicalTypeId {
32 | match sql_type {
33 | SqlType::Int8 | SqlType::Int16 | SqlType::Int32 => LogicalTypeId::Integer,
34 | SqlType::Int64 => LogicalTypeId::Bigint,
35 | SqlType::UInt8 | SqlType::UInt16 | SqlType::UInt32 => LogicalTypeId::UInteger,
36 | SqlType::UInt64 => LogicalTypeId::UBigint,
37 | SqlType::Float32 => LogicalTypeId::Float,
38 | SqlType::Float64 => LogicalTypeId::Double,
39 | SqlType::String | SqlType::FixedString(_) => LogicalTypeId::Varchar,
40 | SqlType::Date => LogicalTypeId::Date,
41 | SqlType::DateTime(_) => LogicalTypeId::Timestamp,
42 | SqlType::Bool => LogicalTypeId::Boolean,
43 | _ => LogicalTypeId::Integer,
44 | }
45 | }
46 |
47 | struct ClickHouseScanVTab;
48 |
49 | impl VTab for ClickHouseScanVTab {
50 | type InitData = ClickHouseScanInitData;
51 | type BindData = ClickHouseScanBindData;
52 |
53 | fn bind(bind: &BindInfo) -> Result> {
54 | let query = bind.get_parameter(0).to_string();
55 | let url = bind
56 | .get_named_parameter("url")
57 | .map(|v| v.to_string())
58 | .unwrap_or_else(|| {
59 | std::env::var("CLICKHOUSE_URL")
60 | .unwrap_or_else(|_| "tcp://localhost:9000".to_string())
61 | });
62 | let user = bind
63 | .get_named_parameter("user")
64 | .map(|v| v.to_string())
65 | .unwrap_or_else(|| {
66 | std::env::var("CLICKHOUSE_USER").unwrap_or_else(|_| "default".to_string())
67 | });
68 | let password = bind
69 | .get_named_parameter("password")
70 | .map(|v| v.to_string())
71 | .unwrap_or_else(|| std::env::var("CLICKHOUSE_PASSWORD").unwrap_or_default());
72 |
73 | let runtime = Arc::new(Runtime::new().map_err(|e| format!("Failed to create runtime: {}", e))?);
74 |
75 | let result = runtime.block_on(async {
76 | let pool = Pool::new(url.clone());
77 | let mut client = pool.get_handle().await?;
78 | let block = client.query(&query).fetch_all().await?;
79 |
80 | let columns = block.columns();
81 | let mut names = Vec::new();
82 | let mut types = Vec::new();
83 |
84 | for col in columns {
85 | names.push(col.name().to_string());
86 | types.push(map_clickhouse_type(col.sql_type()));
87 | }
88 |
89 | Ok::<(Vec, Vec), Box>((names, types))
90 | })?;
91 |
92 | let (names, types) = result;
93 |
94 | for (name, type_id) in names.iter().zip(types.iter()) {
95 | let logical_type = match type_id {
96 | LogicalTypeId::Integer => LogicalTypeId::Integer,
97 | LogicalTypeId::Bigint => LogicalTypeId::Bigint,
98 | LogicalTypeId::UInteger => LogicalTypeId::UInteger,
99 | LogicalTypeId::UBigint => LogicalTypeId::UBigint,
100 | LogicalTypeId::Float => LogicalTypeId::Float,
101 | LogicalTypeId::Double => LogicalTypeId::Double,
102 | LogicalTypeId::Varchar => LogicalTypeId::Varchar,
103 | LogicalTypeId::Date => LogicalTypeId::Date,
104 | LogicalTypeId::Timestamp => LogicalTypeId::Timestamp,
105 | LogicalTypeId::Boolean => LogicalTypeId::Boolean,
106 | _ => LogicalTypeId::Varchar,
107 | };
108 | let type_handle = LogicalTypeHandle::from(logical_type);
109 | bind.add_result_column(name, type_handle);
110 | }
111 |
112 | Ok(ClickHouseScanBindData {
113 | url,
114 | user,
115 | password,
116 | query,
117 | column_names: names,
118 | column_types: types,
119 | })
120 | }
121 |
122 | fn init(info: &InitInfo) -> Result> {
123 | let bind_data = info.get_bind_data::();
124 | let bind_data = unsafe { &*bind_data };
125 |
126 | let runtime = Arc::new(Runtime::new().map_err(|e| format!("Failed to create runtime: {}", e))?);
127 |
128 | let result = runtime.block_on(async {
129 | let pool = Pool::new(bind_data.url.clone());
130 | let mut client = pool.get_handle().await?;
131 | let block = client.query(&bind_data.query).fetch_all().await?;
132 |
133 | let columns = block.columns();
134 | let mut data: Vec> = Vec::new();
135 |
136 | for _ in columns {
137 | data.push(Vec::new());
138 | }
139 |
140 | let mut row_count = 0;
141 | for row in block.rows() {
142 | for (col_idx, col) in columns.iter().enumerate() {
143 | let value = match col.sql_type() {
144 | SqlType::UInt8 => match row.get::(col.name()) {
145 | Ok(val) => val.to_string(),
146 | Err(_) => "0".to_string(),
147 | },
148 | // ... rest of type handling ...
149 | _ => match row.get::(col.name()) {
150 | Ok(val) => val,
151 | Err(_) => "0".to_string(),
152 | },
153 | };
154 | data[col_idx].push(value);
155 | }
156 | row_count += 1;
157 | }
158 |
159 | Ok::<(Vec>, usize), Box>((data, row_count))
160 | })?;
161 |
162 | let (block_data, total_rows) = result;
163 |
164 | let column_types = bind_data.column_types.iter().map(|t| match t {
165 | LogicalTypeId::Integer => LogicalTypeId::Integer,
166 | LogicalTypeId::Bigint => LogicalTypeId::Bigint,
167 | LogicalTypeId::UInteger => LogicalTypeId::UInteger,
168 | LogicalTypeId::UBigint => LogicalTypeId::UBigint,
169 | LogicalTypeId::Float => LogicalTypeId::Float,
170 | LogicalTypeId::Double => LogicalTypeId::Double,
171 | LogicalTypeId::Varchar => LogicalTypeId::Varchar,
172 | LogicalTypeId::Date => LogicalTypeId::Date,
173 | LogicalTypeId::Timestamp => LogicalTypeId::Timestamp,
174 | LogicalTypeId::Boolean => LogicalTypeId::Boolean,
175 | _ => LogicalTypeId::Varchar,
176 | }).collect();
177 | let column_names = bind_data.column_names.iter().cloned().collect();
178 |
179 | Ok(ClickHouseScanInitData {
180 | runtime: Some(runtime),
181 | block_data: Some(block_data),
182 | column_types,
183 | column_names,
184 | current_row: 0,
185 | total_rows,
186 | done: false,
187 | })
188 | }
189 |
190 | fn func(func: &TableFunctionInfo, output: &mut DataChunkHandle) -> Result<(), Box> {
191 | let init_data = func.get_init_data() as *const ClickHouseScanInitData as *mut ClickHouseScanInitData;
192 |
193 | unsafe {
194 | if (*init_data).done || (*init_data).current_row >= (*init_data).total_rows {
195 | output.set_len(0);
196 | (*init_data).done = true;
197 | return Ok(());
198 | }
199 |
200 | let block_data = match (*init_data).block_data.as_ref() {
201 | Some(data) => data,
202 | None => return Err("Block data is not available".into()),
203 | };
204 |
205 | let batch_size = 1024.min((*init_data).total_rows - (*init_data).current_row);
206 |
207 | for col_idx in 0..(*init_data).column_types.len() {
208 | let mut vector = output.flat_vector(col_idx);
209 | let type_id = &(*init_data).column_types[col_idx];
210 |
211 | match type_id {
212 | LogicalTypeId::Integer | LogicalTypeId::UInteger => {
213 | let slice = vector.as_mut_slice::();
214 | for row_offset in 0..batch_size {
215 | let row_idx = (*init_data).current_row + row_offset;
216 | let val_str = &block_data[col_idx][row_idx];
217 |
218 | let val = if let Ok(v) = val_str.parse::() {
219 | v
220 | } else if let Ok(v) = val_str.parse::() {
221 | v as i32
222 | } else if let Ok(v) = i32::from_str_radix(val_str.trim(), 10) {
223 | v
224 | } else {
225 | 0
226 | };
227 | slice[row_offset] = val;
228 | }
229 | }
230 | LogicalTypeId::Bigint => {
231 | let slice = vector.as_mut_slice::();
232 | for row_offset in 0..batch_size {
233 | let row_idx = (*init_data).current_row + row_offset;
234 | if let Ok(val) = block_data[col_idx][row_idx].parse::() {
235 | slice[row_offset] = val;
236 | } else {
237 | slice[row_offset] = 0;
238 | }
239 | }
240 | }
241 | _ => {
242 | for row_offset in 0..batch_size {
243 | let row_idx = (*init_data).current_row + row_offset;
244 | let val = block_data[col_idx][row_idx].as_str();
245 | vector.insert(row_offset, val);
246 | }
247 | }
248 | }
249 | }
250 |
251 | (*init_data).current_row += batch_size;
252 | output.set_len(batch_size);
253 | }
254 | Ok(())
255 | }
256 |
257 | fn parameters() -> Option> {
258 | Some(vec![LogicalTypeHandle::from(LogicalTypeId::Varchar)])
259 | }
260 | }
261 |
262 | pub fn register_clickhouse_scan(con: &Connection) -> Result<(), Box> {
263 | con.register_table_function::("clickhouse_scan")?;
264 | Ok(())
265 | }
266 |
--------------------------------------------------------------------------------
/src/lib.rs:
--------------------------------------------------------------------------------
1 | use byteorder::{LittleEndian, ReadBytesExt};
2 | use duckdb::{
3 | core::{DataChunkHandle, Inserter, LogicalTypeHandle, LogicalTypeId},
4 | vtab::{BindInfo, InitInfo, TableFunctionInfo, VTab},
5 | Connection, Result,
6 | };
7 | use duckdb_loadable_macros::duckdb_entrypoint_c_api;
8 | use libduckdb_sys as ffi;
9 | use std::{
10 | error::Error,
11 | fs::File,
12 | io::{self, BufReader, Read, Seek},
13 | };
14 |
15 | mod clickhouse_scan;
16 |
17 | #[allow(dead_code)]
18 | #[derive(Debug)]
19 | enum ColumnType {
20 | String,
21 | UInt8,
22 | UInt64,
23 | Int,
24 | Enum8(EnumType),
25 | Unsupported(String),
26 | }
27 |
28 | #[derive(Debug)]
29 | enum ColumnData {
30 | String(String),
31 | UInt8(u8),
32 | UInt64(u64),
33 | Int(i32),
34 | Enum8(String),
35 | }
36 |
37 | #[derive(Debug)]
38 | struct EnumValue {
39 | name: String,
40 | value: i8,
41 | }
42 |
43 | #[derive(Debug)]
44 | struct EnumType {
45 | values: Vec,
46 | }
47 |
48 | #[derive(Debug)]
49 | struct Column {
50 | name: String,
51 | type_: ColumnType,
52 | data: Vec,
53 | }
54 |
55 | #[derive(Debug)]
56 | struct ClickHouseBindData {
57 | filepath: String,
58 | }
59 |
60 | #[derive(Debug)]
61 | struct ClickHouseInitData {
62 | columns: Vec,
63 | current_row: std::sync::atomic::AtomicUsize,
64 | total_rows: usize,
65 | done: std::sync::atomic::AtomicBool,
66 | }
67 |
68 | fn read_string(reader: &mut impl Read) -> io::Result {
69 | let len = read_var_u64(reader)? as usize;
70 | let mut buffer = vec![0; len];
71 | reader.read_exact(&mut buffer)?;
72 | Ok(String::from_utf8_lossy(&buffer)
73 | .replace('\0', "")
74 | .replace('\u{FFFD}', "")
75 | .to_string())
76 | }
77 |
78 | fn parse_enum_values(params: &str) -> Option {
79 | let inner = params.trim_matches(|c| c == '(' || c == ')').trim();
80 |
81 | if inner.is_empty() {
82 | return None;
83 | }
84 |
85 | let mut values = Vec::new();
86 | for pair in inner.split(',') {
87 | let parts: Vec<&str> = pair.split('=').collect();
88 | if parts.len() != 2 {
89 | continue;
90 | }
91 |
92 | let name = parts[0].trim().trim_matches('\'').to_string();
93 |
94 | if let Ok(value) = parts[1].trim().parse::() {
95 | values.push(EnumValue { name, value });
96 | }
97 | }
98 |
99 | if values.is_empty() {
100 | None
101 | } else {
102 | Some(EnumType { values })
103 | }
104 | }
105 |
106 | fn parse_column_type(type_str: &str) -> (ColumnType, Option) {
107 | let params_start = type_str.find('(');
108 | let base_type = match params_start {
109 | Some(idx) => &type_str[..idx],
110 | None => type_str,
111 | };
112 |
113 | let params = params_start.map(|idx| {
114 | if type_str.ends_with(')') {
115 | type_str[idx..].to_string()
116 | } else {
117 | String::new()
118 | }
119 | });
120 |
121 | let column_type = match base_type {
122 | "String" => ColumnType::String,
123 | "UInt8" => ColumnType::UInt8,
124 | "UInt64" => ColumnType::UInt64,
125 | "Int" => ColumnType::Int,
126 | "Enum8" => {
127 | if let Some(ref p) = params {
128 | if let Some(enum_type) = parse_enum_values(p) {
129 | ColumnType::Enum8(enum_type)
130 | } else {
131 | ColumnType::Unsupported("Invalid Enum8".to_string())
132 | }
133 | } else {
134 | ColumnType::Unsupported("Invalid Enum8".to_string())
135 | }
136 | }
137 | other => ColumnType::Unsupported(other.to_string()),
138 | };
139 |
140 | (column_type, params)
141 | }
142 |
143 | fn read_column_data(
144 | reader: &mut impl Read,
145 | column_type: &ColumnType,
146 | rows: u64,
147 | ) -> io::Result> {
148 | let mut data = Vec::with_capacity(rows as usize);
149 | for _ in 0..rows {
150 | let value = match column_type {
151 | ColumnType::UInt64 => {
152 | let val = reader.read_u64::()?;
153 | ColumnData::UInt64(val)
154 | }
155 | ColumnType::String => ColumnData::String(read_string(reader)?),
156 | ColumnType::UInt8 => ColumnData::UInt8(reader.read_u8()?),
157 | ColumnType::Enum8(enum_type) => {
158 | let val = reader.read_u8()?;
159 | let enum_str = enum_type
160 | .values
161 | .iter()
162 | .find(|ev| ev.value == val as i8)
163 | .map(|ev| ev.name.clone())
164 | .unwrap_or_else(|| format!("Unknown({})", val));
165 | ColumnData::Enum8(enum_str)
166 | }
167 | ColumnType::Int => ColumnData::Int(reader.read_i32::()?),
168 | ColumnType::Unsupported(type_name) => {
169 | ColumnData::String(format!("", type_name))
170 | }
171 | };
172 | data.push(value);
173 | }
174 | Ok(data)
175 | }
176 |
177 | fn read_var_u64(reader: &mut impl Read) -> io::Result {
178 | let mut x = 0u64;
179 | let mut shift = 0;
180 |
181 | for _ in 0..10 {
182 | let byte = reader.read_u8()?;
183 | x |= ((byte & 0x7F) as u64) << shift;
184 | shift += 7;
185 | if byte & 0x80 == 0 {
186 | return Ok(x);
187 | }
188 | }
189 |
190 | Err(io::Error::new(
191 | io::ErrorKind::InvalidData,
192 | "Invalid VarUInt",
193 | ))
194 | }
195 |
196 | fn read_native_format(reader: &mut BufReader) -> io::Result> {
197 | let num_columns = read_var_u64(reader)?;
198 | let mut columns = Vec::new();
199 | let num_rows = read_var_u64(reader)?;
200 |
201 | for _ in 0..num_columns {
202 | let name = read_string(reader)?;
203 | let type_str = read_string(reader)?;
204 | let (column_type, _type_params) = parse_column_type(&type_str);
205 | let data = read_column_data(reader, &column_type, num_rows)?;
206 | columns.push(Column {
207 | name,
208 | type_: column_type,
209 | data,
210 | });
211 | }
212 |
213 | loop {
214 | let _pos = reader.stream_position()?;
215 | let block_columns = match read_var_u64(reader) {
216 | Ok(cols) => cols,
217 | Err(_) => break,
218 | };
219 |
220 | let block_rows = read_var_u64(reader)?;
221 |
222 | if block_rows == 0 {
223 | break;
224 | }
225 |
226 | for _ in 0..block_columns {
227 | let _ = read_string(reader)?;
228 | let _ = read_string(reader)?;
229 | }
230 |
231 | for col in &mut columns {
232 | let mut new_data = read_column_data(reader, &col.type_, block_rows)?;
233 | col.data.append(&mut new_data);
234 | }
235 | }
236 |
237 | Ok(columns)
238 | }
239 |
240 | struct ClickHouseVTab;
241 |
242 | impl VTab for ClickHouseVTab {
243 | type InitData = ClickHouseInitData;
244 | type BindData = ClickHouseBindData;
245 |
246 | fn bind(bind: &BindInfo) -> Result> {
247 | let filepath = bind.get_parameter(0).to_string();
248 |
249 | let file = File::open(&filepath)?;
250 | let mut reader = BufReader::with_capacity(64 * 1024, file);
251 | let columns = read_native_format(&mut reader)?;
252 |
253 | for column in &columns {
254 | let logical_type = match &column.type_ {
255 | ColumnType::String => LogicalTypeId::Varchar,
256 | ColumnType::UInt8 => LogicalTypeId::Integer,
257 | ColumnType::UInt64 => LogicalTypeId::Integer,
258 | ColumnType::Int => LogicalTypeId::Integer,
259 | ColumnType::Enum8(_) => LogicalTypeId::Varchar,
260 | ColumnType::Unsupported(_) => LogicalTypeId::Varchar,
261 | };
262 | bind.add_result_column(&column.name, LogicalTypeHandle::from(logical_type));
263 | }
264 |
265 | Ok(ClickHouseBindData { filepath })
266 | }
267 |
268 | fn init(info: &InitInfo) -> Result> {
269 | let bind_data = info.get_bind_data::();
270 | let filepath = unsafe { &(*bind_data).filepath };
271 | let file = File::open(filepath)?;
272 | let mut reader = BufReader::with_capacity(64 * 1024, file);
273 |
274 | let columns = read_native_format(&mut reader)?;
275 | let total_rows = if columns.is_empty() {
276 | 0
277 | } else {
278 | columns[0].data.len()
279 | };
280 |
281 | Ok(ClickHouseInitData {
282 | columns,
283 | current_row: std::sync::atomic::AtomicUsize::new(0),
284 | total_rows,
285 | done: std::sync::atomic::AtomicBool::new(false),
286 | })
287 | }
288 |
289 | fn func(func: &TableFunctionInfo, output: &mut DataChunkHandle) -> Result<(), Box> {
290 | let init_data = func.get_init_data();
291 | let current_row = init_data.current_row.load(std::sync::atomic::Ordering::Relaxed);
292 |
293 | if current_row >= init_data.total_rows || init_data.done.load(std::sync::atomic::Ordering::Relaxed) {
294 | output.set_len(0);
295 | init_data.done.store(true, std::sync::atomic::Ordering::Relaxed);
296 | return Ok(());
297 | }
298 |
299 | let batch_size = 1024.min(init_data.total_rows - current_row);
300 |
301 | for col_idx in 0..init_data.columns.len() {
302 | let column = &init_data.columns[col_idx];
303 | let mut vector = output.flat_vector(col_idx);
304 |
305 | match &column.type_ {
306 | ColumnType::String | ColumnType::Unsupported(_) => {
307 | for row in 0..batch_size {
308 | let data_idx = current_row + row;
309 | match &column.data[data_idx] {
310 | ColumnData::String(s) => {
311 | let cleaned = s.replace('\0', "").replace('\u{FFFD}', "");
312 | vector.insert(row, cleaned.as_str())
313 | }
314 | _ => vector.insert(row, ""),
315 | }
316 | }
317 | }
318 | ColumnType::UInt8 => {
319 | let slice = vector.as_mut_slice::();
320 | for row in 0..batch_size {
321 | let data_idx = current_row + row;
322 | if let ColumnData::UInt8(v) = column.data[data_idx] {
323 | slice[row] = v as i32;
324 | }
325 | }
326 | }
327 | ColumnType::Enum8(_) => {
328 | for row in 0..batch_size {
329 | let data_idx = current_row + row;
330 | if let ColumnData::Enum8(ref s) = column.data[data_idx] {
331 | vector.insert(row, s.as_str());
332 | }
333 | }
334 | }
335 |
336 | ColumnType::UInt64 => {
337 | let slice = vector.as_mut_slice::();
338 | for row in 0..batch_size {
339 | let data_idx = current_row + row;
340 | if let ColumnData::UInt64(v) = column.data[data_idx] {
341 | slice[row] = v as i32;
342 | }
343 | }
344 | }
345 | ColumnType::Int => {
346 | let slice = vector.as_mut_slice::();
347 | for row in 0..batch_size {
348 | let data_idx = current_row + row;
349 | if let ColumnData::Int(v) = column.data[data_idx] {
350 | slice[row] = v;
351 | }
352 | }
353 | }
354 | }
355 | }
356 |
357 | init_data.current_row.fetch_add(batch_size, std::sync::atomic::Ordering::Relaxed);
358 | output.set_len(batch_size);
359 |
360 | Ok(())
361 | }
362 |
363 | fn parameters() -> Option> {
364 | Some(vec![LogicalTypeHandle::from(LogicalTypeId::Varchar)])
365 | }
366 | }
367 |
368 | #[duckdb_entrypoint_c_api()]
369 | pub unsafe fn extension_entrypoint(con: Connection) -> Result<(), Box> {
370 | con.register_table_function::("clickhouse_native")?;
371 | clickhouse_scan::register_clickhouse_scan(&con)?;
372 | Ok(())
373 | }
374 |
--------------------------------------------------------------------------------
/Cargo.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Cargo.
2 | # It is not intended for manual editing.
3 | version = 4
4 |
5 | [[package]]
6 | name = "addr2line"
7 | version = "0.24.2"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
10 | dependencies = [
11 | "gimli",
12 | ]
13 |
14 | [[package]]
15 | name = "adler2"
16 | version = "2.0.0"
17 | source = "registry+https://github.com/rust-lang/crates.io-index"
18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
19 |
20 | [[package]]
21 | name = "ahash"
22 | version = "0.7.8"
23 | source = "registry+https://github.com/rust-lang/crates.io-index"
24 | checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
25 | dependencies = [
26 | "getrandom",
27 | "once_cell",
28 | "version_check",
29 | ]
30 |
31 | [[package]]
32 | name = "ahash"
33 | version = "0.8.11"
34 | source = "registry+https://github.com/rust-lang/crates.io-index"
35 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
36 | dependencies = [
37 | "cfg-if",
38 | "const-random",
39 | "getrandom",
40 | "once_cell",
41 | "version_check",
42 | "zerocopy",
43 | ]
44 |
45 | [[package]]
46 | name = "aho-corasick"
47 | version = "1.1.3"
48 | source = "registry+https://github.com/rust-lang/crates.io-index"
49 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
50 | dependencies = [
51 | "memchr",
52 | ]
53 |
54 | [[package]]
55 | name = "android-tzdata"
56 | version = "0.1.1"
57 | source = "registry+https://github.com/rust-lang/crates.io-index"
58 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
59 |
60 | [[package]]
61 | name = "android_system_properties"
62 | version = "0.1.5"
63 | source = "registry+https://github.com/rust-lang/crates.io-index"
64 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
65 | dependencies = [
66 | "libc",
67 | ]
68 |
69 | [[package]]
70 | name = "arrayvec"
71 | version = "0.7.6"
72 | source = "registry+https://github.com/rust-lang/crates.io-index"
73 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
74 |
75 | [[package]]
76 | name = "arrow"
77 | version = "55.1.0"
78 | source = "registry+https://github.com/rust-lang/crates.io-index"
79 | checksum = "b1bb018b6960c87fd9d025009820406f74e83281185a8bdcb44880d2aa5c9a87"
80 | dependencies = [
81 | "arrow-arith",
82 | "arrow-array",
83 | "arrow-buffer",
84 | "arrow-cast",
85 | "arrow-data",
86 | "arrow-ord",
87 | "arrow-row",
88 | "arrow-schema",
89 | "arrow-select",
90 | "arrow-string",
91 | ]
92 |
93 | [[package]]
94 | name = "arrow-arith"
95 | version = "55.1.0"
96 | source = "registry+https://github.com/rust-lang/crates.io-index"
97 | checksum = "44de76b51473aa888ecd6ad93ceb262fb8d40d1f1154a4df2f069b3590aa7575"
98 | dependencies = [
99 | "arrow-array",
100 | "arrow-buffer",
101 | "arrow-data",
102 | "arrow-schema",
103 | "chrono",
104 | "num",
105 | ]
106 |
107 | [[package]]
108 | name = "arrow-array"
109 | version = "55.1.0"
110 | source = "registry+https://github.com/rust-lang/crates.io-index"
111 | checksum = "29ed77e22744475a9a53d00026cf8e166fe73cf42d89c4c4ae63607ee1cfcc3f"
112 | dependencies = [
113 | "ahash 0.8.11",
114 | "arrow-buffer",
115 | "arrow-data",
116 | "arrow-schema",
117 | "chrono",
118 | "half",
119 | "hashbrown 0.15.2",
120 | "num",
121 | ]
122 |
123 | [[package]]
124 | name = "arrow-buffer"
125 | version = "55.1.0"
126 | source = "registry+https://github.com/rust-lang/crates.io-index"
127 | checksum = "b0391c96eb58bf7389171d1e103112d3fc3e5625ca6b372d606f2688f1ea4cce"
128 | dependencies = [
129 | "bytes",
130 | "half",
131 | "num",
132 | ]
133 |
134 | [[package]]
135 | name = "arrow-cast"
136 | version = "55.1.0"
137 | source = "registry+https://github.com/rust-lang/crates.io-index"
138 | checksum = "f39e1d774ece9292697fcbe06b5584401b26bd34be1bec25c33edae65c2420ff"
139 | dependencies = [
140 | "arrow-array",
141 | "arrow-buffer",
142 | "arrow-data",
143 | "arrow-schema",
144 | "arrow-select",
145 | "atoi",
146 | "base64",
147 | "chrono",
148 | "comfy-table",
149 | "half",
150 | "lexical-core",
151 | "num",
152 | "ryu",
153 | ]
154 |
155 | [[package]]
156 | name = "arrow-data"
157 | version = "55.1.0"
158 | source = "registry+https://github.com/rust-lang/crates.io-index"
159 | checksum = "cf75ac27a08c7f48b88e5c923f267e980f27070147ab74615ad85b5c5f90473d"
160 | dependencies = [
161 | "arrow-buffer",
162 | "arrow-schema",
163 | "half",
164 | "num",
165 | ]
166 |
167 | [[package]]
168 | name = "arrow-ord"
169 | version = "55.1.0"
170 | source = "registry+https://github.com/rust-lang/crates.io-index"
171 | checksum = "ab2f1065a5cad7b9efa9e22ce5747ce826aa3855766755d4904535123ef431e7"
172 | dependencies = [
173 | "arrow-array",
174 | "arrow-buffer",
175 | "arrow-data",
176 | "arrow-schema",
177 | "arrow-select",
178 | ]
179 |
180 | [[package]]
181 | name = "arrow-row"
182 | version = "55.1.0"
183 | source = "registry+https://github.com/rust-lang/crates.io-index"
184 | checksum = "3703a0e3e92d23c3f756df73d2dc9476873f873a76ae63ef9d3de17fda83b2d8"
185 | dependencies = [
186 | "arrow-array",
187 | "arrow-buffer",
188 | "arrow-data",
189 | "arrow-schema",
190 | "half",
191 | ]
192 |
193 | [[package]]
194 | name = "arrow-schema"
195 | version = "55.1.0"
196 | source = "registry+https://github.com/rust-lang/crates.io-index"
197 | checksum = "73a47aa0c771b5381de2b7f16998d351a6f4eb839f1e13d48353e17e873d969b"
198 | dependencies = [
199 | "bitflags",
200 | ]
201 |
202 | [[package]]
203 | name = "arrow-select"
204 | version = "55.1.0"
205 | source = "registry+https://github.com/rust-lang/crates.io-index"
206 | checksum = "24b7b85575702b23b85272b01bc1c25a01c9b9852305e5d0078c79ba25d995d4"
207 | dependencies = [
208 | "ahash 0.8.11",
209 | "arrow-array",
210 | "arrow-buffer",
211 | "arrow-data",
212 | "arrow-schema",
213 | "num",
214 | ]
215 |
216 | [[package]]
217 | name = "arrow-string"
218 | version = "55.1.0"
219 | source = "registry+https://github.com/rust-lang/crates.io-index"
220 | checksum = "9260fddf1cdf2799ace2b4c2fc0356a9789fa7551e0953e35435536fecefebbd"
221 | dependencies = [
222 | "arrow-array",
223 | "arrow-buffer",
224 | "arrow-data",
225 | "arrow-schema",
226 | "arrow-select",
227 | "memchr",
228 | "num",
229 | "regex",
230 | "regex-syntax",
231 | ]
232 |
233 | [[package]]
234 | name = "atoi"
235 | version = "2.0.0"
236 | source = "registry+https://github.com/rust-lang/crates.io-index"
237 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
238 | dependencies = [
239 | "num-traits",
240 | ]
241 |
242 | [[package]]
243 | name = "autocfg"
244 | version = "1.4.0"
245 | source = "registry+https://github.com/rust-lang/crates.io-index"
246 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
247 |
248 | [[package]]
249 | name = "backtrace"
250 | version = "0.3.74"
251 | source = "registry+https://github.com/rust-lang/crates.io-index"
252 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
253 | dependencies = [
254 | "addr2line",
255 | "cfg-if",
256 | "libc",
257 | "miniz_oxide",
258 | "object",
259 | "rustc-demangle",
260 | "windows-targets",
261 | ]
262 |
263 | [[package]]
264 | name = "base64"
265 | version = "0.22.1"
266 | source = "registry+https://github.com/rust-lang/crates.io-index"
267 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
268 |
269 | [[package]]
270 | name = "bitflags"
271 | version = "2.6.0"
272 | source = "registry+https://github.com/rust-lang/crates.io-index"
273 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
274 |
275 | [[package]]
276 | name = "bitvec"
277 | version = "1.0.1"
278 | source = "registry+https://github.com/rust-lang/crates.io-index"
279 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
280 | dependencies = [
281 | "funty",
282 | "radium",
283 | "tap",
284 | "wyz",
285 | ]
286 |
287 | [[package]]
288 | name = "borsh"
289 | version = "1.5.1"
290 | source = "registry+https://github.com/rust-lang/crates.io-index"
291 | checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed"
292 | dependencies = [
293 | "borsh-derive",
294 | "cfg_aliases",
295 | ]
296 |
297 | [[package]]
298 | name = "borsh-derive"
299 | version = "1.5.1"
300 | source = "registry+https://github.com/rust-lang/crates.io-index"
301 | checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b"
302 | dependencies = [
303 | "once_cell",
304 | "proc-macro-crate",
305 | "proc-macro2",
306 | "quote",
307 | "syn 2.0.93",
308 | "syn_derive",
309 | ]
310 |
311 | [[package]]
312 | name = "bumpalo"
313 | version = "3.16.0"
314 | source = "registry+https://github.com/rust-lang/crates.io-index"
315 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
316 |
317 | [[package]]
318 | name = "bytecheck"
319 | version = "0.6.12"
320 | source = "registry+https://github.com/rust-lang/crates.io-index"
321 | checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2"
322 | dependencies = [
323 | "bytecheck_derive",
324 | "ptr_meta",
325 | "simdutf8",
326 | ]
327 |
328 | [[package]]
329 | name = "bytecheck_derive"
330 | version = "0.6.12"
331 | source = "registry+https://github.com/rust-lang/crates.io-index"
332 | checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"
333 | dependencies = [
334 | "proc-macro2",
335 | "quote",
336 | "syn 1.0.109",
337 | ]
338 |
339 | [[package]]
340 | name = "byteorder"
341 | version = "1.5.0"
342 | source = "registry+https://github.com/rust-lang/crates.io-index"
343 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
344 |
345 | [[package]]
346 | name = "bytes"
347 | version = "1.7.2"
348 | source = "registry+https://github.com/rust-lang/crates.io-index"
349 | checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3"
350 |
351 | [[package]]
352 | name = "cast"
353 | version = "0.3.0"
354 | source = "registry+https://github.com/rust-lang/crates.io-index"
355 | checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
356 |
357 | [[package]]
358 | name = "cc"
359 | version = "1.1.28"
360 | source = "registry+https://github.com/rust-lang/crates.io-index"
361 | checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1"
362 | dependencies = [
363 | "shlex",
364 | ]
365 |
366 | [[package]]
367 | name = "cfg-if"
368 | version = "1.0.0"
369 | source = "registry+https://github.com/rust-lang/crates.io-index"
370 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
371 |
372 | [[package]]
373 | name = "cfg_aliases"
374 | version = "0.2.1"
375 | source = "registry+https://github.com/rust-lang/crates.io-index"
376 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
377 |
378 | [[package]]
379 | name = "chrono"
380 | version = "0.4.41"
381 | source = "registry+https://github.com/rust-lang/crates.io-index"
382 | checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
383 | dependencies = [
384 | "android-tzdata",
385 | "iana-time-zone",
386 | "js-sys",
387 | "num-traits",
388 | "wasm-bindgen",
389 | "windows-link",
390 | ]
391 |
392 | [[package]]
393 | name = "chrono-tz"
394 | version = "0.8.6"
395 | source = "registry+https://github.com/rust-lang/crates.io-index"
396 | checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e"
397 | dependencies = [
398 | "chrono",
399 | "chrono-tz-build",
400 | "phf",
401 | ]
402 |
403 | [[package]]
404 | name = "chrono-tz-build"
405 | version = "0.2.1"
406 | source = "registry+https://github.com/rust-lang/crates.io-index"
407 | checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f"
408 | dependencies = [
409 | "parse-zoneinfo",
410 | "phf",
411 | "phf_codegen",
412 | ]
413 |
414 | [[package]]
415 | name = "chsql_native"
416 | version = "0.1.1"
417 | dependencies = [
418 | "byteorder",
419 | "chrono",
420 | "clickhouse-rs",
421 | "duckdb",
422 | "duckdb-loadable-macros",
423 | "libduckdb-sys",
424 | "openssl",
425 | "serde",
426 | "serde_derive",
427 | "serde_json",
428 | "tokio",
429 | ]
430 |
431 | [[package]]
432 | name = "clickhouse-rs"
433 | version = "1.1.0-alpha.1"
434 | source = "registry+https://github.com/rust-lang/crates.io-index"
435 | checksum = "802fe62a5480415bcdbb5217b3ea029d748c9a3ce3b884767cf58888e33e7f65"
436 | dependencies = [
437 | "byteorder",
438 | "chrono",
439 | "chrono-tz",
440 | "clickhouse-rs-cityhash-sys",
441 | "combine",
442 | "crossbeam",
443 | "either",
444 | "futures-core",
445 | "futures-sink",
446 | "futures-util",
447 | "hostname",
448 | "lazy_static",
449 | "log",
450 | "lz4",
451 | "native-tls",
452 | "percent-encoding",
453 | "pin-project",
454 | "thiserror",
455 | "tokio",
456 | "tokio-native-tls",
457 | "url",
458 | "uuid",
459 | ]
460 |
461 | [[package]]
462 | name = "clickhouse-rs-cityhash-sys"
463 | version = "0.1.2"
464 | source = "registry+https://github.com/rust-lang/crates.io-index"
465 | checksum = "4baf9d4700a28d6cb600e17ed6ae2b43298a5245f1f76b4eab63027ebfd592b9"
466 | dependencies = [
467 | "cc",
468 | ]
469 |
470 | [[package]]
471 | name = "combine"
472 | version = "4.6.7"
473 | source = "registry+https://github.com/rust-lang/crates.io-index"
474 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd"
475 | dependencies = [
476 | "bytes",
477 | "memchr",
478 | ]
479 |
480 | [[package]]
481 | name = "comfy-table"
482 | version = "7.1.1"
483 | source = "registry+https://github.com/rust-lang/crates.io-index"
484 | checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7"
485 | dependencies = [
486 | "strum 0.26.3",
487 | "strum_macros 0.26.4",
488 | "unicode-width",
489 | ]
490 |
491 | [[package]]
492 | name = "const-random"
493 | version = "0.1.18"
494 | source = "registry+https://github.com/rust-lang/crates.io-index"
495 | checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
496 | dependencies = [
497 | "const-random-macro",
498 | ]
499 |
500 | [[package]]
501 | name = "const-random-macro"
502 | version = "0.1.16"
503 | source = "registry+https://github.com/rust-lang/crates.io-index"
504 | checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
505 | dependencies = [
506 | "getrandom",
507 | "once_cell",
508 | "tiny-keccak",
509 | ]
510 |
511 | [[package]]
512 | name = "core-foundation"
513 | version = "0.9.4"
514 | source = "registry+https://github.com/rust-lang/crates.io-index"
515 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
516 | dependencies = [
517 | "core-foundation-sys",
518 | "libc",
519 | ]
520 |
521 | [[package]]
522 | name = "core-foundation-sys"
523 | version = "0.8.7"
524 | source = "registry+https://github.com/rust-lang/crates.io-index"
525 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
526 |
527 | [[package]]
528 | name = "crc32fast"
529 | version = "1.4.2"
530 | source = "registry+https://github.com/rust-lang/crates.io-index"
531 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3"
532 | dependencies = [
533 | "cfg-if",
534 | ]
535 |
536 | [[package]]
537 | name = "crossbeam"
538 | version = "0.8.4"
539 | source = "registry+https://github.com/rust-lang/crates.io-index"
540 | checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
541 | dependencies = [
542 | "crossbeam-channel",
543 | "crossbeam-deque",
544 | "crossbeam-epoch",
545 | "crossbeam-queue",
546 | "crossbeam-utils",
547 | ]
548 |
549 | [[package]]
550 | name = "crossbeam-channel"
551 | version = "0.5.14"
552 | source = "registry+https://github.com/rust-lang/crates.io-index"
553 | checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471"
554 | dependencies = [
555 | "crossbeam-utils",
556 | ]
557 |
558 | [[package]]
559 | name = "crossbeam-deque"
560 | version = "0.8.6"
561 | source = "registry+https://github.com/rust-lang/crates.io-index"
562 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
563 | dependencies = [
564 | "crossbeam-epoch",
565 | "crossbeam-utils",
566 | ]
567 |
568 | [[package]]
569 | name = "crossbeam-epoch"
570 | version = "0.9.18"
571 | source = "registry+https://github.com/rust-lang/crates.io-index"
572 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
573 | dependencies = [
574 | "crossbeam-utils",
575 | ]
576 |
577 | [[package]]
578 | name = "crossbeam-queue"
579 | version = "0.3.12"
580 | source = "registry+https://github.com/rust-lang/crates.io-index"
581 | checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115"
582 | dependencies = [
583 | "crossbeam-utils",
584 | ]
585 |
586 | [[package]]
587 | name = "crossbeam-utils"
588 | version = "0.8.21"
589 | source = "registry+https://github.com/rust-lang/crates.io-index"
590 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
591 |
592 | [[package]]
593 | name = "crunchy"
594 | version = "0.2.2"
595 | source = "registry+https://github.com/rust-lang/crates.io-index"
596 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
597 |
598 | [[package]]
599 | name = "darling"
600 | version = "0.20.10"
601 | source = "registry+https://github.com/rust-lang/crates.io-index"
602 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
603 | dependencies = [
604 | "darling_core",
605 | "darling_macro",
606 | ]
607 |
608 | [[package]]
609 | name = "darling_core"
610 | version = "0.20.10"
611 | source = "registry+https://github.com/rust-lang/crates.io-index"
612 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
613 | dependencies = [
614 | "fnv",
615 | "ident_case",
616 | "proc-macro2",
617 | "quote",
618 | "strsim",
619 | "syn 2.0.93",
620 | ]
621 |
622 | [[package]]
623 | name = "darling_macro"
624 | version = "0.20.10"
625 | source = "registry+https://github.com/rust-lang/crates.io-index"
626 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
627 | dependencies = [
628 | "darling_core",
629 | "quote",
630 | "syn 2.0.93",
631 | ]
632 |
633 | [[package]]
634 | name = "displaydoc"
635 | version = "0.2.5"
636 | source = "registry+https://github.com/rust-lang/crates.io-index"
637 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
638 | dependencies = [
639 | "proc-macro2",
640 | "quote",
641 | "syn 2.0.93",
642 | ]
643 |
644 | [[package]]
645 | name = "duckdb"
646 | version = "1.3.0"
647 | source = "registry+https://github.com/rust-lang/crates.io-index"
648 | checksum = "379464d1fbb69d1bbda7c11d96fafde6f2bdb78c67e630e6339b048e6e45107e"
649 | dependencies = [
650 | "arrow",
651 | "cast",
652 | "duckdb-loadable-macros",
653 | "fallible-iterator",
654 | "fallible-streaming-iterator",
655 | "hashlink",
656 | "libduckdb-sys",
657 | "num-integer",
658 | "rust_decimal",
659 | "smallvec",
660 | "strum 0.25.0",
661 | ]
662 |
663 | [[package]]
664 | name = "duckdb-loadable-macros"
665 | version = "0.1.7"
666 | source = "registry+https://github.com/rust-lang/crates.io-index"
667 | checksum = "d19625372769f0c69a304f5686428716f4df455f1c9607b696f43f957a8d7d2f"
668 | dependencies = [
669 | "darling",
670 | "proc-macro2",
671 | "quote",
672 | "syn 2.0.93",
673 | ]
674 |
675 | [[package]]
676 | name = "either"
677 | version = "1.13.0"
678 | source = "registry+https://github.com/rust-lang/crates.io-index"
679 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
680 |
681 | [[package]]
682 | name = "equivalent"
683 | version = "1.0.1"
684 | source = "registry+https://github.com/rust-lang/crates.io-index"
685 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
686 |
687 | [[package]]
688 | name = "errno"
689 | version = "0.3.9"
690 | source = "registry+https://github.com/rust-lang/crates.io-index"
691 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
692 | dependencies = [
693 | "libc",
694 | "windows-sys 0.52.0",
695 | ]
696 |
697 | [[package]]
698 | name = "fallible-iterator"
699 | version = "0.3.0"
700 | source = "registry+https://github.com/rust-lang/crates.io-index"
701 | checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
702 |
703 | [[package]]
704 | name = "fallible-streaming-iterator"
705 | version = "0.1.9"
706 | source = "registry+https://github.com/rust-lang/crates.io-index"
707 | checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
708 |
709 | [[package]]
710 | name = "fastrand"
711 | version = "2.3.0"
712 | source = "registry+https://github.com/rust-lang/crates.io-index"
713 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
714 |
715 | [[package]]
716 | name = "filetime"
717 | version = "0.2.25"
718 | source = "registry+https://github.com/rust-lang/crates.io-index"
719 | checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
720 | dependencies = [
721 | "cfg-if",
722 | "libc",
723 | "libredox",
724 | "windows-sys 0.59.0",
725 | ]
726 |
727 | [[package]]
728 | name = "flate2"
729 | version = "1.0.34"
730 | source = "registry+https://github.com/rust-lang/crates.io-index"
731 | checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0"
732 | dependencies = [
733 | "crc32fast",
734 | "miniz_oxide",
735 | ]
736 |
737 | [[package]]
738 | name = "fnv"
739 | version = "1.0.7"
740 | source = "registry+https://github.com/rust-lang/crates.io-index"
741 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
742 |
743 | [[package]]
744 | name = "foreign-types"
745 | version = "0.3.2"
746 | source = "registry+https://github.com/rust-lang/crates.io-index"
747 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
748 | dependencies = [
749 | "foreign-types-shared",
750 | ]
751 |
752 | [[package]]
753 | name = "foreign-types-shared"
754 | version = "0.1.1"
755 | source = "registry+https://github.com/rust-lang/crates.io-index"
756 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
757 |
758 | [[package]]
759 | name = "form_urlencoded"
760 | version = "1.2.1"
761 | source = "registry+https://github.com/rust-lang/crates.io-index"
762 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
763 | dependencies = [
764 | "percent-encoding",
765 | ]
766 |
767 | [[package]]
768 | name = "funty"
769 | version = "2.0.0"
770 | source = "registry+https://github.com/rust-lang/crates.io-index"
771 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
772 |
773 | [[package]]
774 | name = "futures-core"
775 | version = "0.3.31"
776 | source = "registry+https://github.com/rust-lang/crates.io-index"
777 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
778 |
779 | [[package]]
780 | name = "futures-macro"
781 | version = "0.3.31"
782 | source = "registry+https://github.com/rust-lang/crates.io-index"
783 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
784 | dependencies = [
785 | "proc-macro2",
786 | "quote",
787 | "syn 2.0.93",
788 | ]
789 |
790 | [[package]]
791 | name = "futures-sink"
792 | version = "0.3.31"
793 | source = "registry+https://github.com/rust-lang/crates.io-index"
794 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
795 |
796 | [[package]]
797 | name = "futures-task"
798 | version = "0.3.31"
799 | source = "registry+https://github.com/rust-lang/crates.io-index"
800 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
801 |
802 | [[package]]
803 | name = "futures-util"
804 | version = "0.3.31"
805 | source = "registry+https://github.com/rust-lang/crates.io-index"
806 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
807 | dependencies = [
808 | "futures-core",
809 | "futures-macro",
810 | "futures-sink",
811 | "futures-task",
812 | "pin-project-lite",
813 | "pin-utils",
814 | "slab",
815 | ]
816 |
817 | [[package]]
818 | name = "getrandom"
819 | version = "0.2.15"
820 | source = "registry+https://github.com/rust-lang/crates.io-index"
821 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
822 | dependencies = [
823 | "cfg-if",
824 | "libc",
825 | "wasi",
826 | ]
827 |
828 | [[package]]
829 | name = "gimli"
830 | version = "0.31.1"
831 | source = "registry+https://github.com/rust-lang/crates.io-index"
832 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
833 |
834 | [[package]]
835 | name = "half"
836 | version = "2.4.1"
837 | source = "registry+https://github.com/rust-lang/crates.io-index"
838 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888"
839 | dependencies = [
840 | "cfg-if",
841 | "crunchy",
842 | "num-traits",
843 | ]
844 |
845 | [[package]]
846 | name = "hashbrown"
847 | version = "0.12.3"
848 | source = "registry+https://github.com/rust-lang/crates.io-index"
849 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
850 | dependencies = [
851 | "ahash 0.7.8",
852 | ]
853 |
854 | [[package]]
855 | name = "hashbrown"
856 | version = "0.14.5"
857 | source = "registry+https://github.com/rust-lang/crates.io-index"
858 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
859 | dependencies = [
860 | "ahash 0.8.11",
861 | ]
862 |
863 | [[package]]
864 | name = "hashbrown"
865 | version = "0.15.2"
866 | source = "registry+https://github.com/rust-lang/crates.io-index"
867 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
868 |
869 | [[package]]
870 | name = "hashlink"
871 | version = "0.9.1"
872 | source = "registry+https://github.com/rust-lang/crates.io-index"
873 | checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af"
874 | dependencies = [
875 | "hashbrown 0.14.5",
876 | ]
877 |
878 | [[package]]
879 | name = "heck"
880 | version = "0.4.1"
881 | source = "registry+https://github.com/rust-lang/crates.io-index"
882 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
883 |
884 | [[package]]
885 | name = "heck"
886 | version = "0.5.0"
887 | source = "registry+https://github.com/rust-lang/crates.io-index"
888 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
889 |
890 | [[package]]
891 | name = "hostname"
892 | version = "0.3.1"
893 | source = "registry+https://github.com/rust-lang/crates.io-index"
894 | checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867"
895 | dependencies = [
896 | "libc",
897 | "match_cfg",
898 | "winapi",
899 | ]
900 |
901 | [[package]]
902 | name = "iana-time-zone"
903 | version = "0.1.61"
904 | source = "registry+https://github.com/rust-lang/crates.io-index"
905 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
906 | dependencies = [
907 | "android_system_properties",
908 | "core-foundation-sys",
909 | "iana-time-zone-haiku",
910 | "js-sys",
911 | "wasm-bindgen",
912 | "windows-core",
913 | ]
914 |
915 | [[package]]
916 | name = "iana-time-zone-haiku"
917 | version = "0.1.2"
918 | source = "registry+https://github.com/rust-lang/crates.io-index"
919 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
920 | dependencies = [
921 | "cc",
922 | ]
923 |
924 | [[package]]
925 | name = "icu_collections"
926 | version = "1.5.0"
927 | source = "registry+https://github.com/rust-lang/crates.io-index"
928 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
929 | dependencies = [
930 | "displaydoc",
931 | "yoke",
932 | "zerofrom",
933 | "zerovec",
934 | ]
935 |
936 | [[package]]
937 | name = "icu_locid"
938 | version = "1.5.0"
939 | source = "registry+https://github.com/rust-lang/crates.io-index"
940 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
941 | dependencies = [
942 | "displaydoc",
943 | "litemap",
944 | "tinystr",
945 | "writeable",
946 | "zerovec",
947 | ]
948 |
949 | [[package]]
950 | name = "icu_locid_transform"
951 | version = "1.5.0"
952 | source = "registry+https://github.com/rust-lang/crates.io-index"
953 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
954 | dependencies = [
955 | "displaydoc",
956 | "icu_locid",
957 | "icu_locid_transform_data",
958 | "icu_provider",
959 | "tinystr",
960 | "zerovec",
961 | ]
962 |
963 | [[package]]
964 | name = "icu_locid_transform_data"
965 | version = "1.5.0"
966 | source = "registry+https://github.com/rust-lang/crates.io-index"
967 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
968 |
969 | [[package]]
970 | name = "icu_normalizer"
971 | version = "1.5.0"
972 | source = "registry+https://github.com/rust-lang/crates.io-index"
973 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
974 | dependencies = [
975 | "displaydoc",
976 | "icu_collections",
977 | "icu_normalizer_data",
978 | "icu_properties",
979 | "icu_provider",
980 | "smallvec",
981 | "utf16_iter",
982 | "utf8_iter",
983 | "write16",
984 | "zerovec",
985 | ]
986 |
987 | [[package]]
988 | name = "icu_normalizer_data"
989 | version = "1.5.0"
990 | source = "registry+https://github.com/rust-lang/crates.io-index"
991 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
992 |
993 | [[package]]
994 | name = "icu_properties"
995 | version = "1.5.1"
996 | source = "registry+https://github.com/rust-lang/crates.io-index"
997 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
998 | dependencies = [
999 | "displaydoc",
1000 | "icu_collections",
1001 | "icu_locid_transform",
1002 | "icu_properties_data",
1003 | "icu_provider",
1004 | "tinystr",
1005 | "zerovec",
1006 | ]
1007 |
1008 | [[package]]
1009 | name = "icu_properties_data"
1010 | version = "1.5.0"
1011 | source = "registry+https://github.com/rust-lang/crates.io-index"
1012 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
1013 |
1014 | [[package]]
1015 | name = "icu_provider"
1016 | version = "1.5.0"
1017 | source = "registry+https://github.com/rust-lang/crates.io-index"
1018 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
1019 | dependencies = [
1020 | "displaydoc",
1021 | "icu_locid",
1022 | "icu_provider_macros",
1023 | "stable_deref_trait",
1024 | "tinystr",
1025 | "writeable",
1026 | "yoke",
1027 | "zerofrom",
1028 | "zerovec",
1029 | ]
1030 |
1031 | [[package]]
1032 | name = "icu_provider_macros"
1033 | version = "1.5.0"
1034 | source = "registry+https://github.com/rust-lang/crates.io-index"
1035 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
1036 | dependencies = [
1037 | "proc-macro2",
1038 | "quote",
1039 | "syn 2.0.93",
1040 | ]
1041 |
1042 | [[package]]
1043 | name = "ident_case"
1044 | version = "1.0.1"
1045 | source = "registry+https://github.com/rust-lang/crates.io-index"
1046 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
1047 |
1048 | [[package]]
1049 | name = "idna"
1050 | version = "1.0.3"
1051 | source = "registry+https://github.com/rust-lang/crates.io-index"
1052 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
1053 | dependencies = [
1054 | "idna_adapter",
1055 | "smallvec",
1056 | "utf8_iter",
1057 | ]
1058 |
1059 | [[package]]
1060 | name = "idna_adapter"
1061 | version = "1.2.0"
1062 | source = "registry+https://github.com/rust-lang/crates.io-index"
1063 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
1064 | dependencies = [
1065 | "icu_normalizer",
1066 | "icu_properties",
1067 | ]
1068 |
1069 | [[package]]
1070 | name = "indexmap"
1071 | version = "2.6.0"
1072 | source = "registry+https://github.com/rust-lang/crates.io-index"
1073 | checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
1074 | dependencies = [
1075 | "equivalent",
1076 | "hashbrown 0.15.2",
1077 | ]
1078 |
1079 | [[package]]
1080 | name = "itoa"
1081 | version = "1.0.11"
1082 | source = "registry+https://github.com/rust-lang/crates.io-index"
1083 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
1084 |
1085 | [[package]]
1086 | name = "js-sys"
1087 | version = "0.3.70"
1088 | source = "registry+https://github.com/rust-lang/crates.io-index"
1089 | checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
1090 | dependencies = [
1091 | "wasm-bindgen",
1092 | ]
1093 |
1094 | [[package]]
1095 | name = "lazy_static"
1096 | version = "1.5.0"
1097 | source = "registry+https://github.com/rust-lang/crates.io-index"
1098 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
1099 |
1100 | [[package]]
1101 | name = "lexical-core"
1102 | version = "1.0.2"
1103 | source = "registry+https://github.com/rust-lang/crates.io-index"
1104 | checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458"
1105 | dependencies = [
1106 | "lexical-parse-float",
1107 | "lexical-parse-integer",
1108 | "lexical-util",
1109 | "lexical-write-float",
1110 | "lexical-write-integer",
1111 | ]
1112 |
1113 | [[package]]
1114 | name = "lexical-parse-float"
1115 | version = "1.0.2"
1116 | source = "registry+https://github.com/rust-lang/crates.io-index"
1117 | checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0"
1118 | dependencies = [
1119 | "lexical-parse-integer",
1120 | "lexical-util",
1121 | "static_assertions",
1122 | ]
1123 |
1124 | [[package]]
1125 | name = "lexical-parse-integer"
1126 | version = "1.0.2"
1127 | source = "registry+https://github.com/rust-lang/crates.io-index"
1128 | checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61"
1129 | dependencies = [
1130 | "lexical-util",
1131 | "static_assertions",
1132 | ]
1133 |
1134 | [[package]]
1135 | name = "lexical-util"
1136 | version = "1.0.3"
1137 | source = "registry+https://github.com/rust-lang/crates.io-index"
1138 | checksum = "85314db53332e5c192b6bca611fb10c114a80d1b831ddac0af1e9be1b9232ca0"
1139 | dependencies = [
1140 | "static_assertions",
1141 | ]
1142 |
1143 | [[package]]
1144 | name = "lexical-write-float"
1145 | version = "1.0.2"
1146 | source = "registry+https://github.com/rust-lang/crates.io-index"
1147 | checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809"
1148 | dependencies = [
1149 | "lexical-util",
1150 | "lexical-write-integer",
1151 | "static_assertions",
1152 | ]
1153 |
1154 | [[package]]
1155 | name = "lexical-write-integer"
1156 | version = "1.0.2"
1157 | source = "registry+https://github.com/rust-lang/crates.io-index"
1158 | checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162"
1159 | dependencies = [
1160 | "lexical-util",
1161 | "static_assertions",
1162 | ]
1163 |
1164 | [[package]]
1165 | name = "libc"
1166 | version = "0.2.159"
1167 | source = "registry+https://github.com/rust-lang/crates.io-index"
1168 | checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
1169 |
1170 | [[package]]
1171 | name = "libduckdb-sys"
1172 | version = "1.3.0"
1173 | source = "registry+https://github.com/rust-lang/crates.io-index"
1174 | checksum = "25d3f1defe457d1ac0fbaef0fe6926953cb33419dd3c8dbac53882d020bee697"
1175 | dependencies = [
1176 | "autocfg",
1177 | "flate2",
1178 | "pkg-config",
1179 | "prettyplease",
1180 | "quote",
1181 | "serde",
1182 | "serde_json",
1183 | "syn 2.0.93",
1184 | "tar",
1185 | "vcpkg",
1186 | ]
1187 |
1188 | [[package]]
1189 | name = "libm"
1190 | version = "0.2.8"
1191 | source = "registry+https://github.com/rust-lang/crates.io-index"
1192 | checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
1193 |
1194 | [[package]]
1195 | name = "libredox"
1196 | version = "0.1.3"
1197 | source = "registry+https://github.com/rust-lang/crates.io-index"
1198 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
1199 | dependencies = [
1200 | "bitflags",
1201 | "libc",
1202 | "redox_syscall",
1203 | ]
1204 |
1205 | [[package]]
1206 | name = "linux-raw-sys"
1207 | version = "0.4.14"
1208 | source = "registry+https://github.com/rust-lang/crates.io-index"
1209 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
1210 |
1211 | [[package]]
1212 | name = "litemap"
1213 | version = "0.7.4"
1214 | source = "registry+https://github.com/rust-lang/crates.io-index"
1215 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
1216 |
1217 | [[package]]
1218 | name = "log"
1219 | version = "0.4.22"
1220 | source = "registry+https://github.com/rust-lang/crates.io-index"
1221 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
1222 | dependencies = [
1223 | "serde",
1224 | ]
1225 |
1226 | [[package]]
1227 | name = "lz4"
1228 | version = "1.28.0"
1229 | source = "registry+https://github.com/rust-lang/crates.io-index"
1230 | checksum = "4d1febb2b4a79ddd1980eede06a8f7902197960aa0383ffcfdd62fe723036725"
1231 | dependencies = [
1232 | "lz4-sys",
1233 | ]
1234 |
1235 | [[package]]
1236 | name = "lz4-sys"
1237 | version = "1.11.1+lz4-1.10.0"
1238 | source = "registry+https://github.com/rust-lang/crates.io-index"
1239 | checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6"
1240 | dependencies = [
1241 | "cc",
1242 | "libc",
1243 | ]
1244 |
1245 | [[package]]
1246 | name = "match_cfg"
1247 | version = "0.1.0"
1248 | source = "registry+https://github.com/rust-lang/crates.io-index"
1249 | checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4"
1250 |
1251 | [[package]]
1252 | name = "memchr"
1253 | version = "2.7.4"
1254 | source = "registry+https://github.com/rust-lang/crates.io-index"
1255 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
1256 |
1257 | [[package]]
1258 | name = "miniz_oxide"
1259 | version = "0.8.0"
1260 | source = "registry+https://github.com/rust-lang/crates.io-index"
1261 | checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
1262 | dependencies = [
1263 | "adler2",
1264 | ]
1265 |
1266 | [[package]]
1267 | name = "mio"
1268 | version = "1.0.3"
1269 | source = "registry+https://github.com/rust-lang/crates.io-index"
1270 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
1271 | dependencies = [
1272 | "libc",
1273 | "wasi",
1274 | "windows-sys 0.52.0",
1275 | ]
1276 |
1277 | [[package]]
1278 | name = "native-tls"
1279 | version = "0.2.12"
1280 | source = "registry+https://github.com/rust-lang/crates.io-index"
1281 | checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466"
1282 | dependencies = [
1283 | "libc",
1284 | "log",
1285 | "openssl",
1286 | "openssl-probe",
1287 | "openssl-sys",
1288 | "schannel",
1289 | "security-framework",
1290 | "security-framework-sys",
1291 | "tempfile",
1292 | ]
1293 |
1294 | [[package]]
1295 | name = "num"
1296 | version = "0.4.3"
1297 | source = "registry+https://github.com/rust-lang/crates.io-index"
1298 | checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
1299 | dependencies = [
1300 | "num-bigint",
1301 | "num-complex",
1302 | "num-integer",
1303 | "num-iter",
1304 | "num-rational",
1305 | "num-traits",
1306 | ]
1307 |
1308 | [[package]]
1309 | name = "num-bigint"
1310 | version = "0.4.6"
1311 | source = "registry+https://github.com/rust-lang/crates.io-index"
1312 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
1313 | dependencies = [
1314 | "num-integer",
1315 | "num-traits",
1316 | ]
1317 |
1318 | [[package]]
1319 | name = "num-complex"
1320 | version = "0.4.6"
1321 | source = "registry+https://github.com/rust-lang/crates.io-index"
1322 | checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
1323 | dependencies = [
1324 | "num-traits",
1325 | ]
1326 |
1327 | [[package]]
1328 | name = "num-integer"
1329 | version = "0.1.46"
1330 | source = "registry+https://github.com/rust-lang/crates.io-index"
1331 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
1332 | dependencies = [
1333 | "num-traits",
1334 | ]
1335 |
1336 | [[package]]
1337 | name = "num-iter"
1338 | version = "0.1.45"
1339 | source = "registry+https://github.com/rust-lang/crates.io-index"
1340 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
1341 | dependencies = [
1342 | "autocfg",
1343 | "num-integer",
1344 | "num-traits",
1345 | ]
1346 |
1347 | [[package]]
1348 | name = "num-rational"
1349 | version = "0.4.2"
1350 | source = "registry+https://github.com/rust-lang/crates.io-index"
1351 | checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
1352 | dependencies = [
1353 | "num-bigint",
1354 | "num-integer",
1355 | "num-traits",
1356 | ]
1357 |
1358 | [[package]]
1359 | name = "num-traits"
1360 | version = "0.2.19"
1361 | source = "registry+https://github.com/rust-lang/crates.io-index"
1362 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1363 | dependencies = [
1364 | "autocfg",
1365 | "libm",
1366 | ]
1367 |
1368 | [[package]]
1369 | name = "object"
1370 | version = "0.36.7"
1371 | source = "registry+https://github.com/rust-lang/crates.io-index"
1372 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
1373 | dependencies = [
1374 | "memchr",
1375 | ]
1376 |
1377 | [[package]]
1378 | name = "once_cell"
1379 | version = "1.20.2"
1380 | source = "registry+https://github.com/rust-lang/crates.io-index"
1381 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
1382 |
1383 | [[package]]
1384 | name = "openssl"
1385 | version = "0.10.68"
1386 | source = "registry+https://github.com/rust-lang/crates.io-index"
1387 | checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5"
1388 | dependencies = [
1389 | "bitflags",
1390 | "cfg-if",
1391 | "foreign-types",
1392 | "libc",
1393 | "once_cell",
1394 | "openssl-macros",
1395 | "openssl-sys",
1396 | ]
1397 |
1398 | [[package]]
1399 | name = "openssl-macros"
1400 | version = "0.1.1"
1401 | source = "registry+https://github.com/rust-lang/crates.io-index"
1402 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
1403 | dependencies = [
1404 | "proc-macro2",
1405 | "quote",
1406 | "syn 2.0.93",
1407 | ]
1408 |
1409 | [[package]]
1410 | name = "openssl-probe"
1411 | version = "0.1.5"
1412 | source = "registry+https://github.com/rust-lang/crates.io-index"
1413 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
1414 |
1415 | [[package]]
1416 | name = "openssl-src"
1417 | version = "300.4.1+3.4.0"
1418 | source = "registry+https://github.com/rust-lang/crates.io-index"
1419 | checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c"
1420 | dependencies = [
1421 | "cc",
1422 | ]
1423 |
1424 | [[package]]
1425 | name = "openssl-sys"
1426 | version = "0.9.104"
1427 | source = "registry+https://github.com/rust-lang/crates.io-index"
1428 | checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741"
1429 | dependencies = [
1430 | "cc",
1431 | "libc",
1432 | "openssl-src",
1433 | "pkg-config",
1434 | "vcpkg",
1435 | ]
1436 |
1437 | [[package]]
1438 | name = "parse-zoneinfo"
1439 | version = "0.3.1"
1440 | source = "registry+https://github.com/rust-lang/crates.io-index"
1441 | checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24"
1442 | dependencies = [
1443 | "regex",
1444 | ]
1445 |
1446 | [[package]]
1447 | name = "percent-encoding"
1448 | version = "2.3.1"
1449 | source = "registry+https://github.com/rust-lang/crates.io-index"
1450 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1451 |
1452 | [[package]]
1453 | name = "phf"
1454 | version = "0.11.2"
1455 | source = "registry+https://github.com/rust-lang/crates.io-index"
1456 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
1457 | dependencies = [
1458 | "phf_shared",
1459 | ]
1460 |
1461 | [[package]]
1462 | name = "phf_codegen"
1463 | version = "0.11.2"
1464 | source = "registry+https://github.com/rust-lang/crates.io-index"
1465 | checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
1466 | dependencies = [
1467 | "phf_generator",
1468 | "phf_shared",
1469 | ]
1470 |
1471 | [[package]]
1472 | name = "phf_generator"
1473 | version = "0.11.2"
1474 | source = "registry+https://github.com/rust-lang/crates.io-index"
1475 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
1476 | dependencies = [
1477 | "phf_shared",
1478 | "rand",
1479 | ]
1480 |
1481 | [[package]]
1482 | name = "phf_shared"
1483 | version = "0.11.2"
1484 | source = "registry+https://github.com/rust-lang/crates.io-index"
1485 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
1486 | dependencies = [
1487 | "siphasher",
1488 | ]
1489 |
1490 | [[package]]
1491 | name = "pin-project"
1492 | version = "1.1.7"
1493 | source = "registry+https://github.com/rust-lang/crates.io-index"
1494 | checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95"
1495 | dependencies = [
1496 | "pin-project-internal",
1497 | ]
1498 |
1499 | [[package]]
1500 | name = "pin-project-internal"
1501 | version = "1.1.7"
1502 | source = "registry+https://github.com/rust-lang/crates.io-index"
1503 | checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c"
1504 | dependencies = [
1505 | "proc-macro2",
1506 | "quote",
1507 | "syn 2.0.93",
1508 | ]
1509 |
1510 | [[package]]
1511 | name = "pin-project-lite"
1512 | version = "0.2.15"
1513 | source = "registry+https://github.com/rust-lang/crates.io-index"
1514 | checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff"
1515 |
1516 | [[package]]
1517 | name = "pin-utils"
1518 | version = "0.1.0"
1519 | source = "registry+https://github.com/rust-lang/crates.io-index"
1520 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
1521 |
1522 | [[package]]
1523 | name = "pkg-config"
1524 | version = "0.3.31"
1525 | source = "registry+https://github.com/rust-lang/crates.io-index"
1526 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
1527 |
1528 | [[package]]
1529 | name = "ppv-lite86"
1530 | version = "0.2.20"
1531 | source = "registry+https://github.com/rust-lang/crates.io-index"
1532 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
1533 | dependencies = [
1534 | "zerocopy",
1535 | ]
1536 |
1537 | [[package]]
1538 | name = "prettyplease"
1539 | version = "0.2.22"
1540 | source = "registry+https://github.com/rust-lang/crates.io-index"
1541 | checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba"
1542 | dependencies = [
1543 | "proc-macro2",
1544 | "syn 2.0.93",
1545 | ]
1546 |
1547 | [[package]]
1548 | name = "proc-macro-crate"
1549 | version = "3.2.0"
1550 | source = "registry+https://github.com/rust-lang/crates.io-index"
1551 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
1552 | dependencies = [
1553 | "toml_edit",
1554 | ]
1555 |
1556 | [[package]]
1557 | name = "proc-macro-error"
1558 | version = "1.0.4"
1559 | source = "registry+https://github.com/rust-lang/crates.io-index"
1560 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
1561 | dependencies = [
1562 | "proc-macro-error-attr",
1563 | "proc-macro2",
1564 | "quote",
1565 | "version_check",
1566 | ]
1567 |
1568 | [[package]]
1569 | name = "proc-macro-error-attr"
1570 | version = "1.0.4"
1571 | source = "registry+https://github.com/rust-lang/crates.io-index"
1572 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
1573 | dependencies = [
1574 | "proc-macro2",
1575 | "quote",
1576 | "version_check",
1577 | ]
1578 |
1579 | [[package]]
1580 | name = "proc-macro2"
1581 | version = "1.0.92"
1582 | source = "registry+https://github.com/rust-lang/crates.io-index"
1583 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
1584 | dependencies = [
1585 | "unicode-ident",
1586 | ]
1587 |
1588 | [[package]]
1589 | name = "ptr_meta"
1590 | version = "0.1.4"
1591 | source = "registry+https://github.com/rust-lang/crates.io-index"
1592 | checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
1593 | dependencies = [
1594 | "ptr_meta_derive",
1595 | ]
1596 |
1597 | [[package]]
1598 | name = "ptr_meta_derive"
1599 | version = "0.1.4"
1600 | source = "registry+https://github.com/rust-lang/crates.io-index"
1601 | checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
1602 | dependencies = [
1603 | "proc-macro2",
1604 | "quote",
1605 | "syn 1.0.109",
1606 | ]
1607 |
1608 | [[package]]
1609 | name = "quote"
1610 | version = "1.0.37"
1611 | source = "registry+https://github.com/rust-lang/crates.io-index"
1612 | checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
1613 | dependencies = [
1614 | "proc-macro2",
1615 | ]
1616 |
1617 | [[package]]
1618 | name = "radium"
1619 | version = "0.7.0"
1620 | source = "registry+https://github.com/rust-lang/crates.io-index"
1621 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
1622 |
1623 | [[package]]
1624 | name = "rand"
1625 | version = "0.8.5"
1626 | source = "registry+https://github.com/rust-lang/crates.io-index"
1627 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
1628 | dependencies = [
1629 | "libc",
1630 | "rand_chacha",
1631 | "rand_core",
1632 | ]
1633 |
1634 | [[package]]
1635 | name = "rand_chacha"
1636 | version = "0.3.1"
1637 | source = "registry+https://github.com/rust-lang/crates.io-index"
1638 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1639 | dependencies = [
1640 | "ppv-lite86",
1641 | "rand_core",
1642 | ]
1643 |
1644 | [[package]]
1645 | name = "rand_core"
1646 | version = "0.6.4"
1647 | source = "registry+https://github.com/rust-lang/crates.io-index"
1648 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1649 | dependencies = [
1650 | "getrandom",
1651 | ]
1652 |
1653 | [[package]]
1654 | name = "redox_syscall"
1655 | version = "0.5.7"
1656 | source = "registry+https://github.com/rust-lang/crates.io-index"
1657 | checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f"
1658 | dependencies = [
1659 | "bitflags",
1660 | ]
1661 |
1662 | [[package]]
1663 | name = "regex"
1664 | version = "1.11.0"
1665 | source = "registry+https://github.com/rust-lang/crates.io-index"
1666 | checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
1667 | dependencies = [
1668 | "aho-corasick",
1669 | "memchr",
1670 | "regex-automata",
1671 | "regex-syntax",
1672 | ]
1673 |
1674 | [[package]]
1675 | name = "regex-automata"
1676 | version = "0.4.8"
1677 | source = "registry+https://github.com/rust-lang/crates.io-index"
1678 | checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
1679 | dependencies = [
1680 | "aho-corasick",
1681 | "memchr",
1682 | "regex-syntax",
1683 | ]
1684 |
1685 | [[package]]
1686 | name = "regex-syntax"
1687 | version = "0.8.5"
1688 | source = "registry+https://github.com/rust-lang/crates.io-index"
1689 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1690 |
1691 | [[package]]
1692 | name = "rend"
1693 | version = "0.4.2"
1694 | source = "registry+https://github.com/rust-lang/crates.io-index"
1695 | checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"
1696 | dependencies = [
1697 | "bytecheck",
1698 | ]
1699 |
1700 | [[package]]
1701 | name = "rkyv"
1702 | version = "0.7.45"
1703 | source = "registry+https://github.com/rust-lang/crates.io-index"
1704 | checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b"
1705 | dependencies = [
1706 | "bitvec",
1707 | "bytecheck",
1708 | "bytes",
1709 | "hashbrown 0.12.3",
1710 | "ptr_meta",
1711 | "rend",
1712 | "rkyv_derive",
1713 | "seahash",
1714 | "tinyvec",
1715 | "uuid",
1716 | ]
1717 |
1718 | [[package]]
1719 | name = "rkyv_derive"
1720 | version = "0.7.45"
1721 | source = "registry+https://github.com/rust-lang/crates.io-index"
1722 | checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0"
1723 | dependencies = [
1724 | "proc-macro2",
1725 | "quote",
1726 | "syn 1.0.109",
1727 | ]
1728 |
1729 | [[package]]
1730 | name = "rust_decimal"
1731 | version = "1.36.0"
1732 | source = "registry+https://github.com/rust-lang/crates.io-index"
1733 | checksum = "b082d80e3e3cc52b2ed634388d436fe1f4de6af5786cc2de9ba9737527bdf555"
1734 | dependencies = [
1735 | "arrayvec",
1736 | "borsh",
1737 | "bytes",
1738 | "num-traits",
1739 | "rand",
1740 | "rkyv",
1741 | "serde",
1742 | "serde_json",
1743 | ]
1744 |
1745 | [[package]]
1746 | name = "rustc-demangle"
1747 | version = "0.1.24"
1748 | source = "registry+https://github.com/rust-lang/crates.io-index"
1749 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
1750 |
1751 | [[package]]
1752 | name = "rustix"
1753 | version = "0.38.37"
1754 | source = "registry+https://github.com/rust-lang/crates.io-index"
1755 | checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811"
1756 | dependencies = [
1757 | "bitflags",
1758 | "errno",
1759 | "libc",
1760 | "linux-raw-sys",
1761 | "windows-sys 0.52.0",
1762 | ]
1763 |
1764 | [[package]]
1765 | name = "rustversion"
1766 | version = "1.0.17"
1767 | source = "registry+https://github.com/rust-lang/crates.io-index"
1768 | checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
1769 |
1770 | [[package]]
1771 | name = "ryu"
1772 | version = "1.0.18"
1773 | source = "registry+https://github.com/rust-lang/crates.io-index"
1774 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
1775 |
1776 | [[package]]
1777 | name = "schannel"
1778 | version = "0.1.27"
1779 | source = "registry+https://github.com/rust-lang/crates.io-index"
1780 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1781 | dependencies = [
1782 | "windows-sys 0.59.0",
1783 | ]
1784 |
1785 | [[package]]
1786 | name = "seahash"
1787 | version = "4.1.0"
1788 | source = "registry+https://github.com/rust-lang/crates.io-index"
1789 | checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
1790 |
1791 | [[package]]
1792 | name = "security-framework"
1793 | version = "2.11.1"
1794 | source = "registry+https://github.com/rust-lang/crates.io-index"
1795 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1796 | dependencies = [
1797 | "bitflags",
1798 | "core-foundation",
1799 | "core-foundation-sys",
1800 | "libc",
1801 | "security-framework-sys",
1802 | ]
1803 |
1804 | [[package]]
1805 | name = "security-framework-sys"
1806 | version = "2.13.0"
1807 | source = "registry+https://github.com/rust-lang/crates.io-index"
1808 | checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5"
1809 | dependencies = [
1810 | "core-foundation-sys",
1811 | "libc",
1812 | ]
1813 |
1814 | [[package]]
1815 | name = "serde"
1816 | version = "1.0.217"
1817 | source = "registry+https://github.com/rust-lang/crates.io-index"
1818 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
1819 | dependencies = [
1820 | "serde_derive",
1821 | ]
1822 |
1823 | [[package]]
1824 | name = "serde_derive"
1825 | version = "1.0.217"
1826 | source = "registry+https://github.com/rust-lang/crates.io-index"
1827 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
1828 | dependencies = [
1829 | "proc-macro2",
1830 | "quote",
1831 | "syn 2.0.93",
1832 | ]
1833 |
1834 | [[package]]
1835 | name = "serde_json"
1836 | version = "1.0.134"
1837 | source = "registry+https://github.com/rust-lang/crates.io-index"
1838 | checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d"
1839 | dependencies = [
1840 | "itoa",
1841 | "memchr",
1842 | "ryu",
1843 | "serde",
1844 | ]
1845 |
1846 | [[package]]
1847 | name = "shlex"
1848 | version = "1.3.0"
1849 | source = "registry+https://github.com/rust-lang/crates.io-index"
1850 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1851 |
1852 | [[package]]
1853 | name = "simdutf8"
1854 | version = "0.1.5"
1855 | source = "registry+https://github.com/rust-lang/crates.io-index"
1856 | checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
1857 |
1858 | [[package]]
1859 | name = "siphasher"
1860 | version = "0.3.11"
1861 | source = "registry+https://github.com/rust-lang/crates.io-index"
1862 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
1863 |
1864 | [[package]]
1865 | name = "slab"
1866 | version = "0.4.9"
1867 | source = "registry+https://github.com/rust-lang/crates.io-index"
1868 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
1869 | dependencies = [
1870 | "autocfg",
1871 | ]
1872 |
1873 | [[package]]
1874 | name = "smallvec"
1875 | version = "1.13.2"
1876 | source = "registry+https://github.com/rust-lang/crates.io-index"
1877 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
1878 |
1879 | [[package]]
1880 | name = "socket2"
1881 | version = "0.5.8"
1882 | source = "registry+https://github.com/rust-lang/crates.io-index"
1883 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
1884 | dependencies = [
1885 | "libc",
1886 | "windows-sys 0.52.0",
1887 | ]
1888 |
1889 | [[package]]
1890 | name = "stable_deref_trait"
1891 | version = "1.2.0"
1892 | source = "registry+https://github.com/rust-lang/crates.io-index"
1893 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
1894 |
1895 | [[package]]
1896 | name = "static_assertions"
1897 | version = "1.1.0"
1898 | source = "registry+https://github.com/rust-lang/crates.io-index"
1899 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
1900 |
1901 | [[package]]
1902 | name = "strsim"
1903 | version = "0.11.1"
1904 | source = "registry+https://github.com/rust-lang/crates.io-index"
1905 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
1906 |
1907 | [[package]]
1908 | name = "strum"
1909 | version = "0.25.0"
1910 | source = "registry+https://github.com/rust-lang/crates.io-index"
1911 | checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125"
1912 | dependencies = [
1913 | "strum_macros 0.25.3",
1914 | ]
1915 |
1916 | [[package]]
1917 | name = "strum"
1918 | version = "0.26.3"
1919 | source = "registry+https://github.com/rust-lang/crates.io-index"
1920 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
1921 |
1922 | [[package]]
1923 | name = "strum_macros"
1924 | version = "0.25.3"
1925 | source = "registry+https://github.com/rust-lang/crates.io-index"
1926 | checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
1927 | dependencies = [
1928 | "heck 0.4.1",
1929 | "proc-macro2",
1930 | "quote",
1931 | "rustversion",
1932 | "syn 2.0.93",
1933 | ]
1934 |
1935 | [[package]]
1936 | name = "strum_macros"
1937 | version = "0.26.4"
1938 | source = "registry+https://github.com/rust-lang/crates.io-index"
1939 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
1940 | dependencies = [
1941 | "heck 0.5.0",
1942 | "proc-macro2",
1943 | "quote",
1944 | "rustversion",
1945 | "syn 2.0.93",
1946 | ]
1947 |
1948 | [[package]]
1949 | name = "syn"
1950 | version = "1.0.109"
1951 | source = "registry+https://github.com/rust-lang/crates.io-index"
1952 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
1953 | dependencies = [
1954 | "proc-macro2",
1955 | "quote",
1956 | "unicode-ident",
1957 | ]
1958 |
1959 | [[package]]
1960 | name = "syn"
1961 | version = "2.0.93"
1962 | source = "registry+https://github.com/rust-lang/crates.io-index"
1963 | checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058"
1964 | dependencies = [
1965 | "proc-macro2",
1966 | "quote",
1967 | "unicode-ident",
1968 | ]
1969 |
1970 | [[package]]
1971 | name = "syn_derive"
1972 | version = "0.1.8"
1973 | source = "registry+https://github.com/rust-lang/crates.io-index"
1974 | checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
1975 | dependencies = [
1976 | "proc-macro-error",
1977 | "proc-macro2",
1978 | "quote",
1979 | "syn 2.0.93",
1980 | ]
1981 |
1982 | [[package]]
1983 | name = "synstructure"
1984 | version = "0.13.1"
1985 | source = "registry+https://github.com/rust-lang/crates.io-index"
1986 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
1987 | dependencies = [
1988 | "proc-macro2",
1989 | "quote",
1990 | "syn 2.0.93",
1991 | ]
1992 |
1993 | [[package]]
1994 | name = "tap"
1995 | version = "1.0.1"
1996 | source = "registry+https://github.com/rust-lang/crates.io-index"
1997 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
1998 |
1999 | [[package]]
2000 | name = "tar"
2001 | version = "0.4.42"
2002 | source = "registry+https://github.com/rust-lang/crates.io-index"
2003 | checksum = "4ff6c40d3aedb5e06b57c6f669ad17ab063dd1e63d977c6a88e7f4dfa4f04020"
2004 | dependencies = [
2005 | "filetime",
2006 | "libc",
2007 | "xattr",
2008 | ]
2009 |
2010 | [[package]]
2011 | name = "tempfile"
2012 | version = "3.13.0"
2013 | source = "registry+https://github.com/rust-lang/crates.io-index"
2014 | checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b"
2015 | dependencies = [
2016 | "cfg-if",
2017 | "fastrand",
2018 | "once_cell",
2019 | "rustix",
2020 | "windows-sys 0.59.0",
2021 | ]
2022 |
2023 | [[package]]
2024 | name = "thiserror"
2025 | version = "1.0.65"
2026 | source = "registry+https://github.com/rust-lang/crates.io-index"
2027 | checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5"
2028 | dependencies = [
2029 | "thiserror-impl",
2030 | ]
2031 |
2032 | [[package]]
2033 | name = "thiserror-impl"
2034 | version = "1.0.65"
2035 | source = "registry+https://github.com/rust-lang/crates.io-index"
2036 | checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602"
2037 | dependencies = [
2038 | "proc-macro2",
2039 | "quote",
2040 | "syn 2.0.93",
2041 | ]
2042 |
2043 | [[package]]
2044 | name = "tiny-keccak"
2045 | version = "2.0.2"
2046 | source = "registry+https://github.com/rust-lang/crates.io-index"
2047 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
2048 | dependencies = [
2049 | "crunchy",
2050 | ]
2051 |
2052 | [[package]]
2053 | name = "tinystr"
2054 | version = "0.7.6"
2055 | source = "registry+https://github.com/rust-lang/crates.io-index"
2056 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
2057 | dependencies = [
2058 | "displaydoc",
2059 | "zerovec",
2060 | ]
2061 |
2062 | [[package]]
2063 | name = "tinyvec"
2064 | version = "1.8.0"
2065 | source = "registry+https://github.com/rust-lang/crates.io-index"
2066 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
2067 | dependencies = [
2068 | "tinyvec_macros",
2069 | ]
2070 |
2071 | [[package]]
2072 | name = "tinyvec_macros"
2073 | version = "0.1.1"
2074 | source = "registry+https://github.com/rust-lang/crates.io-index"
2075 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
2076 |
2077 | [[package]]
2078 | name = "tokio"
2079 | version = "1.42.0"
2080 | source = "registry+https://github.com/rust-lang/crates.io-index"
2081 | checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551"
2082 | dependencies = [
2083 | "backtrace",
2084 | "bytes",
2085 | "libc",
2086 | "mio",
2087 | "pin-project-lite",
2088 | "socket2",
2089 | "windows-sys 0.52.0",
2090 | ]
2091 |
2092 | [[package]]
2093 | name = "tokio-native-tls"
2094 | version = "0.3.1"
2095 | source = "registry+https://github.com/rust-lang/crates.io-index"
2096 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
2097 | dependencies = [
2098 | "native-tls",
2099 | "tokio",
2100 | ]
2101 |
2102 | [[package]]
2103 | name = "toml_datetime"
2104 | version = "0.6.8"
2105 | source = "registry+https://github.com/rust-lang/crates.io-index"
2106 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
2107 |
2108 | [[package]]
2109 | name = "toml_edit"
2110 | version = "0.22.22"
2111 | source = "registry+https://github.com/rust-lang/crates.io-index"
2112 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
2113 | dependencies = [
2114 | "indexmap",
2115 | "toml_datetime",
2116 | "winnow",
2117 | ]
2118 |
2119 | [[package]]
2120 | name = "unicode-ident"
2121 | version = "1.0.13"
2122 | source = "registry+https://github.com/rust-lang/crates.io-index"
2123 | checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
2124 |
2125 | [[package]]
2126 | name = "unicode-width"
2127 | version = "0.1.14"
2128 | source = "registry+https://github.com/rust-lang/crates.io-index"
2129 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
2130 |
2131 | [[package]]
2132 | name = "url"
2133 | version = "2.5.4"
2134 | source = "registry+https://github.com/rust-lang/crates.io-index"
2135 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
2136 | dependencies = [
2137 | "form_urlencoded",
2138 | "idna",
2139 | "percent-encoding",
2140 | ]
2141 |
2142 | [[package]]
2143 | name = "utf16_iter"
2144 | version = "1.0.5"
2145 | source = "registry+https://github.com/rust-lang/crates.io-index"
2146 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
2147 |
2148 | [[package]]
2149 | name = "utf8_iter"
2150 | version = "1.0.4"
2151 | source = "registry+https://github.com/rust-lang/crates.io-index"
2152 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2153 |
2154 | [[package]]
2155 | name = "uuid"
2156 | version = "1.10.0"
2157 | source = "registry+https://github.com/rust-lang/crates.io-index"
2158 | checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
2159 |
2160 | [[package]]
2161 | name = "vcpkg"
2162 | version = "0.2.15"
2163 | source = "registry+https://github.com/rust-lang/crates.io-index"
2164 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
2165 |
2166 | [[package]]
2167 | name = "version_check"
2168 | version = "0.9.5"
2169 | source = "registry+https://github.com/rust-lang/crates.io-index"
2170 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2171 |
2172 | [[package]]
2173 | name = "wasi"
2174 | version = "0.11.0+wasi-snapshot-preview1"
2175 | source = "registry+https://github.com/rust-lang/crates.io-index"
2176 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
2177 |
2178 | [[package]]
2179 | name = "wasm-bindgen"
2180 | version = "0.2.93"
2181 | source = "registry+https://github.com/rust-lang/crates.io-index"
2182 | checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
2183 | dependencies = [
2184 | "cfg-if",
2185 | "once_cell",
2186 | "wasm-bindgen-macro",
2187 | ]
2188 |
2189 | [[package]]
2190 | name = "wasm-bindgen-backend"
2191 | version = "0.2.93"
2192 | source = "registry+https://github.com/rust-lang/crates.io-index"
2193 | checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
2194 | dependencies = [
2195 | "bumpalo",
2196 | "log",
2197 | "once_cell",
2198 | "proc-macro2",
2199 | "quote",
2200 | "syn 2.0.93",
2201 | "wasm-bindgen-shared",
2202 | ]
2203 |
2204 | [[package]]
2205 | name = "wasm-bindgen-macro"
2206 | version = "0.2.93"
2207 | source = "registry+https://github.com/rust-lang/crates.io-index"
2208 | checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
2209 | dependencies = [
2210 | "quote",
2211 | "wasm-bindgen-macro-support",
2212 | ]
2213 |
2214 | [[package]]
2215 | name = "wasm-bindgen-macro-support"
2216 | version = "0.2.93"
2217 | source = "registry+https://github.com/rust-lang/crates.io-index"
2218 | checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
2219 | dependencies = [
2220 | "proc-macro2",
2221 | "quote",
2222 | "syn 2.0.93",
2223 | "wasm-bindgen-backend",
2224 | "wasm-bindgen-shared",
2225 | ]
2226 |
2227 | [[package]]
2228 | name = "wasm-bindgen-shared"
2229 | version = "0.2.93"
2230 | source = "registry+https://github.com/rust-lang/crates.io-index"
2231 | checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
2232 |
2233 | [[package]]
2234 | name = "winapi"
2235 | version = "0.3.9"
2236 | source = "registry+https://github.com/rust-lang/crates.io-index"
2237 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2238 | dependencies = [
2239 | "winapi-i686-pc-windows-gnu",
2240 | "winapi-x86_64-pc-windows-gnu",
2241 | ]
2242 |
2243 | [[package]]
2244 | name = "winapi-i686-pc-windows-gnu"
2245 | version = "0.4.0"
2246 | source = "registry+https://github.com/rust-lang/crates.io-index"
2247 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2248 |
2249 | [[package]]
2250 | name = "winapi-x86_64-pc-windows-gnu"
2251 | version = "0.4.0"
2252 | source = "registry+https://github.com/rust-lang/crates.io-index"
2253 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2254 |
2255 | [[package]]
2256 | name = "windows-core"
2257 | version = "0.52.0"
2258 | source = "registry+https://github.com/rust-lang/crates.io-index"
2259 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
2260 | dependencies = [
2261 | "windows-targets",
2262 | ]
2263 |
2264 | [[package]]
2265 | name = "windows-link"
2266 | version = "0.1.1"
2267 | source = "registry+https://github.com/rust-lang/crates.io-index"
2268 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
2269 |
2270 | [[package]]
2271 | name = "windows-sys"
2272 | version = "0.52.0"
2273 | source = "registry+https://github.com/rust-lang/crates.io-index"
2274 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2275 | dependencies = [
2276 | "windows-targets",
2277 | ]
2278 |
2279 | [[package]]
2280 | name = "windows-sys"
2281 | version = "0.59.0"
2282 | source = "registry+https://github.com/rust-lang/crates.io-index"
2283 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2284 | dependencies = [
2285 | "windows-targets",
2286 | ]
2287 |
2288 | [[package]]
2289 | name = "windows-targets"
2290 | version = "0.52.6"
2291 | source = "registry+https://github.com/rust-lang/crates.io-index"
2292 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2293 | dependencies = [
2294 | "windows_aarch64_gnullvm",
2295 | "windows_aarch64_msvc",
2296 | "windows_i686_gnu",
2297 | "windows_i686_gnullvm",
2298 | "windows_i686_msvc",
2299 | "windows_x86_64_gnu",
2300 | "windows_x86_64_gnullvm",
2301 | "windows_x86_64_msvc",
2302 | ]
2303 |
2304 | [[package]]
2305 | name = "windows_aarch64_gnullvm"
2306 | version = "0.52.6"
2307 | source = "registry+https://github.com/rust-lang/crates.io-index"
2308 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2309 |
2310 | [[package]]
2311 | name = "windows_aarch64_msvc"
2312 | version = "0.52.6"
2313 | source = "registry+https://github.com/rust-lang/crates.io-index"
2314 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2315 |
2316 | [[package]]
2317 | name = "windows_i686_gnu"
2318 | version = "0.52.6"
2319 | source = "registry+https://github.com/rust-lang/crates.io-index"
2320 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2321 |
2322 | [[package]]
2323 | name = "windows_i686_gnullvm"
2324 | version = "0.52.6"
2325 | source = "registry+https://github.com/rust-lang/crates.io-index"
2326 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2327 |
2328 | [[package]]
2329 | name = "windows_i686_msvc"
2330 | version = "0.52.6"
2331 | source = "registry+https://github.com/rust-lang/crates.io-index"
2332 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2333 |
2334 | [[package]]
2335 | name = "windows_x86_64_gnu"
2336 | version = "0.52.6"
2337 | source = "registry+https://github.com/rust-lang/crates.io-index"
2338 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2339 |
2340 | [[package]]
2341 | name = "windows_x86_64_gnullvm"
2342 | version = "0.52.6"
2343 | source = "registry+https://github.com/rust-lang/crates.io-index"
2344 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2345 |
2346 | [[package]]
2347 | name = "windows_x86_64_msvc"
2348 | version = "0.52.6"
2349 | source = "registry+https://github.com/rust-lang/crates.io-index"
2350 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2351 |
2352 | [[package]]
2353 | name = "winnow"
2354 | version = "0.6.20"
2355 | source = "registry+https://github.com/rust-lang/crates.io-index"
2356 | checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
2357 | dependencies = [
2358 | "memchr",
2359 | ]
2360 |
2361 | [[package]]
2362 | name = "write16"
2363 | version = "1.0.0"
2364 | source = "registry+https://github.com/rust-lang/crates.io-index"
2365 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
2366 |
2367 | [[package]]
2368 | name = "writeable"
2369 | version = "0.5.5"
2370 | source = "registry+https://github.com/rust-lang/crates.io-index"
2371 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
2372 |
2373 | [[package]]
2374 | name = "wyz"
2375 | version = "0.5.1"
2376 | source = "registry+https://github.com/rust-lang/crates.io-index"
2377 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
2378 | dependencies = [
2379 | "tap",
2380 | ]
2381 |
2382 | [[package]]
2383 | name = "xattr"
2384 | version = "1.3.1"
2385 | source = "registry+https://github.com/rust-lang/crates.io-index"
2386 | checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f"
2387 | dependencies = [
2388 | "libc",
2389 | "linux-raw-sys",
2390 | "rustix",
2391 | ]
2392 |
2393 | [[package]]
2394 | name = "yoke"
2395 | version = "0.7.5"
2396 | source = "registry+https://github.com/rust-lang/crates.io-index"
2397 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
2398 | dependencies = [
2399 | "serde",
2400 | "stable_deref_trait",
2401 | "yoke-derive",
2402 | "zerofrom",
2403 | ]
2404 |
2405 | [[package]]
2406 | name = "yoke-derive"
2407 | version = "0.7.5"
2408 | source = "registry+https://github.com/rust-lang/crates.io-index"
2409 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
2410 | dependencies = [
2411 | "proc-macro2",
2412 | "quote",
2413 | "syn 2.0.93",
2414 | "synstructure",
2415 | ]
2416 |
2417 | [[package]]
2418 | name = "zerocopy"
2419 | version = "0.7.35"
2420 | source = "registry+https://github.com/rust-lang/crates.io-index"
2421 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
2422 | dependencies = [
2423 | "byteorder",
2424 | "zerocopy-derive",
2425 | ]
2426 |
2427 | [[package]]
2428 | name = "zerocopy-derive"
2429 | version = "0.7.35"
2430 | source = "registry+https://github.com/rust-lang/crates.io-index"
2431 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
2432 | dependencies = [
2433 | "proc-macro2",
2434 | "quote",
2435 | "syn 2.0.93",
2436 | ]
2437 |
2438 | [[package]]
2439 | name = "zerofrom"
2440 | version = "0.1.5"
2441 | source = "registry+https://github.com/rust-lang/crates.io-index"
2442 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
2443 | dependencies = [
2444 | "zerofrom-derive",
2445 | ]
2446 |
2447 | [[package]]
2448 | name = "zerofrom-derive"
2449 | version = "0.1.5"
2450 | source = "registry+https://github.com/rust-lang/crates.io-index"
2451 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
2452 | dependencies = [
2453 | "proc-macro2",
2454 | "quote",
2455 | "syn 2.0.93",
2456 | "synstructure",
2457 | ]
2458 |
2459 | [[package]]
2460 | name = "zerovec"
2461 | version = "0.10.4"
2462 | source = "registry+https://github.com/rust-lang/crates.io-index"
2463 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
2464 | dependencies = [
2465 | "yoke",
2466 | "zerofrom",
2467 | "zerovec-derive",
2468 | ]
2469 |
2470 | [[package]]
2471 | name = "zerovec-derive"
2472 | version = "0.10.3"
2473 | source = "registry+https://github.com/rust-lang/crates.io-index"
2474 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
2475 | dependencies = [
2476 | "proc-macro2",
2477 | "quote",
2478 | "syn 2.0.93",
2479 | ]
2480 |
--------------------------------------------------------------------------------