├── .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 | 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 | 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 | 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 | --------------------------------------------------------------------------------