├── .gitignore
├── .idea
├── codeStyles
│ ├── codeStyleConfig.xml
│ └── Project.xml
├── misc.xml
├── vcs.xml
├── .gitignore
├── modules.xml
├── csv-editor.xml
├── git_toolbox_prj.xml
└── dataSources.xml
├── Cargo.toml
├── table_map_db.iml
├── src
├── errors.rs
├── bin
│ └── main.rs
└── lib.rs
├── README.md
└── Cargo.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 | /another_db.csv
3 | /another_db.sqlite
4 | /db.sqlite
5 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "table_map_db"
3 | version = "0.1.0"
4 | edition = "2024"
5 |
6 | [dependencies]
7 | rusqlite = { version = "0.37.0", features = ["bundled"] }
8 | indexmap = "2.11.0"
9 | anyhow = "1.0.99"
10 | tracing = "0.1.41"
11 | tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
12 | rand = "0.9.2"
13 | csv = "1.3.0"
14 | tokio = { version = "1.47.1", features = ["full"] }
15 | thiserror = "2.0.9"
16 |
--------------------------------------------------------------------------------
/.idea/csv-editor.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
16 |
--------------------------------------------------------------------------------
/table_map_db.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/git_toolbox_prj.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/errors.rs:
--------------------------------------------------------------------------------
1 | use thiserror::Error;
2 |
3 | #[derive(Error, Debug, Clone)]
4 | pub enum DataToolErrors {
5 |
6 |
7 | #[error("Error received: {0}")]
8 | GenericError(String),
9 |
10 | #[error("CSV Error: {0}")]
11 | CsvError(String),
12 | }
13 |
14 | impl From for DataToolErrors {
15 | fn from(value: csv::Error) -> Self {
16 | Self::CsvError(value.to_string())
17 | }
18 | }
19 |
20 | impl From for DataToolErrors {
21 | fn from(value: std::io::Error) -> Self {
22 | Self::GenericError(value.to_string())
23 | }
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SQLite-based Key Value storage for data with dynamic columns
2 |
3 | A simple library for storing data that have dynamic number of columns in a key value based storage.
4 |
5 | Provides an efficient way to export the data as CSV file. async required.
6 |
7 |
8 | ## How to use?
9 |
10 | A sample is provided in `bin/main.rs`
11 |
12 | Additionally, columns can be prioritized to be in the beginning of the row.
13 |
14 | ```rust
15 | async fn export_csv() {
16 | let thrds = match std::thread::available_parallelism() {
17 | Ok(v) => {
18 | info!("using threads: {}", v);
19 | v.get()
20 | }
21 | Err(e) => {
22 | warn!("Failed to get available parallelism count");
23 | 8
24 | }
25 | };
26 | let chunks = how_many / thrds;
27 | match table_map_db::dump_csv(
28 | &mut db,
29 | pp,
30 | chunks,
31 | /// COL1, COL8, and COL4 will be at the beginning of the row
32 | vec![
33 | "COL1",
34 | "COL9",
35 | "COL4",
36 | ],
37 | /// if Column 2, or 3 of the prioritized columns contains the matching word, the row will be skipped
38 | vec![
39 | DKVCSVFilterOption::contains(2, "some"),
40 | DKVCSVFilterOption::contains(3, "doe"),
41 | ],
42 | )
43 | .await
44 | {
45 | Ok(_) => info!("Done Saving csv data"),
46 | Err(e) => error!("Failed to save csv data: {}", e),
47 | }
48 | }
49 |
50 |
51 | ```
52 |
--------------------------------------------------------------------------------
/.idea/dataSources.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | sqlite.xerial
6 | true
7 | org.sqlite.JDBC
8 | jdbc:sqlite:db.sqlite
9 |
10 |
11 |
12 | $ProjectFileDir$
13 |
14 |
15 | sqlite.xerial
16 | true
17 | org.sqlite.JDBC
18 | jdbc:sqlite:$PROJECT_DIR$/another_db.sqlite
19 |
20 |
21 |
22 | $ProjectFileDir$
23 |
24 |
25 | file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/xerial/sqlite-jdbc/3.45.1.0/sqlite-jdbc-3.45.1.0.jar
26 |
27 |
28 | file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/src/bin/main.rs:
--------------------------------------------------------------------------------
1 | use std::path::{Path, PathBuf};
2 | use std::time::Instant;
3 | use rand::{Rng};
4 | use rand::distr::Alphanumeric;
5 | use tracing::{error, info};
6 | use tracing_subscriber::{EnvFilter, FmtSubscriber};
7 | use table_map_db::{dump_csv, dump_db, TableMapDb};
8 |
9 | pub fn generate_random_str(length: usize) -> String {
10 | let rng = rand::rng();
11 | rng.sample_iter(&Alphanumeric)
12 | .take(length)
13 | .map(char::from)
14 | .collect()
15 | }
16 |
17 | /// Sets up simple enviornment based tracing.
18 | /// DO NOT call from library. Always from bin
19 | pub fn set_tracing() -> Result<(), anyhow::Error> {
20 | let subscriber = FmtSubscriber::builder()
21 | .compact()
22 | .with_line_number(true)
23 | .with_env_filter(EnvFilter::from_default_env())
24 | .finish();
25 | tracing::subscriber::set_global_default(subscriber)?;
26 | Ok(())
27 | }
28 |
29 |
30 | #[tokio::main]
31 | async fn main() {
32 | set_tracing().unwrap();
33 | let mut rng = rand::rng();
34 | let p = PathBuf::from("db.sqlite");
35 | let mut db = TableMapDb::new(p);
36 | let mut keys = vec![];
37 | let keys_cnt = 400;
38 | let no_items = 1000;
39 | for _ in 0..keys_cnt {
40 | keys.push(format!("C/{}", generate_random_str(5)));
41 | }
42 | for _ in 0..no_items {
43 | let pr = generate_random_str(5);
44 | if let Err(e) = db.next_row(&pr) {
45 | error!("{:?}", e);
46 | continue;
47 | }
48 | let mut cols = vec![];
49 | for _ in 0..keys_cnt {
50 | let ky = rng.random_range(0..keys_cnt);
51 | if cols.contains(&ky) {
52 | continue;
53 | }
54 | cols.push(ky.clone());
55 | let vl = generate_random_str(10);
56 | db.insert(&keys[ky], &vl).unwrap()
57 | }
58 | }
59 | info!("{}", db.how_many_items().unwrap());
60 | let instant = Instant::now();
61 | dump_db(&mut db, Path::new("another_db.sqlite"), 100, vec![]).await.unwrap();
62 | info!("sqlite: {}", instant.elapsed().as_secs());
63 |
64 | let instant = Instant::now();
65 | dump_csv(&mut db, Path::new("another_db.csv"), 100, vec![]).await.unwrap();
66 | info!("csv: {}", instant.elapsed().as_secs());
67 | }
--------------------------------------------------------------------------------
/src/lib.rs:
--------------------------------------------------------------------------------
1 | use indexmap::IndexMap;
2 | use rusqlite::config::DbConfig;
3 | use rusqlite::{params_from_iter, Connection, OpenFlags};
4 | use std::collections::HashSet;
5 | use std::fs;
6 | use std::path::{Path, PathBuf};
7 | use std::slice::Chunks;
8 | use tokio::task::{JoinHandle, JoinSet};
9 | use tokio::time::Instant;
10 | use tracing::{error, info, trace, warn};
11 | use crate::errors::DataToolErrors;
12 |
13 | pub mod errors;
14 |
15 | const KEY_TABLE: &str = r#"
16 | PRAGMA temp_store = MEMORY; PRAGMA journal_mode = WAL; PRAGMA synchronous = OFF;
17 |
18 | BEGIN;
19 | create table if not exists item_data
20 | (
21 | id integer not null
22 | constraint key_val_pk
23 | primary key autoincrement,
24 | item_val TEXT
25 | constraint item_data_pk
26 | unique
27 | );
28 |
29 | create table if not exists data_columns
30 | (
31 | id integer not null
32 | constraint key_val_pk
33 | primary key autoincrement,
34 | key text,
35 | value text,
36 | item_id int
37 | constraint data_columns_item_data_id_fk
38 | references item_data
39 | on update cascade on delete cascade
40 | );
41 |
42 | delete from item_data;
43 | COMMIT;
44 | "#;
45 |
46 | #[derive(Debug)]
47 | struct ColumnDef(String);
48 |
49 | #[derive(Debug)]
50 | pub struct ItemData {
51 | id: i64,
52 | item_val: String,
53 | }
54 |
55 | /// Used as temporary key value storage.
56 | /// `item_data` -> Stores item (id, item_val)
57 | /// `data_columns` -> Data belonging to item, stored as key, value
58 | ///
59 | /// ## Caution
60 | /// As the settings are for performance instead of consistency,
61 | /// it has a high probability of getting corrupted if the program closes unexpectedly,
62 | /// and the db file will be deleted, if so.
63 | /// So, This must not be used for persistent storage.
64 | ///
65 | pub struct TableMapDb {
66 | db_file: PathBuf,
67 | pub connection: Connection,
68 | columns: HashSet,
69 | current_id: Option,
70 | current_row_iter: Option>,
71 | }
72 |
73 | impl TableMapDb {
74 | /// Tries to open the database file, the setting being used might corrupt the database
75 | /// so remove the file, IF the database seems corrupt. This will also create the required
76 | /// tables if they do not exist.
77 | /// If the tables exist, it will clear the data
78 | pub fn new(db_file: PathBuf) -> Self {
79 | if db_file.exists() {
80 | warn!("Removing db file: {:?}", db_file);
81 | fs::remove_file(&db_file).unwrap();
82 | }
83 | let mut connection = Connection::open(&db_file).unwrap();
84 | if let Err(e) = connection.execute_batch(KEY_TABLE) {
85 | panic!("{:?} {}", db_file, e);
86 | }
87 | info!("all good, db is ready");
88 | Self {
89 | db_file,
90 | connection,
91 | columns: Default::default(),
92 | current_id: None,
93 | current_row_iter: None,
94 | }
95 | }
96 |
97 | /// count the total number of items in the `item_data` table
98 | pub fn how_many_items(&mut self) -> Result {
99 | let mut stmt = self
100 | .connection
101 | .prepare_cached("select count(item_val) from item_data")
102 | .unwrap();
103 | stmt.query_row([], |r| Ok(r.get(0)?))
104 | .map_err(|e| DataToolErrors::GenericError(e.to_string()))
105 | }
106 |
107 | pub fn db_file(&self) -> PathBuf {
108 | self.db_file.clone()
109 | }
110 |
111 | pub fn read_only_conn(&self) -> Connection {
112 | Connection::open_with_flags(&self.db_file, OpenFlags::SQLITE_OPEN_READ_ONLY).unwrap()
113 | }
114 |
115 | pub fn item_ids(&self) -> Vec {
116 | let mut stmt = self
117 | .connection
118 | .prepare_cached("select id from item_data")
119 | .unwrap();
120 | stmt.query_map([], |r| Ok(r.get(0)?))
121 | .unwrap()
122 | .map(|v| v.unwrap())
123 | .collect()
124 | }
125 |
126 | pub fn next_row(&mut self, d: &str) -> rusqlite::Result<()> {
127 | if let Err(_) = self
128 | .connection
129 | .execute("insert into item_data (item_val) values(?1)", [d])
130 | {
131 | // maybe it exists in the db already, find it
132 | let mut stmt = self
133 | .connection
134 | .prepare_cached("select id from item_data where item_val = ?1")
135 | .unwrap();
136 | self.current_id = match stmt.query_row([d], |row| row.get(0)) {
137 | Ok(v) => Some(v),
138 | Err(e) => {
139 | error!("Failed to get next row");
140 | return Err(e);
141 | }
142 | };
143 | } else {
144 | self.current_id = Some(self.connection.last_insert_rowid());
145 | }
146 | Ok(())
147 | }
148 |
149 | pub fn insert_batched(
150 | &mut self,
151 | index_map: &IndexMap,
152 | ) -> Result<(), DataToolErrors> {
153 | if self.current_id.is_none() {
154 | return Err(DataToolErrors::GenericError("No Item is set".to_string()));
155 | }
156 | let mut stmt = match self
157 | .connection
158 | .prepare_cached("insert into data_columns (key, value, item_id) values(?1, ?2, ?3)")
159 | {
160 | Ok(s) => s,
161 | Err(e) => {
162 | error!("Failed to create stmt: {}", e);
163 | return Err(DataToolErrors::GenericError(
164 | "Failed to create statement".to_string(),
165 | ));
166 | }
167 | };
168 | index_map.iter().for_each(|(k, v)| {
169 | if let Err(e) = stmt.execute([
170 | k.clone(),
171 | v.clone(),
172 | self.current_id.clone().unwrap().to_string(),
173 | ]) {
174 | error!("Error occurred: {}", e)
175 | }
176 | });
177 | Ok(())
178 | }
179 |
180 | pub fn insert(&mut self, column: &str, val: &str) -> Result<(), String> {
181 | if self.current_id.is_none() {
182 | return Err("No item is set".to_string());
183 | }
184 | self.connection
185 | .execute(
186 | "insert into data_columns (key, value, item_id) values(?1, ?2, ?3)",
187 | [column, val, &self.current_id.clone().unwrap().to_string()],
188 | )
189 | .map_err(|v| v.to_string())?;
190 | Ok(())
191 | }
192 |
193 | pub fn get_distinct_keys(
194 | &mut self,
195 | mut priority_cols: Vec,
196 | ) -> Result, DataToolErrors> {
197 | let mut stmt = self
198 | .connection
199 | .prepare_cached("select distinct key from data_columns")
200 | .unwrap();
201 | let x: Vec<_> = stmt
202 | .query_map([], |row| Ok(ColumnDef(row.get(0)?)))
203 | .map_err(|v| DataToolErrors::GenericError(v.to_string()))?
204 | .filter_map(|v| {
205 | let k = v.unwrap().0;
206 | if priority_cols.contains(&k) {
207 | return None;
208 | }
209 | Some(k)
210 | })
211 | .collect();
212 | priority_cols.extend(x);
213 | Ok(priority_cols)
214 | }
215 | }
216 |
217 | pub struct KeyValPair {
218 | key: String,
219 | value: String,
220 | }
221 |
222 | impl Iterator for TableMapDb {
223 | type Item = IndexMap;
224 |
225 | fn next(&mut self) -> Option {
226 | if self.current_row_iter.is_none() {
227 | let mut stmt = self
228 | .connection
229 | .prepare_cached("select id, item_val from item_data order by id desc")
230 | .unwrap();
231 | let nn: Vec = stmt
232 | .query_map([], |r| Ok(r.get(0)?))
233 | .unwrap()
234 | .map(|v| v.unwrap())
235 | .collect();
236 | self.current_row_iter = Some(nn);
237 | }
238 |
239 | if let Some(n) = self.current_row_iter.as_mut().unwrap().pop() {
240 | let mut inner_stmt = self
241 | .connection
242 | .prepare_cached("select key, value from data_columns where item_id = ?1")
243 | .unwrap();
244 | let rows = inner_stmt
245 | .query_map([n], |r| {
246 | Ok(KeyValPair {
247 | key: r.get(0).unwrap(),
248 | value: r.get(1).unwrap(),
249 | })
250 | })
251 | .unwrap();
252 | let mut im = IndexMap::new();
253 | im.insert("id".to_string(), n.to_string());
254 | for row in rows {
255 | let r = row.unwrap();
256 | im.insert(r.key.clone(), r.value.clone());
257 | }
258 | return Some(im);
259 | }
260 | None
261 | }
262 | }
263 |
264 | pub async fn dump_csv(
265 | mut db: &mut TableMapDb,
266 | file_name: &Path,
267 | chunk_size: usize,
268 | column_order: Vec,
269 | ) -> Result<(), DataToolErrors> {
270 | if file_name.exists() {
271 | warn!("Deleting file: {:?}", file_name);
272 | fs::remove_file(file_name).unwrap();
273 | }
274 | let mut csv_writer = csv::Writer::from_path(&file_name)?;
275 | let columns = db.get_distinct_keys(column_order)?;
276 | let all_ids = db.item_ids();
277 | let ids_count = all_ids.chunks(chunk_size);
278 | // creating def for creating table
279 | csv_writer.write_record(&columns).unwrap();
280 | // creating def for data insertion
281 | let dbf = db.db_file();
282 | let nn = ids_count.len();
283 | let mut cols = proc_ids(dbf, ids_count, nn, columns.clone());
284 | info!("processing done");
285 | while let Some(c) = cols.join_next().await {
286 | let n = c.unwrap();
287 | for row in n.iter() {
288 | if let Err(e) = csv_writer.write_record(row) {
289 | error!("Failed to store data: {}", e);
290 | }
291 | }
292 | }
293 | info!("Done!");
294 | Ok(())
295 | }
296 |
297 | /// export the data in a CSV file.
298 | pub async fn dump_db(
299 | mut tmd: &mut TableMapDb,
300 | file_name: &Path,
301 | chunk_size: usize,
302 | priority_cols: Vec,
303 | ) -> Result<(), DataToolErrors> {
304 | if file_name.exists() {
305 | warn!("Deleting file: {:?}", file_name);
306 | fs::remove_file(file_name).unwrap();
307 | }
308 | let db = Connection::open(file_name).unwrap();
309 | let mut columns: Vec<_> = tmd.get_distinct_keys(priority_cols).unwrap();
310 | let q = format!(
311 | "create table products ({})",
312 | columns
313 | .iter()
314 | .map(|v| format!("\"{}\" TEXT", v))
315 | .collect::>()
316 | .join(",")
317 | );
318 | db.execute(&q, []).unwrap();
319 | let pos_vals = (0..columns.len())
320 | .map(|v| format!("?{}", v + 1))
321 | .collect::>()
322 | .join(",");
323 | let q = format!(
324 | "insert into products ({}) values ({})",
325 | columns
326 | .iter()
327 | .map(|v| format!("\"{}\"", v))
328 | .collect::>()
329 | .join(","),
330 | pos_vals
331 | );
332 | let mut stmt = db.prepare_cached(&q).unwrap();
333 | let all_ids = tmd.item_ids();
334 | let ids_count = all_ids.chunks(chunk_size);
335 | let dbf = tmd.db_file();
336 | let nn = ids_count.len();
337 | let mut cols = proc_ids(dbf, ids_count, nn, columns.clone());
338 | while let Some(c) = cols.join_next().await {
339 | let n = c.unwrap();
340 | for row in n.iter() {
341 | if let Err(e) = stmt.execute(params_from_iter(row.iter())) {
342 | error!("Failed to store to db: {}", e);
343 | }
344 | }
345 | }
346 | info!("Done!");
347 | Ok(())
348 | }
349 |
350 | fn proc_ids(
351 | dbf: PathBuf,
352 | ids_count: Chunks,
353 | nn: usize,
354 | columns: Vec,
355 | ) -> JoinSet>> {
356 | let mut cols = JoinSet::new();
357 | for (ii, ids) in ids_count.enumerate() {
358 | trace!("processing ... {} of {}", ii + 1, nn);
359 | cols.spawn(read_db_chunked(
360 | dbf.clone(),
361 | columns.clone(),
362 | ids.to_vec(),
363 | ii,
364 | ));
365 | }
366 | cols
367 | }
368 |
369 | async fn read_db_chunked(
370 | file_name: PathBuf,
371 | columns: Vec,
372 | ids: Vec,
373 | chunk_num: usize,
374 | ) -> Vec> {
375 | let conn = match Connection::open_with_flags(&file_name, OpenFlags::SQLITE_OPEN_READ_ONLY) {
376 | Ok(c) => c,
377 | Err(e) => {
378 | error!("{}", e);
379 | return vec![];
380 | }
381 | };
382 | let mut res_vec = vec![];
383 | let t = Instant::now();
384 | let ids_str: Vec<_> = ids.iter().map(|v| v.to_string()).collect();
385 | let mut inner_stmt = conn
386 | .prepare(&format!(
387 | "select item_id, key, value from data_columns where item_id in({}) order by item_id",
388 | ids_str.join(",")
389 | ))
390 | .unwrap();
391 | let mut im_dd: IndexMap> = IndexMap::new();
392 | let _: Vec<_> = inner_stmt
393 | .query_map([], |row| {
394 | let item_id: i64 = row.get(0)?;
395 | let key: String = row.get(1)?;
396 | let val: String = row.get(2)?;
397 | im_dd
398 | .entry(item_id)
399 | .and_modify(|mut v| {
400 | v.insert(key.clone(), val.clone());
401 | })
402 | .or_insert_with(|| {
403 | let mut im = IndexMap::new();
404 | im.insert(key, val);
405 | im
406 | });
407 | Ok(())
408 | })
409 | .unwrap()
410 | .collect();
411 | for (_ii, im) in im_dd.iter() {
412 | let prep_cols = columns
413 | .iter()
414 | .map(|k| im.get(k).cloned().unwrap_or_default())
415 | .collect();
416 | res_vec.push(prep_cols);
417 | }
418 | trace!("done processing: {}, {:2}", chunk_num, t.elapsed().as_secs_f32());
419 | res_vec
420 | }
421 |
--------------------------------------------------------------------------------
/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.21.0"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
10 | dependencies = [
11 | "gimli",
12 | ]
13 |
14 | [[package]]
15 | name = "adler"
16 | version = "1.0.2"
17 | source = "registry+https://github.com/rust-lang/crates.io-index"
18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
19 |
20 | [[package]]
21 | name = "aho-corasick"
22 | version = "1.1.3"
23 | source = "registry+https://github.com/rust-lang/crates.io-index"
24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
25 | dependencies = [
26 | "memchr",
27 | ]
28 |
29 | [[package]]
30 | name = "anyhow"
31 | version = "1.0.99"
32 | source = "registry+https://github.com/rust-lang/crates.io-index"
33 | checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
34 |
35 | [[package]]
36 | name = "autocfg"
37 | version = "1.3.0"
38 | source = "registry+https://github.com/rust-lang/crates.io-index"
39 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
40 |
41 | [[package]]
42 | name = "backtrace"
43 | version = "0.3.71"
44 | source = "registry+https://github.com/rust-lang/crates.io-index"
45 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
46 | dependencies = [
47 | "addr2line",
48 | "cc",
49 | "cfg-if",
50 | "libc",
51 | "miniz_oxide",
52 | "object",
53 | "rustc-demangle",
54 | ]
55 |
56 | [[package]]
57 | name = "bitflags"
58 | version = "2.6.0"
59 | source = "registry+https://github.com/rust-lang/crates.io-index"
60 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
61 |
62 | [[package]]
63 | name = "bytes"
64 | version = "1.6.0"
65 | source = "registry+https://github.com/rust-lang/crates.io-index"
66 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
67 |
68 | [[package]]
69 | name = "cc"
70 | version = "1.2.6"
71 | source = "registry+https://github.com/rust-lang/crates.io-index"
72 | checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333"
73 | dependencies = [
74 | "shlex",
75 | ]
76 |
77 | [[package]]
78 | name = "cfg-if"
79 | version = "1.0.0"
80 | source = "registry+https://github.com/rust-lang/crates.io-index"
81 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
82 |
83 | [[package]]
84 | name = "csv"
85 | version = "1.3.0"
86 | source = "registry+https://github.com/rust-lang/crates.io-index"
87 | checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe"
88 | dependencies = [
89 | "csv-core",
90 | "itoa",
91 | "ryu",
92 | "serde",
93 | ]
94 |
95 | [[package]]
96 | name = "csv-core"
97 | version = "0.1.11"
98 | source = "registry+https://github.com/rust-lang/crates.io-index"
99 | checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
100 | dependencies = [
101 | "memchr",
102 | ]
103 |
104 | [[package]]
105 | name = "equivalent"
106 | version = "1.0.1"
107 | source = "registry+https://github.com/rust-lang/crates.io-index"
108 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
109 |
110 | [[package]]
111 | name = "fallible-iterator"
112 | version = "0.3.0"
113 | source = "registry+https://github.com/rust-lang/crates.io-index"
114 | checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
115 |
116 | [[package]]
117 | name = "fallible-streaming-iterator"
118 | version = "0.1.9"
119 | source = "registry+https://github.com/rust-lang/crates.io-index"
120 | checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
121 |
122 | [[package]]
123 | name = "foldhash"
124 | version = "0.1.5"
125 | source = "registry+https://github.com/rust-lang/crates.io-index"
126 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
127 |
128 | [[package]]
129 | name = "getrandom"
130 | version = "0.3.3"
131 | source = "registry+https://github.com/rust-lang/crates.io-index"
132 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
133 | dependencies = [
134 | "cfg-if",
135 | "libc",
136 | "r-efi",
137 | "wasi 0.14.2+wasi-0.2.4",
138 | ]
139 |
140 | [[package]]
141 | name = "gimli"
142 | version = "0.28.1"
143 | source = "registry+https://github.com/rust-lang/crates.io-index"
144 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
145 |
146 | [[package]]
147 | name = "hashbrown"
148 | version = "0.15.5"
149 | source = "registry+https://github.com/rust-lang/crates.io-index"
150 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
151 | dependencies = [
152 | "foldhash",
153 | ]
154 |
155 | [[package]]
156 | name = "hashlink"
157 | version = "0.10.0"
158 | source = "registry+https://github.com/rust-lang/crates.io-index"
159 | checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
160 | dependencies = [
161 | "hashbrown",
162 | ]
163 |
164 | [[package]]
165 | name = "indexmap"
166 | version = "2.11.0"
167 | source = "registry+https://github.com/rust-lang/crates.io-index"
168 | checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
169 | dependencies = [
170 | "equivalent",
171 | "hashbrown",
172 | ]
173 |
174 | [[package]]
175 | name = "io-uring"
176 | version = "0.7.10"
177 | source = "registry+https://github.com/rust-lang/crates.io-index"
178 | checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
179 | dependencies = [
180 | "bitflags",
181 | "cfg-if",
182 | "libc",
183 | ]
184 |
185 | [[package]]
186 | name = "itoa"
187 | version = "1.0.11"
188 | source = "registry+https://github.com/rust-lang/crates.io-index"
189 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
190 |
191 | [[package]]
192 | name = "lazy_static"
193 | version = "1.4.0"
194 | source = "registry+https://github.com/rust-lang/crates.io-index"
195 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
196 |
197 | [[package]]
198 | name = "libc"
199 | version = "0.2.175"
200 | source = "registry+https://github.com/rust-lang/crates.io-index"
201 | checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
202 |
203 | [[package]]
204 | name = "libsqlite3-sys"
205 | version = "0.35.0"
206 | source = "registry+https://github.com/rust-lang/crates.io-index"
207 | checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f"
208 | dependencies = [
209 | "cc",
210 | "pkg-config",
211 | "vcpkg",
212 | ]
213 |
214 | [[package]]
215 | name = "lock_api"
216 | version = "0.4.12"
217 | source = "registry+https://github.com/rust-lang/crates.io-index"
218 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
219 | dependencies = [
220 | "autocfg",
221 | "scopeguard",
222 | ]
223 |
224 | [[package]]
225 | name = "log"
226 | version = "0.4.21"
227 | source = "registry+https://github.com/rust-lang/crates.io-index"
228 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
229 |
230 | [[package]]
231 | name = "matchers"
232 | version = "0.1.0"
233 | source = "registry+https://github.com/rust-lang/crates.io-index"
234 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
235 | dependencies = [
236 | "regex-automata 0.1.10",
237 | ]
238 |
239 | [[package]]
240 | name = "memchr"
241 | version = "2.7.2"
242 | source = "registry+https://github.com/rust-lang/crates.io-index"
243 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
244 |
245 | [[package]]
246 | name = "miniz_oxide"
247 | version = "0.7.2"
248 | source = "registry+https://github.com/rust-lang/crates.io-index"
249 | checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
250 | dependencies = [
251 | "adler",
252 | ]
253 |
254 | [[package]]
255 | name = "mio"
256 | version = "1.0.4"
257 | source = "registry+https://github.com/rust-lang/crates.io-index"
258 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
259 | dependencies = [
260 | "libc",
261 | "wasi 0.11.0+wasi-snapshot-preview1",
262 | "windows-sys",
263 | ]
264 |
265 | [[package]]
266 | name = "nu-ansi-term"
267 | version = "0.46.0"
268 | source = "registry+https://github.com/rust-lang/crates.io-index"
269 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
270 | dependencies = [
271 | "overload",
272 | "winapi",
273 | ]
274 |
275 | [[package]]
276 | name = "object"
277 | version = "0.32.2"
278 | source = "registry+https://github.com/rust-lang/crates.io-index"
279 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
280 | dependencies = [
281 | "memchr",
282 | ]
283 |
284 | [[package]]
285 | name = "once_cell"
286 | version = "1.19.0"
287 | source = "registry+https://github.com/rust-lang/crates.io-index"
288 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
289 |
290 | [[package]]
291 | name = "overload"
292 | version = "0.1.1"
293 | source = "registry+https://github.com/rust-lang/crates.io-index"
294 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
295 |
296 | [[package]]
297 | name = "parking_lot"
298 | version = "0.12.2"
299 | source = "registry+https://github.com/rust-lang/crates.io-index"
300 | checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
301 | dependencies = [
302 | "lock_api",
303 | "parking_lot_core",
304 | ]
305 |
306 | [[package]]
307 | name = "parking_lot_core"
308 | version = "0.9.10"
309 | source = "registry+https://github.com/rust-lang/crates.io-index"
310 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
311 | dependencies = [
312 | "cfg-if",
313 | "libc",
314 | "redox_syscall",
315 | "smallvec",
316 | "windows-targets",
317 | ]
318 |
319 | [[package]]
320 | name = "pin-project-lite"
321 | version = "0.2.14"
322 | source = "registry+https://github.com/rust-lang/crates.io-index"
323 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
324 |
325 | [[package]]
326 | name = "pkg-config"
327 | version = "0.3.30"
328 | source = "registry+https://github.com/rust-lang/crates.io-index"
329 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
330 |
331 | [[package]]
332 | name = "ppv-lite86"
333 | version = "0.2.17"
334 | source = "registry+https://github.com/rust-lang/crates.io-index"
335 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
336 |
337 | [[package]]
338 | name = "proc-macro2"
339 | version = "1.0.92"
340 | source = "registry+https://github.com/rust-lang/crates.io-index"
341 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
342 | dependencies = [
343 | "unicode-ident",
344 | ]
345 |
346 | [[package]]
347 | name = "quote"
348 | version = "1.0.36"
349 | source = "registry+https://github.com/rust-lang/crates.io-index"
350 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
351 | dependencies = [
352 | "proc-macro2",
353 | ]
354 |
355 | [[package]]
356 | name = "r-efi"
357 | version = "5.3.0"
358 | source = "registry+https://github.com/rust-lang/crates.io-index"
359 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
360 |
361 | [[package]]
362 | name = "rand"
363 | version = "0.9.2"
364 | source = "registry+https://github.com/rust-lang/crates.io-index"
365 | checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
366 | dependencies = [
367 | "rand_chacha",
368 | "rand_core",
369 | ]
370 |
371 | [[package]]
372 | name = "rand_chacha"
373 | version = "0.9.0"
374 | source = "registry+https://github.com/rust-lang/crates.io-index"
375 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
376 | dependencies = [
377 | "ppv-lite86",
378 | "rand_core",
379 | ]
380 |
381 | [[package]]
382 | name = "rand_core"
383 | version = "0.9.3"
384 | source = "registry+https://github.com/rust-lang/crates.io-index"
385 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
386 | dependencies = [
387 | "getrandom",
388 | ]
389 |
390 | [[package]]
391 | name = "redox_syscall"
392 | version = "0.5.1"
393 | source = "registry+https://github.com/rust-lang/crates.io-index"
394 | checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
395 | dependencies = [
396 | "bitflags",
397 | ]
398 |
399 | [[package]]
400 | name = "regex"
401 | version = "1.10.4"
402 | source = "registry+https://github.com/rust-lang/crates.io-index"
403 | checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
404 | dependencies = [
405 | "aho-corasick",
406 | "memchr",
407 | "regex-automata 0.4.6",
408 | "regex-syntax 0.8.3",
409 | ]
410 |
411 | [[package]]
412 | name = "regex-automata"
413 | version = "0.1.10"
414 | source = "registry+https://github.com/rust-lang/crates.io-index"
415 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
416 | dependencies = [
417 | "regex-syntax 0.6.29",
418 | ]
419 |
420 | [[package]]
421 | name = "regex-automata"
422 | version = "0.4.6"
423 | source = "registry+https://github.com/rust-lang/crates.io-index"
424 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
425 | dependencies = [
426 | "aho-corasick",
427 | "memchr",
428 | "regex-syntax 0.8.3",
429 | ]
430 |
431 | [[package]]
432 | name = "regex-syntax"
433 | version = "0.6.29"
434 | source = "registry+https://github.com/rust-lang/crates.io-index"
435 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
436 |
437 | [[package]]
438 | name = "regex-syntax"
439 | version = "0.8.3"
440 | source = "registry+https://github.com/rust-lang/crates.io-index"
441 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
442 |
443 | [[package]]
444 | name = "rusqlite"
445 | version = "0.37.0"
446 | source = "registry+https://github.com/rust-lang/crates.io-index"
447 | checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f"
448 | dependencies = [
449 | "bitflags",
450 | "fallible-iterator",
451 | "fallible-streaming-iterator",
452 | "hashlink",
453 | "libsqlite3-sys",
454 | "smallvec",
455 | ]
456 |
457 | [[package]]
458 | name = "rustc-demangle"
459 | version = "0.1.24"
460 | source = "registry+https://github.com/rust-lang/crates.io-index"
461 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
462 |
463 | [[package]]
464 | name = "ryu"
465 | version = "1.0.18"
466 | source = "registry+https://github.com/rust-lang/crates.io-index"
467 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
468 |
469 | [[package]]
470 | name = "scopeguard"
471 | version = "1.2.0"
472 | source = "registry+https://github.com/rust-lang/crates.io-index"
473 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
474 |
475 | [[package]]
476 | name = "serde"
477 | version = "1.0.201"
478 | source = "registry+https://github.com/rust-lang/crates.io-index"
479 | checksum = "780f1cebed1629e4753a1a38a3c72d30b97ec044f0aef68cb26650a3c5cf363c"
480 | dependencies = [
481 | "serde_derive",
482 | ]
483 |
484 | [[package]]
485 | name = "serde_derive"
486 | version = "1.0.201"
487 | source = "registry+https://github.com/rust-lang/crates.io-index"
488 | checksum = "c5e405930b9796f1c00bee880d03fc7e0bb4b9a11afc776885ffe84320da2865"
489 | dependencies = [
490 | "proc-macro2",
491 | "quote",
492 | "syn",
493 | ]
494 |
495 | [[package]]
496 | name = "sharded-slab"
497 | version = "0.1.7"
498 | source = "registry+https://github.com/rust-lang/crates.io-index"
499 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
500 | dependencies = [
501 | "lazy_static",
502 | ]
503 |
504 | [[package]]
505 | name = "shlex"
506 | version = "1.3.0"
507 | source = "registry+https://github.com/rust-lang/crates.io-index"
508 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
509 |
510 | [[package]]
511 | name = "signal-hook-registry"
512 | version = "1.4.2"
513 | source = "registry+https://github.com/rust-lang/crates.io-index"
514 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
515 | dependencies = [
516 | "libc",
517 | ]
518 |
519 | [[package]]
520 | name = "slab"
521 | version = "0.4.11"
522 | source = "registry+https://github.com/rust-lang/crates.io-index"
523 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
524 |
525 | [[package]]
526 | name = "smallvec"
527 | version = "1.13.2"
528 | source = "registry+https://github.com/rust-lang/crates.io-index"
529 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
530 |
531 | [[package]]
532 | name = "socket2"
533 | version = "0.6.0"
534 | source = "registry+https://github.com/rust-lang/crates.io-index"
535 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
536 | dependencies = [
537 | "libc",
538 | "windows-sys",
539 | ]
540 |
541 | [[package]]
542 | name = "syn"
543 | version = "2.0.93"
544 | source = "registry+https://github.com/rust-lang/crates.io-index"
545 | checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058"
546 | dependencies = [
547 | "proc-macro2",
548 | "quote",
549 | "unicode-ident",
550 | ]
551 |
552 | [[package]]
553 | name = "table_map_db"
554 | version = "0.1.0"
555 | dependencies = [
556 | "anyhow",
557 | "csv",
558 | "indexmap",
559 | "rand",
560 | "rusqlite",
561 | "thiserror",
562 | "tokio",
563 | "tracing",
564 | "tracing-subscriber",
565 | ]
566 |
567 | [[package]]
568 | name = "thiserror"
569 | version = "2.0.9"
570 | source = "registry+https://github.com/rust-lang/crates.io-index"
571 | checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc"
572 | dependencies = [
573 | "thiserror-impl",
574 | ]
575 |
576 | [[package]]
577 | name = "thiserror-impl"
578 | version = "2.0.9"
579 | source = "registry+https://github.com/rust-lang/crates.io-index"
580 | checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4"
581 | dependencies = [
582 | "proc-macro2",
583 | "quote",
584 | "syn",
585 | ]
586 |
587 | [[package]]
588 | name = "thread_local"
589 | version = "1.1.8"
590 | source = "registry+https://github.com/rust-lang/crates.io-index"
591 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
592 | dependencies = [
593 | "cfg-if",
594 | "once_cell",
595 | ]
596 |
597 | [[package]]
598 | name = "tokio"
599 | version = "1.47.1"
600 | source = "registry+https://github.com/rust-lang/crates.io-index"
601 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
602 | dependencies = [
603 | "backtrace",
604 | "bytes",
605 | "io-uring",
606 | "libc",
607 | "mio",
608 | "parking_lot",
609 | "pin-project-lite",
610 | "signal-hook-registry",
611 | "slab",
612 | "socket2",
613 | "tokio-macros",
614 | "windows-sys",
615 | ]
616 |
617 | [[package]]
618 | name = "tokio-macros"
619 | version = "2.5.0"
620 | source = "registry+https://github.com/rust-lang/crates.io-index"
621 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
622 | dependencies = [
623 | "proc-macro2",
624 | "quote",
625 | "syn",
626 | ]
627 |
628 | [[package]]
629 | name = "tracing"
630 | version = "0.1.41"
631 | source = "registry+https://github.com/rust-lang/crates.io-index"
632 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
633 | dependencies = [
634 | "pin-project-lite",
635 | "tracing-attributes",
636 | "tracing-core",
637 | ]
638 |
639 | [[package]]
640 | name = "tracing-attributes"
641 | version = "0.1.30"
642 | source = "registry+https://github.com/rust-lang/crates.io-index"
643 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
644 | dependencies = [
645 | "proc-macro2",
646 | "quote",
647 | "syn",
648 | ]
649 |
650 | [[package]]
651 | name = "tracing-core"
652 | version = "0.1.34"
653 | source = "registry+https://github.com/rust-lang/crates.io-index"
654 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
655 | dependencies = [
656 | "once_cell",
657 | "valuable",
658 | ]
659 |
660 | [[package]]
661 | name = "tracing-log"
662 | version = "0.2.0"
663 | source = "registry+https://github.com/rust-lang/crates.io-index"
664 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
665 | dependencies = [
666 | "log",
667 | "once_cell",
668 | "tracing-core",
669 | ]
670 |
671 | [[package]]
672 | name = "tracing-subscriber"
673 | version = "0.3.18"
674 | source = "registry+https://github.com/rust-lang/crates.io-index"
675 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
676 | dependencies = [
677 | "matchers",
678 | "nu-ansi-term",
679 | "once_cell",
680 | "regex",
681 | "sharded-slab",
682 | "smallvec",
683 | "thread_local",
684 | "tracing",
685 | "tracing-core",
686 | "tracing-log",
687 | ]
688 |
689 | [[package]]
690 | name = "unicode-ident"
691 | version = "1.0.12"
692 | source = "registry+https://github.com/rust-lang/crates.io-index"
693 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
694 |
695 | [[package]]
696 | name = "valuable"
697 | version = "0.1.0"
698 | source = "registry+https://github.com/rust-lang/crates.io-index"
699 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
700 |
701 | [[package]]
702 | name = "vcpkg"
703 | version = "0.2.15"
704 | source = "registry+https://github.com/rust-lang/crates.io-index"
705 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
706 |
707 | [[package]]
708 | name = "wasi"
709 | version = "0.11.0+wasi-snapshot-preview1"
710 | source = "registry+https://github.com/rust-lang/crates.io-index"
711 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
712 |
713 | [[package]]
714 | name = "wasi"
715 | version = "0.14.2+wasi-0.2.4"
716 | source = "registry+https://github.com/rust-lang/crates.io-index"
717 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
718 | dependencies = [
719 | "wit-bindgen-rt",
720 | ]
721 |
722 | [[package]]
723 | name = "winapi"
724 | version = "0.3.9"
725 | source = "registry+https://github.com/rust-lang/crates.io-index"
726 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
727 | dependencies = [
728 | "winapi-i686-pc-windows-gnu",
729 | "winapi-x86_64-pc-windows-gnu",
730 | ]
731 |
732 | [[package]]
733 | name = "winapi-i686-pc-windows-gnu"
734 | version = "0.4.0"
735 | source = "registry+https://github.com/rust-lang/crates.io-index"
736 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
737 |
738 | [[package]]
739 | name = "winapi-x86_64-pc-windows-gnu"
740 | version = "0.4.0"
741 | source = "registry+https://github.com/rust-lang/crates.io-index"
742 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
743 |
744 | [[package]]
745 | name = "windows-sys"
746 | version = "0.59.0"
747 | source = "registry+https://github.com/rust-lang/crates.io-index"
748 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
749 | dependencies = [
750 | "windows-targets",
751 | ]
752 |
753 | [[package]]
754 | name = "windows-targets"
755 | version = "0.52.6"
756 | source = "registry+https://github.com/rust-lang/crates.io-index"
757 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
758 | dependencies = [
759 | "windows_aarch64_gnullvm",
760 | "windows_aarch64_msvc",
761 | "windows_i686_gnu",
762 | "windows_i686_gnullvm",
763 | "windows_i686_msvc",
764 | "windows_x86_64_gnu",
765 | "windows_x86_64_gnullvm",
766 | "windows_x86_64_msvc",
767 | ]
768 |
769 | [[package]]
770 | name = "windows_aarch64_gnullvm"
771 | version = "0.52.6"
772 | source = "registry+https://github.com/rust-lang/crates.io-index"
773 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
774 |
775 | [[package]]
776 | name = "windows_aarch64_msvc"
777 | version = "0.52.6"
778 | source = "registry+https://github.com/rust-lang/crates.io-index"
779 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
780 |
781 | [[package]]
782 | name = "windows_i686_gnu"
783 | version = "0.52.6"
784 | source = "registry+https://github.com/rust-lang/crates.io-index"
785 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
786 |
787 | [[package]]
788 | name = "windows_i686_gnullvm"
789 | version = "0.52.6"
790 | source = "registry+https://github.com/rust-lang/crates.io-index"
791 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
792 |
793 | [[package]]
794 | name = "windows_i686_msvc"
795 | version = "0.52.6"
796 | source = "registry+https://github.com/rust-lang/crates.io-index"
797 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
798 |
799 | [[package]]
800 | name = "windows_x86_64_gnu"
801 | version = "0.52.6"
802 | source = "registry+https://github.com/rust-lang/crates.io-index"
803 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
804 |
805 | [[package]]
806 | name = "windows_x86_64_gnullvm"
807 | version = "0.52.6"
808 | source = "registry+https://github.com/rust-lang/crates.io-index"
809 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
810 |
811 | [[package]]
812 | name = "windows_x86_64_msvc"
813 | version = "0.52.6"
814 | source = "registry+https://github.com/rust-lang/crates.io-index"
815 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
816 |
817 | [[package]]
818 | name = "wit-bindgen-rt"
819 | version = "0.39.0"
820 | source = "registry+https://github.com/rust-lang/crates.io-index"
821 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
822 | dependencies = [
823 | "bitflags",
824 | ]
825 |
--------------------------------------------------------------------------------