├── 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()String 24.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 | --------------------------------------------------------------------------------