Nix Observability Daemon
observability nix
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: move from sqlx -> rusqlite

+189 -1753
-32
.sqlx/query-0bcfc2ee3a0b7cf099fe676813616b903265959353dad8b3d263be382e335967.json
··· 1 - { 2 - "db_name": "SQLite", 3 - "query": "SELECT cache_url as \"cache_url!\", CAST(AVG(duration_ms) AS REAL) as \"avg_ms!\", CAST(COUNT(*) AS INTEGER) as \"count!\"\n FROM events WHERE cache_url IS NOT NULL\n GROUP BY cache_url ORDER BY 2 DESC", 4 - "describe": { 5 - "columns": [ 6 - { 7 - "name": "cache_url!", 8 - "ordinal": 0, 9 - "type_info": "Text" 10 - }, 11 - { 12 - "name": "avg_ms!", 13 - "ordinal": 1, 14 - "type_info": "Float" 15 - }, 16 - { 17 - "name": "count!", 18 - "ordinal": 2, 19 - "type_info": "Int64" 20 - } 21 - ], 22 - "parameters": { 23 - "Right": 0 24 - }, 25 - "nullable": [ 26 - true, 27 - true, 28 - false 29 - ] 30 - }, 31 - "hash": "0bcfc2ee3a0b7cf099fe676813616b903265959353dad8b3d263be382e335967" 32 - }
-32
.sqlx/query-8018f90535a4f5b3a4997a6fadab4a8937bf63b32036740aac380656966d5626.json
··· 1 - { 2 - "db_name": "SQLite", 3 - "query": "SELECT duration_ms as \"duration_ms!\", drv_path, text\n FROM events WHERE event_type = 105\n ORDER BY duration_ms DESC LIMIT 10", 4 - "describe": { 5 - "columns": [ 6 - { 7 - "name": "duration_ms!", 8 - "ordinal": 0, 9 - "type_info": "Int64" 10 - }, 11 - { 12 - "name": "drv_path", 13 - "ordinal": 1, 14 - "type_info": "Text" 15 - }, 16 - { 17 - "name": "text", 18 - "ordinal": 2, 19 - "type_info": "Text" 20 - } 21 - ], 22 - "parameters": { 23 - "Right": 0 24 - }, 25 - "nullable": [ 26 - true, 27 - true, 28 - true 29 - ] 30 - }, 31 - "hash": "8018f90535a4f5b3a4997a6fadab4a8937bf63b32036740aac380656966d5626" 32 - }
-12
.sqlx/query-8230b2b702eee1a62a4970000c0f574cc4cca84858bda07ca760ed814b0a3756.json
··· 1 - { 2 - "db_name": "SQLite", 3 - "query": "INSERT INTO events (nix_id, parent_id, event_type, text, drv_path, cache_url, start_time, end_time, duration_ms, total_bytes)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", 4 - "describe": { 5 - "columns": [], 6 - "parameters": { 7 - "Right": 10 8 - }, 9 - "nullable": [] 10 - }, 11 - "hash": "8230b2b702eee1a62a4970000c0f574cc4cca84858bda07ca760ed814b0a3756" 12 - }
-50
.sqlx/query-c455929cf7c0ef853cba8765ef901dff54d94770c1e36404f096deb72882dfcb.json
··· 1 - { 2 - "db_name": "SQLite", 3 - "query": "SELECT\n CAST(COUNT(*) FILTER (WHERE event_type = 105) AS INTEGER) as \"build_count!\",\n COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 105), 0) as \"build_total_ms!\",\n CAST(COUNT(*) FILTER (WHERE event_type = 108) AS INTEGER) as \"subst_count!\",\n COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 108), 0) as \"subst_total_ms!\",\n COALESCE(SUM(total_bytes) FILTER (WHERE event_type = 101), 0) as \"download_bytes!\",\n COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 101), 0) as \"download_ms!\"\n FROM events", 4 - "describe": { 5 - "columns": [ 6 - { 7 - "name": "build_count!", 8 - "ordinal": 0, 9 - "type_info": "Int" 10 - }, 11 - { 12 - "name": "build_total_ms!", 13 - "ordinal": 1, 14 - "type_info": "Int" 15 - }, 16 - { 17 - "name": "subst_count!", 18 - "ordinal": 2, 19 - "type_info": "Int" 20 - }, 21 - { 22 - "name": "subst_total_ms!", 23 - "ordinal": 3, 24 - "type_info": "Int" 25 - }, 26 - { 27 - "name": "download_bytes!", 28 - "ordinal": 4, 29 - "type_info": "Int" 30 - }, 31 - { 32 - "name": "download_ms!", 33 - "ordinal": 5, 34 - "type_info": "Int" 35 - } 36 - ], 37 - "parameters": { 38 - "Right": 0 39 - }, 40 - "nullable": [ 41 - false, 42 - false, 43 - false, 44 - false, 45 - false, 46 - false 47 - ] 48 - }, 49 - "hash": "c455929cf7c0ef853cba8765ef901dff54d94770c1e36404f096deb72882dfcb" 50 - }
+32 -1466
Cargo.lock
··· 9 9 checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 10 10 dependencies = [ 11 11 "cfg-if", 12 - "getrandom 0.3.4", 13 12 "once_cell", 14 13 "version_check", 15 14 "zerocopy", 16 15 ] 17 - 18 - [[package]] 19 - name = "allocator-api2" 20 - version = "0.2.21" 21 - source = "registry+https://github.com/rust-lang/crates.io-index" 22 - checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 23 16 24 17 [[package]] 25 18 name = "android_system_properties" ··· 87 80 checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" 88 81 89 82 [[package]] 90 - name = "atoi" 91 - version = "2.0.0" 92 - source = "registry+https://github.com/rust-lang/crates.io-index" 93 - checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 94 - dependencies = [ 95 - "num-traits", 96 - ] 97 - 98 - [[package]] 99 83 name = "autocfg" 100 84 version = "1.5.0" 101 85 source = "registry+https://github.com/rust-lang/crates.io-index" 102 86 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 103 87 104 88 [[package]] 105 - name = "base64" 106 - version = "0.21.7" 107 - source = "registry+https://github.com/rust-lang/crates.io-index" 108 - checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 109 - 110 - [[package]] 111 - name = "base64ct" 112 - version = "1.8.3" 113 - source = "registry+https://github.com/rust-lang/crates.io-index" 114 - checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" 115 - 116 - [[package]] 117 89 name = "bitflags" 118 90 version = "2.11.0" 119 91 source = "registry+https://github.com/rust-lang/crates.io-index" 120 92 checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 121 - dependencies = [ 122 - "serde_core", 123 - ] 124 - 125 - [[package]] 126 - name = "block-buffer" 127 - version = "0.10.4" 128 - source = "registry+https://github.com/rust-lang/crates.io-index" 129 - checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 130 - dependencies = [ 131 - "generic-array", 132 - ] 133 93 134 94 [[package]] 135 95 name = "bumpalo" 136 96 version = "3.20.2" 137 97 source = "registry+https://github.com/rust-lang/crates.io-index" 138 98 checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" 139 - 140 - [[package]] 141 - name = "byteorder" 142 - version = "1.5.0" 143 - source = "registry+https://github.com/rust-lang/crates.io-index" 144 - checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 145 99 146 100 [[package]] 147 101 name = "bytes" ··· 206 160 source = "registry+https://github.com/rust-lang/crates.io-index" 207 161 checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" 208 162 dependencies = [ 209 - "heck 0.5.0", 163 + "heck", 210 164 "proc-macro2", 211 165 "quote", 212 - "syn 2.0.117", 166 + "syn", 213 167 ] 214 168 215 169 [[package]] ··· 225 179 checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 226 180 227 181 [[package]] 228 - name = "const-oid" 229 - version = "0.9.6" 230 - source = "registry+https://github.com/rust-lang/crates.io-index" 231 - checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 232 - 233 - [[package]] 234 182 name = "core-foundation-sys" 235 183 version = "0.8.7" 236 184 source = "registry+https://github.com/rust-lang/crates.io-index" 237 185 checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 238 186 239 187 [[package]] 240 - name = "cpufeatures" 241 - version = "0.2.17" 242 - source = "registry+https://github.com/rust-lang/crates.io-index" 243 - checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 244 - dependencies = [ 245 - "libc", 246 - ] 247 - 248 - [[package]] 249 - name = "crc" 250 - version = "3.4.0" 251 - source = "registry+https://github.com/rust-lang/crates.io-index" 252 - checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" 253 - dependencies = [ 254 - "crc-catalog", 255 - ] 256 - 257 - [[package]] 258 - name = "crc-catalog" 259 - version = "2.4.0" 260 - source = "registry+https://github.com/rust-lang/crates.io-index" 261 - checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 262 - 263 - [[package]] 264 - name = "crossbeam-queue" 265 - version = "0.3.12" 266 - source = "registry+https://github.com/rust-lang/crates.io-index" 267 - checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 268 - dependencies = [ 269 - "crossbeam-utils", 270 - ] 271 - 272 - [[package]] 273 - name = "crossbeam-utils" 274 - version = "0.8.21" 275 - source = "registry+https://github.com/rust-lang/crates.io-index" 276 - checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 277 - 278 - [[package]] 279 - name = "crypto-common" 280 - version = "0.1.7" 281 - source = "registry+https://github.com/rust-lang/crates.io-index" 282 - checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 283 - dependencies = [ 284 - "generic-array", 285 - "typenum", 286 - ] 287 - 288 - [[package]] 289 - name = "der" 290 - version = "0.7.10" 291 - source = "registry+https://github.com/rust-lang/crates.io-index" 292 - checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" 293 - dependencies = [ 294 - "const-oid", 295 - "pem-rfc7468", 296 - "zeroize", 297 - ] 298 - 299 - [[package]] 300 - name = "digest" 301 - version = "0.10.7" 302 - source = "registry+https://github.com/rust-lang/crates.io-index" 303 - checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 304 - dependencies = [ 305 - "block-buffer", 306 - "const-oid", 307 - "crypto-common", 308 - "subtle", 309 - ] 310 - 311 - [[package]] 312 188 name = "directories" 313 189 version = "5.0.1" 314 190 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 330 206 ] 331 207 332 208 [[package]] 333 - name = "displaydoc" 334 - version = "0.2.5" 335 - source = "registry+https://github.com/rust-lang/crates.io-index" 336 - checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 337 - dependencies = [ 338 - "proc-macro2", 339 - "quote", 340 - "syn 2.0.117", 341 - ] 342 - 343 - [[package]] 344 - name = "dotenvy" 345 - version = "0.15.7" 346 - source = "registry+https://github.com/rust-lang/crates.io-index" 347 - checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 348 - 349 - [[package]] 350 - name = "either" 351 - version = "1.15.0" 352 - source = "registry+https://github.com/rust-lang/crates.io-index" 353 - checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 354 - dependencies = [ 355 - "serde", 356 - ] 357 - 358 - [[package]] 359 - name = "equivalent" 360 - version = "1.0.2" 361 - source = "registry+https://github.com/rust-lang/crates.io-index" 362 - checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 363 - 364 - [[package]] 365 209 name = "errno" 366 210 version = "0.3.14" 367 211 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 372 216 ] 373 217 374 218 [[package]] 375 - name = "etcetera" 376 - version = "0.8.0" 219 + name = "fallible-iterator" 220 + version = "0.3.0" 377 221 source = "registry+https://github.com/rust-lang/crates.io-index" 378 - checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 379 - dependencies = [ 380 - "cfg-if", 381 - "home", 382 - "windows-sys 0.48.0", 383 - ] 222 + checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" 384 223 385 224 [[package]] 386 - name = "event-listener" 387 - version = "2.5.3" 225 + name = "fallible-streaming-iterator" 226 + version = "0.1.9" 388 227 source = "registry+https://github.com/rust-lang/crates.io-index" 389 - checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 390 - 391 - [[package]] 392 - name = "fastrand" 393 - version = "2.3.0" 394 - source = "registry+https://github.com/rust-lang/crates.io-index" 395 - checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 228 + checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" 396 229 397 230 [[package]] 398 231 name = "find-msvc-tools" ··· 401 234 checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 402 235 403 236 [[package]] 404 - name = "flume" 405 - version = "0.11.1" 406 - source = "registry+https://github.com/rust-lang/crates.io-index" 407 - checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 408 - dependencies = [ 409 - "futures-core", 410 - "futures-sink", 411 - "spin", 412 - ] 413 - 414 - [[package]] 415 - name = "foldhash" 416 - version = "0.1.5" 417 - source = "registry+https://github.com/rust-lang/crates.io-index" 418 - checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 419 - 420 - [[package]] 421 - name = "form_urlencoded" 422 - version = "1.2.2" 423 - source = "registry+https://github.com/rust-lang/crates.io-index" 424 - checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 425 - dependencies = [ 426 - "percent-encoding", 427 - ] 428 - 429 - [[package]] 430 - name = "futures" 431 - version = "0.3.32" 432 - source = "registry+https://github.com/rust-lang/crates.io-index" 433 - checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" 434 - dependencies = [ 435 - "futures-channel", 436 - "futures-core", 437 - "futures-executor", 438 - "futures-io", 439 - "futures-sink", 440 - "futures-task", 441 - "futures-util", 442 - ] 443 - 444 - [[package]] 445 - name = "futures-channel" 446 - version = "0.3.32" 447 - source = "registry+https://github.com/rust-lang/crates.io-index" 448 - checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" 449 - dependencies = [ 450 - "futures-core", 451 - "futures-sink", 452 - ] 453 - 454 - [[package]] 455 - name = "futures-core" 456 - version = "0.3.32" 457 - source = "registry+https://github.com/rust-lang/crates.io-index" 458 - checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" 459 - 460 - [[package]] 461 - name = "futures-executor" 462 - version = "0.3.32" 463 - source = "registry+https://github.com/rust-lang/crates.io-index" 464 - checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" 465 - dependencies = [ 466 - "futures-core", 467 - "futures-task", 468 - "futures-util", 469 - ] 470 - 471 - [[package]] 472 - name = "futures-intrusive" 473 - version = "0.5.0" 474 - source = "registry+https://github.com/rust-lang/crates.io-index" 475 - checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 476 - dependencies = [ 477 - "futures-core", 478 - "lock_api", 479 - "parking_lot", 480 - ] 481 - 482 - [[package]] 483 - name = "futures-io" 484 - version = "0.3.32" 485 - source = "registry+https://github.com/rust-lang/crates.io-index" 486 - checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" 487 - 488 - [[package]] 489 - name = "futures-macro" 490 - version = "0.3.32" 491 - source = "registry+https://github.com/rust-lang/crates.io-index" 492 - checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" 493 - dependencies = [ 494 - "proc-macro2", 495 - "quote", 496 - "syn 2.0.117", 497 - ] 498 - 499 - [[package]] 500 - name = "futures-sink" 501 - version = "0.3.32" 502 - source = "registry+https://github.com/rust-lang/crates.io-index" 503 - checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" 504 - 505 - [[package]] 506 - name = "futures-task" 507 - version = "0.3.32" 508 - source = "registry+https://github.com/rust-lang/crates.io-index" 509 - checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" 510 - 511 - [[package]] 512 - name = "futures-util" 513 - version = "0.3.32" 514 - source = "registry+https://github.com/rust-lang/crates.io-index" 515 - checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" 516 - dependencies = [ 517 - "futures-channel", 518 - "futures-core", 519 - "futures-io", 520 - "futures-macro", 521 - "futures-sink", 522 - "futures-task", 523 - "memchr", 524 - "pin-project-lite", 525 - "slab", 526 - ] 527 - 528 - [[package]] 529 - name = "generic-array" 530 - version = "0.14.7" 531 - source = "registry+https://github.com/rust-lang/crates.io-index" 532 - checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 533 - dependencies = [ 534 - "typenum", 535 - "version_check", 536 - ] 537 - 538 - [[package]] 539 237 name = "getrandom" 540 238 version = "0.2.17" 541 239 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 547 245 ] 548 246 549 247 [[package]] 550 - name = "getrandom" 551 - version = "0.3.4" 552 - source = "registry+https://github.com/rust-lang/crates.io-index" 553 - checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 554 - dependencies = [ 555 - "cfg-if", 556 - "libc", 557 - "r-efi 5.3.0", 558 - "wasip2", 559 - ] 560 - 561 - [[package]] 562 - name = "getrandom" 563 - version = "0.4.2" 564 - source = "registry+https://github.com/rust-lang/crates.io-index" 565 - checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" 566 - dependencies = [ 567 - "cfg-if", 568 - "libc", 569 - "r-efi 6.0.0", 570 - "wasip2", 571 - "wasip3", 572 - ] 573 - 574 - [[package]] 575 248 name = "hashbrown" 576 249 version = "0.14.5" 577 250 source = "registry+https://github.com/rust-lang/crates.io-index" 578 251 checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 579 252 dependencies = [ 580 253 "ahash", 581 - "allocator-api2", 582 254 ] 583 255 584 256 [[package]] 585 - name = "hashbrown" 586 - version = "0.15.5" 587 - source = "registry+https://github.com/rust-lang/crates.io-index" 588 - checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 589 - dependencies = [ 590 - "foldhash", 591 - ] 592 - 593 - [[package]] 594 - name = "hashbrown" 595 - version = "0.16.1" 596 - source = "registry+https://github.com/rust-lang/crates.io-index" 597 - checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 598 - 599 - [[package]] 600 257 name = "hashlink" 601 - version = "0.8.4" 258 + version = "0.9.1" 602 259 source = "registry+https://github.com/rust-lang/crates.io-index" 603 - checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" 260 + checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" 604 261 dependencies = [ 605 - "hashbrown 0.14.5", 606 - ] 607 - 608 - [[package]] 609 - name = "heck" 610 - version = "0.4.1" 611 - source = "registry+https://github.com/rust-lang/crates.io-index" 612 - checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 613 - dependencies = [ 614 - "unicode-segmentation", 262 + "hashbrown", 615 263 ] 616 264 617 265 [[package]] ··· 621 269 checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 622 270 623 271 [[package]] 624 - name = "hex" 625 - version = "0.4.3" 626 - source = "registry+https://github.com/rust-lang/crates.io-index" 627 - checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 628 - 629 - [[package]] 630 - name = "hkdf" 631 - version = "0.12.4" 632 - source = "registry+https://github.com/rust-lang/crates.io-index" 633 - checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 634 - dependencies = [ 635 - "hmac", 636 - ] 637 - 638 - [[package]] 639 - name = "hmac" 640 - version = "0.12.1" 641 - source = "registry+https://github.com/rust-lang/crates.io-index" 642 - checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 643 - dependencies = [ 644 - "digest", 645 - ] 646 - 647 - [[package]] 648 - name = "home" 649 - version = "0.5.12" 650 - source = "registry+https://github.com/rust-lang/crates.io-index" 651 - checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" 652 - dependencies = [ 653 - "windows-sys 0.61.2", 654 - ] 655 - 656 - [[package]] 657 272 name = "iana-time-zone" 658 273 version = "0.1.65" 659 274 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 678 293 ] 679 294 680 295 [[package]] 681 - name = "icu_collections" 682 - version = "2.1.1" 683 - source = "registry+https://github.com/rust-lang/crates.io-index" 684 - checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 685 - dependencies = [ 686 - "displaydoc", 687 - "potential_utf", 688 - "yoke", 689 - "zerofrom", 690 - "zerovec", 691 - ] 692 - 693 - [[package]] 694 - name = "icu_locale_core" 695 - version = "2.1.1" 696 - source = "registry+https://github.com/rust-lang/crates.io-index" 697 - checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 698 - dependencies = [ 699 - "displaydoc", 700 - "litemap", 701 - "tinystr", 702 - "writeable", 703 - "zerovec", 704 - ] 705 - 706 - [[package]] 707 - name = "icu_normalizer" 708 - version = "2.1.1" 709 - source = "registry+https://github.com/rust-lang/crates.io-index" 710 - checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 711 - dependencies = [ 712 - "icu_collections", 713 - "icu_normalizer_data", 714 - "icu_properties", 715 - "icu_provider", 716 - "smallvec", 717 - "zerovec", 718 - ] 719 - 720 - [[package]] 721 - name = "icu_normalizer_data" 722 - version = "2.1.1" 723 - source = "registry+https://github.com/rust-lang/crates.io-index" 724 - checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 725 - 726 - [[package]] 727 - name = "icu_properties" 728 - version = "2.1.2" 729 - source = "registry+https://github.com/rust-lang/crates.io-index" 730 - checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 731 - dependencies = [ 732 - "icu_collections", 733 - "icu_locale_core", 734 - "icu_properties_data", 735 - "icu_provider", 736 - "zerotrie", 737 - "zerovec", 738 - ] 739 - 740 - [[package]] 741 - name = "icu_properties_data" 742 - version = "2.1.2" 743 - source = "registry+https://github.com/rust-lang/crates.io-index" 744 - checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 745 - 746 - [[package]] 747 - name = "icu_provider" 748 - version = "2.1.1" 749 - source = "registry+https://github.com/rust-lang/crates.io-index" 750 - checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 751 - dependencies = [ 752 - "displaydoc", 753 - "icu_locale_core", 754 - "writeable", 755 - "yoke", 756 - "zerofrom", 757 - "zerotrie", 758 - "zerovec", 759 - ] 760 - 761 - [[package]] 762 - name = "id-arena" 763 - version = "2.3.0" 764 - source = "registry+https://github.com/rust-lang/crates.io-index" 765 - checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" 766 - 767 - [[package]] 768 - name = "idna" 769 - version = "1.1.0" 770 - source = "registry+https://github.com/rust-lang/crates.io-index" 771 - checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 772 - dependencies = [ 773 - "idna_adapter", 774 - "smallvec", 775 - "utf8_iter", 776 - ] 777 - 778 - [[package]] 779 - name = "idna_adapter" 780 - version = "1.2.1" 781 - source = "registry+https://github.com/rust-lang/crates.io-index" 782 - checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 783 - dependencies = [ 784 - "icu_normalizer", 785 - "icu_properties", 786 - ] 787 - 788 - [[package]] 789 - name = "indexmap" 790 - version = "2.13.0" 791 - source = "registry+https://github.com/rust-lang/crates.io-index" 792 - checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" 793 - dependencies = [ 794 - "equivalent", 795 - "hashbrown 0.16.1", 796 - "serde", 797 - "serde_core", 798 - ] 799 - 800 - [[package]] 801 296 name = "is_terminal_polyfill" 802 297 version = "1.70.2" 803 298 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 824 319 version = "1.5.0" 825 320 source = "registry+https://github.com/rust-lang/crates.io-index" 826 321 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 827 - dependencies = [ 828 - "spin", 829 - ] 830 - 831 - [[package]] 832 - name = "leb128fmt" 833 - version = "0.1.0" 834 - source = "registry+https://github.com/rust-lang/crates.io-index" 835 - checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 836 322 837 323 [[package]] 838 324 name = "libc" ··· 841 327 checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" 842 328 843 329 [[package]] 844 - name = "libm" 845 - version = "0.2.16" 846 - source = "registry+https://github.com/rust-lang/crates.io-index" 847 - checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" 848 - 849 - [[package]] 850 330 name = "libredox" 851 331 version = "0.1.14" 852 332 source = "registry+https://github.com/rust-lang/crates.io-index" 853 333 checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" 854 334 dependencies = [ 855 - "bitflags", 856 335 "libc", 857 - "plain", 858 - "redox_syscall 0.7.3", 859 336 ] 860 337 861 338 [[package]] 862 339 name = "libsqlite3-sys" 863 - version = "0.27.0" 340 + version = "0.28.0" 864 341 source = "registry+https://github.com/rust-lang/crates.io-index" 865 - checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" 342 + checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" 866 343 dependencies = [ 867 344 "cc", 868 345 "pkg-config", ··· 870 347 ] 871 348 872 349 [[package]] 873 - name = "linux-raw-sys" 874 - version = "0.12.1" 875 - source = "registry+https://github.com/rust-lang/crates.io-index" 876 - checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" 877 - 878 - [[package]] 879 - name = "litemap" 880 - version = "0.8.1" 881 - source = "registry+https://github.com/rust-lang/crates.io-index" 882 - checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 883 - 884 - [[package]] 885 350 name = "lock_api" 886 351 version = "0.4.14" 887 352 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 897 362 checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 898 363 899 364 [[package]] 900 - name = "md-5" 901 - version = "0.10.6" 902 - source = "registry+https://github.com/rust-lang/crates.io-index" 903 - checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 904 - dependencies = [ 905 - "cfg-if", 906 - "digest", 907 - ] 908 - 909 - [[package]] 910 365 name = "memchr" 911 366 version = "2.8.0" 912 367 source = "registry+https://github.com/rust-lang/crates.io-index" 913 368 checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" 914 369 915 370 [[package]] 916 - name = "minimal-lexical" 917 - version = "0.2.1" 918 - source = "registry+https://github.com/rust-lang/crates.io-index" 919 - checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 920 - 921 - [[package]] 922 371 name = "mio" 923 372 version = "1.1.1" 924 373 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 934 383 version = "0.1.0" 935 384 dependencies = [ 936 385 "anyhow", 937 - "bytes", 938 386 "chrono", 939 387 "clap", 940 388 "directories", 941 - "futures", 389 + "rusqlite", 942 390 "serde", 943 391 "serde_json", 944 - "sqlx", 945 392 "tokio", 946 - "tokio-util", 947 393 "tracing", 948 394 "tracing-subscriber", 949 395 ] 950 396 951 397 [[package]] 952 - name = "nom" 953 - version = "7.1.3" 954 - source = "registry+https://github.com/rust-lang/crates.io-index" 955 - checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 956 - dependencies = [ 957 - "memchr", 958 - "minimal-lexical", 959 - ] 960 - 961 - [[package]] 962 398 name = "nu-ansi-term" 963 399 version = "0.50.3" 964 400 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 968 404 ] 969 405 970 406 [[package]] 971 - name = "num-bigint-dig" 972 - version = "0.8.6" 973 - source = "registry+https://github.com/rust-lang/crates.io-index" 974 - checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" 975 - dependencies = [ 976 - "lazy_static", 977 - "libm", 978 - "num-integer", 979 - "num-iter", 980 - "num-traits", 981 - "rand", 982 - "smallvec", 983 - "zeroize", 984 - ] 985 - 986 - [[package]] 987 - name = "num-integer" 988 - version = "0.1.46" 989 - source = "registry+https://github.com/rust-lang/crates.io-index" 990 - checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 991 - dependencies = [ 992 - "num-traits", 993 - ] 994 - 995 - [[package]] 996 - name = "num-iter" 997 - version = "0.1.45" 998 - source = "registry+https://github.com/rust-lang/crates.io-index" 999 - checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1000 - dependencies = [ 1001 - "autocfg", 1002 - "num-integer", 1003 - "num-traits", 1004 - ] 1005 - 1006 - [[package]] 1007 407 name = "num-traits" 1008 408 version = "0.2.19" 1009 409 source = "registry+https://github.com/rust-lang/crates.io-index" 1010 410 checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1011 411 dependencies = [ 1012 412 "autocfg", 1013 - "libm", 1014 413 ] 1015 414 1016 415 [[package]] ··· 1049 448 dependencies = [ 1050 449 "cfg-if", 1051 450 "libc", 1052 - "redox_syscall 0.5.18", 451 + "redox_syscall", 1053 452 "smallvec", 1054 453 "windows-link", 1055 454 ] 1056 455 1057 456 [[package]] 1058 - name = "paste" 1059 - version = "1.0.15" 1060 - source = "registry+https://github.com/rust-lang/crates.io-index" 1061 - checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1062 - 1063 - [[package]] 1064 - name = "pem-rfc7468" 1065 - version = "0.7.0" 1066 - source = "registry+https://github.com/rust-lang/crates.io-index" 1067 - checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1068 - dependencies = [ 1069 - "base64ct", 1070 - ] 1071 - 1072 - [[package]] 1073 - name = "percent-encoding" 1074 - version = "2.3.2" 1075 - source = "registry+https://github.com/rust-lang/crates.io-index" 1076 - checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1077 - 1078 - [[package]] 1079 457 name = "pin-project-lite" 1080 458 version = "0.2.17" 1081 459 source = "registry+https://github.com/rust-lang/crates.io-index" 1082 460 checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" 1083 461 1084 462 [[package]] 1085 - name = "pkcs1" 1086 - version = "0.7.5" 1087 - source = "registry+https://github.com/rust-lang/crates.io-index" 1088 - checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1089 - dependencies = [ 1090 - "der", 1091 - "pkcs8", 1092 - "spki", 1093 - ] 1094 - 1095 - [[package]] 1096 - name = "pkcs8" 1097 - version = "0.10.2" 1098 - source = "registry+https://github.com/rust-lang/crates.io-index" 1099 - checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1100 - dependencies = [ 1101 - "der", 1102 - "spki", 1103 - ] 1104 - 1105 - [[package]] 1106 463 name = "pkg-config" 1107 464 version = "0.3.32" 1108 465 source = "registry+https://github.com/rust-lang/crates.io-index" 1109 466 checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1110 467 1111 468 [[package]] 1112 - name = "plain" 1113 - version = "0.2.3" 1114 - source = "registry+https://github.com/rust-lang/crates.io-index" 1115 - checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" 1116 - 1117 - [[package]] 1118 - name = "potential_utf" 1119 - version = "0.1.4" 1120 - source = "registry+https://github.com/rust-lang/crates.io-index" 1121 - checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 1122 - dependencies = [ 1123 - "zerovec", 1124 - ] 1125 - 1126 - [[package]] 1127 - name = "ppv-lite86" 1128 - version = "0.2.21" 1129 - source = "registry+https://github.com/rust-lang/crates.io-index" 1130 - checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1131 - dependencies = [ 1132 - "zerocopy", 1133 - ] 1134 - 1135 - [[package]] 1136 - name = "prettyplease" 1137 - version = "0.2.37" 1138 - source = "registry+https://github.com/rust-lang/crates.io-index" 1139 - checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 1140 - dependencies = [ 1141 - "proc-macro2", 1142 - "syn 2.0.117", 1143 - ] 1144 - 1145 - [[package]] 1146 469 name = "proc-macro2" 1147 470 version = "1.0.106" 1148 471 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1158 481 checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" 1159 482 dependencies = [ 1160 483 "proc-macro2", 1161 - ] 1162 - 1163 - [[package]] 1164 - name = "r-efi" 1165 - version = "5.3.0" 1166 - source = "registry+https://github.com/rust-lang/crates.io-index" 1167 - checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1168 - 1169 - [[package]] 1170 - name = "r-efi" 1171 - version = "6.0.0" 1172 - source = "registry+https://github.com/rust-lang/crates.io-index" 1173 - checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" 1174 - 1175 - [[package]] 1176 - name = "rand" 1177 - version = "0.8.5" 1178 - source = "registry+https://github.com/rust-lang/crates.io-index" 1179 - checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1180 - dependencies = [ 1181 - "libc", 1182 - "rand_chacha", 1183 - "rand_core", 1184 - ] 1185 - 1186 - [[package]] 1187 - name = "rand_chacha" 1188 - version = "0.3.1" 1189 - source = "registry+https://github.com/rust-lang/crates.io-index" 1190 - checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1191 - dependencies = [ 1192 - "ppv-lite86", 1193 - "rand_core", 1194 - ] 1195 - 1196 - [[package]] 1197 - name = "rand_core" 1198 - version = "0.6.4" 1199 - source = "registry+https://github.com/rust-lang/crates.io-index" 1200 - checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1201 - dependencies = [ 1202 - "getrandom 0.2.17", 1203 484 ] 1204 485 1205 486 [[package]] ··· 1212 493 ] 1213 494 1214 495 [[package]] 1215 - name = "redox_syscall" 1216 - version = "0.7.3" 1217 - source = "registry+https://github.com/rust-lang/crates.io-index" 1218 - checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" 1219 - dependencies = [ 1220 - "bitflags", 1221 - ] 1222 - 1223 - [[package]] 1224 496 name = "redox_users" 1225 497 version = "0.4.6" 1226 498 source = "registry+https://github.com/rust-lang/crates.io-index" 1227 499 checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1228 500 dependencies = [ 1229 - "getrandom 0.2.17", 501 + "getrandom", 1230 502 "libredox", 1231 503 "thiserror", 1232 504 ] 1233 505 1234 506 [[package]] 1235 - name = "rsa" 1236 - version = "0.9.10" 507 + name = "rusqlite" 508 + version = "0.31.0" 1237 509 source = "registry+https://github.com/rust-lang/crates.io-index" 1238 - checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" 1239 - dependencies = [ 1240 - "const-oid", 1241 - "digest", 1242 - "num-bigint-dig", 1243 - "num-integer", 1244 - "num-traits", 1245 - "pkcs1", 1246 - "pkcs8", 1247 - "rand_core", 1248 - "signature", 1249 - "spki", 1250 - "subtle", 1251 - "zeroize", 1252 - ] 1253 - 1254 - [[package]] 1255 - name = "rustix" 1256 - version = "1.1.4" 1257 - source = "registry+https://github.com/rust-lang/crates.io-index" 1258 - checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" 510 + checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" 1259 511 dependencies = [ 1260 512 "bitflags", 1261 - "errno", 1262 - "libc", 1263 - "linux-raw-sys", 1264 - "windows-sys 0.61.2", 513 + "fallible-iterator", 514 + "fallible-streaming-iterator", 515 + "hashlink", 516 + "libsqlite3-sys", 517 + "smallvec", 1265 518 ] 1266 519 1267 520 [[package]] ··· 1277 530 checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1278 531 1279 532 [[package]] 1280 - name = "semver" 1281 - version = "1.0.27" 1282 - source = "registry+https://github.com/rust-lang/crates.io-index" 1283 - checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 1284 - 1285 - [[package]] 1286 533 name = "serde" 1287 534 version = "1.0.228" 1288 535 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1309 556 dependencies = [ 1310 557 "proc-macro2", 1311 558 "quote", 1312 - "syn 2.0.117", 559 + "syn", 1313 560 ] 1314 561 1315 562 [[package]] ··· 1326 573 ] 1327 574 1328 575 [[package]] 1329 - name = "sha1" 1330 - version = "0.10.6" 1331 - source = "registry+https://github.com/rust-lang/crates.io-index" 1332 - checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1333 - dependencies = [ 1334 - "cfg-if", 1335 - "cpufeatures", 1336 - "digest", 1337 - ] 1338 - 1339 - [[package]] 1340 - name = "sha2" 1341 - version = "0.10.9" 1342 - source = "registry+https://github.com/rust-lang/crates.io-index" 1343 - checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 1344 - dependencies = [ 1345 - "cfg-if", 1346 - "cpufeatures", 1347 - "digest", 1348 - ] 1349 - 1350 - [[package]] 1351 576 name = "sharded-slab" 1352 577 version = "0.1.7" 1353 578 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1373 598 ] 1374 599 1375 600 [[package]] 1376 - name = "signature" 1377 - version = "2.2.0" 1378 - source = "registry+https://github.com/rust-lang/crates.io-index" 1379 - checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1380 - dependencies = [ 1381 - "digest", 1382 - "rand_core", 1383 - ] 1384 - 1385 - [[package]] 1386 - name = "slab" 1387 - version = "0.4.12" 1388 - source = "registry+https://github.com/rust-lang/crates.io-index" 1389 - checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" 1390 - 1391 - [[package]] 1392 601 name = "smallvec" 1393 602 version = "1.15.1" 1394 603 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1405 614 ] 1406 615 1407 616 [[package]] 1408 - name = "spin" 1409 - version = "0.9.8" 1410 - source = "registry+https://github.com/rust-lang/crates.io-index" 1411 - checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1412 - dependencies = [ 1413 - "lock_api", 1414 - ] 1415 - 1416 - [[package]] 1417 - name = "spki" 1418 - version = "0.7.3" 1419 - source = "registry+https://github.com/rust-lang/crates.io-index" 1420 - checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1421 - dependencies = [ 1422 - "base64ct", 1423 - "der", 1424 - ] 1425 - 1426 - [[package]] 1427 - name = "sqlformat" 1428 - version = "0.2.6" 1429 - source = "registry+https://github.com/rust-lang/crates.io-index" 1430 - checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" 1431 - dependencies = [ 1432 - "nom", 1433 - "unicode_categories", 1434 - ] 1435 - 1436 - [[package]] 1437 - name = "sqlx" 1438 - version = "0.7.4" 1439 - source = "registry+https://github.com/rust-lang/crates.io-index" 1440 - checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" 1441 - dependencies = [ 1442 - "sqlx-core", 1443 - "sqlx-macros", 1444 - "sqlx-mysql", 1445 - "sqlx-postgres", 1446 - "sqlx-sqlite", 1447 - ] 1448 - 1449 - [[package]] 1450 - name = "sqlx-core" 1451 - version = "0.7.4" 1452 - source = "registry+https://github.com/rust-lang/crates.io-index" 1453 - checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" 1454 - dependencies = [ 1455 - "ahash", 1456 - "atoi", 1457 - "byteorder", 1458 - "bytes", 1459 - "crc", 1460 - "crossbeam-queue", 1461 - "either", 1462 - "event-listener", 1463 - "futures-channel", 1464 - "futures-core", 1465 - "futures-intrusive", 1466 - "futures-io", 1467 - "futures-util", 1468 - "hashlink", 1469 - "hex", 1470 - "indexmap", 1471 - "log", 1472 - "memchr", 1473 - "once_cell", 1474 - "paste", 1475 - "percent-encoding", 1476 - "serde", 1477 - "serde_json", 1478 - "sha2", 1479 - "smallvec", 1480 - "sqlformat", 1481 - "thiserror", 1482 - "tokio", 1483 - "tokio-stream", 1484 - "tracing", 1485 - "url", 1486 - ] 1487 - 1488 - [[package]] 1489 - name = "sqlx-macros" 1490 - version = "0.7.4" 1491 - source = "registry+https://github.com/rust-lang/crates.io-index" 1492 - checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" 1493 - dependencies = [ 1494 - "proc-macro2", 1495 - "quote", 1496 - "sqlx-core", 1497 - "sqlx-macros-core", 1498 - "syn 1.0.109", 1499 - ] 1500 - 1501 - [[package]] 1502 - name = "sqlx-macros-core" 1503 - version = "0.7.4" 1504 - source = "registry+https://github.com/rust-lang/crates.io-index" 1505 - checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" 1506 - dependencies = [ 1507 - "dotenvy", 1508 - "either", 1509 - "heck 0.4.1", 1510 - "hex", 1511 - "once_cell", 1512 - "proc-macro2", 1513 - "quote", 1514 - "serde", 1515 - "serde_json", 1516 - "sha2", 1517 - "sqlx-core", 1518 - "sqlx-mysql", 1519 - "sqlx-sqlite", 1520 - "syn 1.0.109", 1521 - "tempfile", 1522 - "tokio", 1523 - "url", 1524 - ] 1525 - 1526 - [[package]] 1527 - name = "sqlx-mysql" 1528 - version = "0.7.4" 1529 - source = "registry+https://github.com/rust-lang/crates.io-index" 1530 - checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" 1531 - dependencies = [ 1532 - "atoi", 1533 - "base64", 1534 - "bitflags", 1535 - "byteorder", 1536 - "bytes", 1537 - "crc", 1538 - "digest", 1539 - "dotenvy", 1540 - "either", 1541 - "futures-channel", 1542 - "futures-core", 1543 - "futures-io", 1544 - "futures-util", 1545 - "generic-array", 1546 - "hex", 1547 - "hkdf", 1548 - "hmac", 1549 - "itoa", 1550 - "log", 1551 - "md-5", 1552 - "memchr", 1553 - "once_cell", 1554 - "percent-encoding", 1555 - "rand", 1556 - "rsa", 1557 - "serde", 1558 - "sha1", 1559 - "sha2", 1560 - "smallvec", 1561 - "sqlx-core", 1562 - "stringprep", 1563 - "thiserror", 1564 - "tracing", 1565 - "whoami", 1566 - ] 1567 - 1568 - [[package]] 1569 - name = "sqlx-postgres" 1570 - version = "0.7.4" 1571 - source = "registry+https://github.com/rust-lang/crates.io-index" 1572 - checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" 1573 - dependencies = [ 1574 - "atoi", 1575 - "base64", 1576 - "bitflags", 1577 - "byteorder", 1578 - "crc", 1579 - "dotenvy", 1580 - "etcetera", 1581 - "futures-channel", 1582 - "futures-core", 1583 - "futures-io", 1584 - "futures-util", 1585 - "hex", 1586 - "hkdf", 1587 - "hmac", 1588 - "home", 1589 - "itoa", 1590 - "log", 1591 - "md-5", 1592 - "memchr", 1593 - "once_cell", 1594 - "rand", 1595 - "serde", 1596 - "serde_json", 1597 - "sha2", 1598 - "smallvec", 1599 - "sqlx-core", 1600 - "stringprep", 1601 - "thiserror", 1602 - "tracing", 1603 - "whoami", 1604 - ] 1605 - 1606 - [[package]] 1607 - name = "sqlx-sqlite" 1608 - version = "0.7.4" 1609 - source = "registry+https://github.com/rust-lang/crates.io-index" 1610 - checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" 1611 - dependencies = [ 1612 - "atoi", 1613 - "flume", 1614 - "futures-channel", 1615 - "futures-core", 1616 - "futures-executor", 1617 - "futures-intrusive", 1618 - "futures-util", 1619 - "libsqlite3-sys", 1620 - "log", 1621 - "percent-encoding", 1622 - "serde", 1623 - "sqlx-core", 1624 - "tracing", 1625 - "url", 1626 - "urlencoding", 1627 - ] 1628 - 1629 - [[package]] 1630 - name = "stable_deref_trait" 1631 - version = "1.2.1" 1632 - source = "registry+https://github.com/rust-lang/crates.io-index" 1633 - checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 1634 - 1635 - [[package]] 1636 - name = "stringprep" 1637 - version = "0.1.5" 1638 - source = "registry+https://github.com/rust-lang/crates.io-index" 1639 - checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 1640 - dependencies = [ 1641 - "unicode-bidi", 1642 - "unicode-normalization", 1643 - "unicode-properties", 1644 - ] 1645 - 1646 - [[package]] 1647 617 name = "strsim" 1648 618 version = "0.11.1" 1649 619 source = "registry+https://github.com/rust-lang/crates.io-index" 1650 620 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1651 621 1652 622 [[package]] 1653 - name = "subtle" 1654 - version = "2.6.1" 1655 - source = "registry+https://github.com/rust-lang/crates.io-index" 1656 - checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1657 - 1658 - [[package]] 1659 - name = "syn" 1660 - version = "1.0.109" 1661 - source = "registry+https://github.com/rust-lang/crates.io-index" 1662 - checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1663 - dependencies = [ 1664 - "proc-macro2", 1665 - "quote", 1666 - "unicode-ident", 1667 - ] 1668 - 1669 - [[package]] 1670 623 name = "syn" 1671 624 version = "2.0.117" 1672 625 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1678 631 ] 1679 632 1680 633 [[package]] 1681 - name = "synstructure" 1682 - version = "0.13.2" 1683 - source = "registry+https://github.com/rust-lang/crates.io-index" 1684 - checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1685 - dependencies = [ 1686 - "proc-macro2", 1687 - "quote", 1688 - "syn 2.0.117", 1689 - ] 1690 - 1691 - [[package]] 1692 - name = "tempfile" 1693 - version = "3.27.0" 1694 - source = "registry+https://github.com/rust-lang/crates.io-index" 1695 - checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" 1696 - dependencies = [ 1697 - "fastrand", 1698 - "getrandom 0.4.2", 1699 - "once_cell", 1700 - "rustix", 1701 - "windows-sys 0.61.2", 1702 - ] 1703 - 1704 - [[package]] 1705 634 name = "thiserror" 1706 635 version = "1.0.69" 1707 636 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1718 647 dependencies = [ 1719 648 "proc-macro2", 1720 649 "quote", 1721 - "syn 2.0.117", 650 + "syn", 1722 651 ] 1723 652 1724 653 [[package]] ··· 1731 660 ] 1732 661 1733 662 [[package]] 1734 - name = "tinystr" 1735 - version = "0.8.2" 1736 - source = "registry+https://github.com/rust-lang/crates.io-index" 1737 - checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 1738 - dependencies = [ 1739 - "displaydoc", 1740 - "zerovec", 1741 - ] 1742 - 1743 - [[package]] 1744 - name = "tinyvec" 1745 - version = "1.10.0" 1746 - source = "registry+https://github.com/rust-lang/crates.io-index" 1747 - checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 1748 - dependencies = [ 1749 - "tinyvec_macros", 1750 - ] 1751 - 1752 - [[package]] 1753 - name = "tinyvec_macros" 1754 - version = "0.1.1" 1755 - source = "registry+https://github.com/rust-lang/crates.io-index" 1756 - checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1757 - 1758 - [[package]] 1759 663 name = "tokio" 1760 664 version = "1.50.0" 1761 665 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1780 684 dependencies = [ 1781 685 "proc-macro2", 1782 686 "quote", 1783 - "syn 2.0.117", 1784 - ] 1785 - 1786 - [[package]] 1787 - name = "tokio-stream" 1788 - version = "0.1.18" 1789 - source = "registry+https://github.com/rust-lang/crates.io-index" 1790 - checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" 1791 - dependencies = [ 1792 - "futures-core", 1793 - "pin-project-lite", 1794 - "tokio", 1795 - ] 1796 - 1797 - [[package]] 1798 - name = "tokio-util" 1799 - version = "0.7.18" 1800 - source = "registry+https://github.com/rust-lang/crates.io-index" 1801 - checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" 1802 - dependencies = [ 1803 - "bytes", 1804 - "futures-core", 1805 - "futures-sink", 1806 - "pin-project-lite", 1807 - "tokio", 687 + "syn", 1808 688 ] 1809 689 1810 690 [[package]] ··· 1813 693 source = "registry+https://github.com/rust-lang/crates.io-index" 1814 694 checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" 1815 695 dependencies = [ 1816 - "log", 1817 696 "pin-project-lite", 1818 697 "tracing-attributes", 1819 698 "tracing-core", ··· 1827 706 dependencies = [ 1828 707 "proc-macro2", 1829 708 "quote", 1830 - "syn 2.0.117", 709 + "syn", 1831 710 ] 1832 711 1833 712 [[package]] ··· 1866 745 ] 1867 746 1868 747 [[package]] 1869 - name = "typenum" 1870 - version = "1.19.0" 1871 - source = "registry+https://github.com/rust-lang/crates.io-index" 1872 - checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 1873 - 1874 - [[package]] 1875 - name = "unicode-bidi" 1876 - version = "0.3.18" 1877 - source = "registry+https://github.com/rust-lang/crates.io-index" 1878 - checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 1879 - 1880 - [[package]] 1881 748 name = "unicode-ident" 1882 749 version = "1.0.24" 1883 750 source = "registry+https://github.com/rust-lang/crates.io-index" 1884 751 checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 1885 752 1886 753 [[package]] 1887 - name = "unicode-normalization" 1888 - version = "0.1.25" 1889 - source = "registry+https://github.com/rust-lang/crates.io-index" 1890 - checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" 1891 - dependencies = [ 1892 - "tinyvec", 1893 - ] 1894 - 1895 - [[package]] 1896 - name = "unicode-properties" 1897 - version = "0.1.4" 1898 - source = "registry+https://github.com/rust-lang/crates.io-index" 1899 - checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" 1900 - 1901 - [[package]] 1902 - name = "unicode-segmentation" 1903 - version = "1.12.0" 1904 - source = "registry+https://github.com/rust-lang/crates.io-index" 1905 - checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 1906 - 1907 - [[package]] 1908 - name = "unicode-xid" 1909 - version = "0.2.6" 1910 - source = "registry+https://github.com/rust-lang/crates.io-index" 1911 - checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 1912 - 1913 - [[package]] 1914 - name = "unicode_categories" 1915 - version = "0.1.1" 1916 - source = "registry+https://github.com/rust-lang/crates.io-index" 1917 - checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" 1918 - 1919 - [[package]] 1920 - name = "url" 1921 - version = "2.5.8" 1922 - source = "registry+https://github.com/rust-lang/crates.io-index" 1923 - checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" 1924 - dependencies = [ 1925 - "form_urlencoded", 1926 - "idna", 1927 - "percent-encoding", 1928 - ] 1929 - 1930 - [[package]] 1931 - name = "urlencoding" 1932 - version = "2.1.3" 1933 - source = "registry+https://github.com/rust-lang/crates.io-index" 1934 - checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 1935 - 1936 - [[package]] 1937 - name = "utf8_iter" 1938 - version = "1.0.4" 1939 - source = "registry+https://github.com/rust-lang/crates.io-index" 1940 - checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1941 - 1942 - [[package]] 1943 754 name = "utf8parse" 1944 755 version = "0.2.2" 1945 756 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1970 781 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1971 782 1972 783 [[package]] 1973 - name = "wasip2" 1974 - version = "1.0.2+wasi-0.2.9" 1975 - source = "registry+https://github.com/rust-lang/crates.io-index" 1976 - checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" 1977 - dependencies = [ 1978 - "wit-bindgen", 1979 - ] 1980 - 1981 - [[package]] 1982 - name = "wasip3" 1983 - version = "0.4.0+wasi-0.3.0-rc-2026-01-06" 1984 - source = "registry+https://github.com/rust-lang/crates.io-index" 1985 - checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" 1986 - dependencies = [ 1987 - "wit-bindgen", 1988 - ] 1989 - 1990 - [[package]] 1991 - name = "wasite" 1992 - version = "0.1.0" 1993 - source = "registry+https://github.com/rust-lang/crates.io-index" 1994 - checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 1995 - 1996 - [[package]] 1997 784 name = "wasm-bindgen" 1998 785 version = "0.2.114" 1999 786 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2025 812 "bumpalo", 2026 813 "proc-macro2", 2027 814 "quote", 2028 - "syn 2.0.117", 815 + "syn", 2029 816 "wasm-bindgen-shared", 2030 817 ] 2031 818 ··· 2039 826 ] 2040 827 2041 828 [[package]] 2042 - name = "wasm-encoder" 2043 - version = "0.244.0" 2044 - source = "registry+https://github.com/rust-lang/crates.io-index" 2045 - checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" 2046 - dependencies = [ 2047 - "leb128fmt", 2048 - "wasmparser", 2049 - ] 2050 - 2051 - [[package]] 2052 - name = "wasm-metadata" 2053 - version = "0.244.0" 2054 - source = "registry+https://github.com/rust-lang/crates.io-index" 2055 - checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" 2056 - dependencies = [ 2057 - "anyhow", 2058 - "indexmap", 2059 - "wasm-encoder", 2060 - "wasmparser", 2061 - ] 2062 - 2063 - [[package]] 2064 - name = "wasmparser" 2065 - version = "0.244.0" 2066 - source = "registry+https://github.com/rust-lang/crates.io-index" 2067 - checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" 2068 - dependencies = [ 2069 - "bitflags", 2070 - "hashbrown 0.15.5", 2071 - "indexmap", 2072 - "semver", 2073 - ] 2074 - 2075 - [[package]] 2076 - name = "whoami" 2077 - version = "1.6.1" 2078 - source = "registry+https://github.com/rust-lang/crates.io-index" 2079 - checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" 2080 - dependencies = [ 2081 - "libredox", 2082 - "wasite", 2083 - ] 2084 - 2085 - [[package]] 2086 829 name = "windows-core" 2087 830 version = "0.62.2" 2088 831 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2103 846 dependencies = [ 2104 847 "proc-macro2", 2105 848 "quote", 2106 - "syn 2.0.117", 849 + "syn", 2107 850 ] 2108 851 2109 852 [[package]] ··· 2114 857 dependencies = [ 2115 858 "proc-macro2", 2116 859 "quote", 2117 - "syn 2.0.117", 860 + "syn", 2118 861 ] 2119 862 2120 863 [[package]] ··· 2217 960 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2218 961 2219 962 [[package]] 2220 - name = "wit-bindgen" 2221 - version = "0.51.0" 2222 - source = "registry+https://github.com/rust-lang/crates.io-index" 2223 - checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" 2224 - dependencies = [ 2225 - "wit-bindgen-rust-macro", 2226 - ] 2227 - 2228 - [[package]] 2229 - name = "wit-bindgen-core" 2230 - version = "0.51.0" 2231 - source = "registry+https://github.com/rust-lang/crates.io-index" 2232 - checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" 2233 - dependencies = [ 2234 - "anyhow", 2235 - "heck 0.5.0", 2236 - "wit-parser", 2237 - ] 2238 - 2239 - [[package]] 2240 - name = "wit-bindgen-rust" 2241 - version = "0.51.0" 2242 - source = "registry+https://github.com/rust-lang/crates.io-index" 2243 - checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" 2244 - dependencies = [ 2245 - "anyhow", 2246 - "heck 0.5.0", 2247 - "indexmap", 2248 - "prettyplease", 2249 - "syn 2.0.117", 2250 - "wasm-metadata", 2251 - "wit-bindgen-core", 2252 - "wit-component", 2253 - ] 2254 - 2255 - [[package]] 2256 - name = "wit-bindgen-rust-macro" 2257 - version = "0.51.0" 2258 - source = "registry+https://github.com/rust-lang/crates.io-index" 2259 - checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" 2260 - dependencies = [ 2261 - "anyhow", 2262 - "prettyplease", 2263 - "proc-macro2", 2264 - "quote", 2265 - "syn 2.0.117", 2266 - "wit-bindgen-core", 2267 - "wit-bindgen-rust", 2268 - ] 2269 - 2270 - [[package]] 2271 - name = "wit-component" 2272 - version = "0.244.0" 2273 - source = "registry+https://github.com/rust-lang/crates.io-index" 2274 - checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" 2275 - dependencies = [ 2276 - "anyhow", 2277 - "bitflags", 2278 - "indexmap", 2279 - "log", 2280 - "serde", 2281 - "serde_derive", 2282 - "serde_json", 2283 - "wasm-encoder", 2284 - "wasm-metadata", 2285 - "wasmparser", 2286 - "wit-parser", 2287 - ] 2288 - 2289 - [[package]] 2290 - name = "wit-parser" 2291 - version = "0.244.0" 2292 - source = "registry+https://github.com/rust-lang/crates.io-index" 2293 - checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" 2294 - dependencies = [ 2295 - "anyhow", 2296 - "id-arena", 2297 - "indexmap", 2298 - "log", 2299 - "semver", 2300 - "serde", 2301 - "serde_derive", 2302 - "serde_json", 2303 - "unicode-xid", 2304 - "wasmparser", 2305 - ] 2306 - 2307 - [[package]] 2308 - name = "writeable" 2309 - version = "0.6.2" 2310 - source = "registry+https://github.com/rust-lang/crates.io-index" 2311 - checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 2312 - 2313 - [[package]] 2314 - name = "yoke" 2315 - version = "0.8.1" 2316 - source = "registry+https://github.com/rust-lang/crates.io-index" 2317 - checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 2318 - dependencies = [ 2319 - "stable_deref_trait", 2320 - "yoke-derive", 2321 - "zerofrom", 2322 - ] 2323 - 2324 - [[package]] 2325 - name = "yoke-derive" 2326 - version = "0.8.1" 2327 - source = "registry+https://github.com/rust-lang/crates.io-index" 2328 - checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 2329 - dependencies = [ 2330 - "proc-macro2", 2331 - "quote", 2332 - "syn 2.0.117", 2333 - "synstructure", 2334 - ] 2335 - 2336 - [[package]] 2337 963 name = "zerocopy" 2338 964 version = "0.8.42" 2339 965 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2350 976 dependencies = [ 2351 977 "proc-macro2", 2352 978 "quote", 2353 - "syn 2.0.117", 2354 - ] 2355 - 2356 - [[package]] 2357 - name = "zerofrom" 2358 - version = "0.1.6" 2359 - source = "registry+https://github.com/rust-lang/crates.io-index" 2360 - checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2361 - dependencies = [ 2362 - "zerofrom-derive", 2363 - ] 2364 - 2365 - [[package]] 2366 - name = "zerofrom-derive" 2367 - version = "0.1.6" 2368 - source = "registry+https://github.com/rust-lang/crates.io-index" 2369 - checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2370 - dependencies = [ 2371 - "proc-macro2", 2372 - "quote", 2373 - "syn 2.0.117", 2374 - "synstructure", 2375 - ] 2376 - 2377 - [[package]] 2378 - name = "zeroize" 2379 - version = "1.8.2" 2380 - source = "registry+https://github.com/rust-lang/crates.io-index" 2381 - checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 2382 - 2383 - [[package]] 2384 - name = "zerotrie" 2385 - version = "0.2.3" 2386 - source = "registry+https://github.com/rust-lang/crates.io-index" 2387 - checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 2388 - dependencies = [ 2389 - "displaydoc", 2390 - "yoke", 2391 - "zerofrom", 2392 - ] 2393 - 2394 - [[package]] 2395 - name = "zerovec" 2396 - version = "0.11.5" 2397 - source = "registry+https://github.com/rust-lang/crates.io-index" 2398 - checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 2399 - dependencies = [ 2400 - "yoke", 2401 - "zerofrom", 2402 - "zerovec-derive", 2403 - ] 2404 - 2405 - [[package]] 2406 - name = "zerovec-derive" 2407 - version = "0.11.2" 2408 - source = "registry+https://github.com/rust-lang/crates.io-index" 2409 - checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 2410 - dependencies = [ 2411 - "proc-macro2", 2412 - "quote", 2413 - "syn 2.0.117", 979 + "syn", 2414 980 ] 2415 981 2416 982 [[package]]
+1 -4
Cargo.toml
··· 5 5 6 6 [dependencies] 7 7 tokio = { version = "1", features = ["full"] } 8 - tokio-util = { version = "0.7", features = ["codec"] } 9 - futures = "0.3" 10 8 tracing = "0.1" 11 9 tracing-subscriber = "0.3" 12 - sqlx = { version = "0.7", features = ["runtime-tokio", "sqlite"] } 10 + rusqlite = { version = "0.31", features = ["bundled"] } 13 11 chrono = "0.4" 14 12 clap = { version = "4", features = ["derive", "env"] } 15 13 anyhow = "1.0" 16 14 directories = "5.0" 17 15 serde = { version = "1.0", features = ["derive"] } 18 16 serde_json = "1.0" 19 - bytes = "1.0"
-19
migrations/20231027_init.sql
··· 1 - CREATE TABLE IF NOT EXISTS events ( 2 - id INTEGER PRIMARY KEY AUTOINCREMENT, 3 - nix_id INTEGER, 4 - parent_id INTEGER, 5 - event_type INTEGER, 6 - text TEXT, 7 - drv_path TEXT, 8 - cache_url TEXT, 9 - start_time TEXT, 10 - end_time TEXT, 11 - duration_ms INTEGER, 12 - total_bytes INTEGER 13 - ); 14 - CREATE TABLE IF NOT EXISTS phases ( 15 - id INTEGER PRIMARY KEY AUTOINCREMENT, 16 - event_nix_id INTEGER, 17 - phase_name TEXT, 18 - duration_ms INTEGER 19 - );
+156 -138
src/main.rs
··· 2 2 use chrono::{DateTime, Utc}; 3 3 use clap::{Parser, Subcommand}; 4 4 use directories::ProjectDirs; 5 + use rusqlite::Connection; 5 6 use serde::{Deserialize, Serialize}; 6 - use sqlx::{sqlite::SqliteConnectOptions, sqlite::SqlitePoolOptions, Pool, Sqlite}; 7 7 use std::collections::HashMap; 8 8 use std::fmt; 9 9 use std::path::PathBuf; 10 - use std::str::FromStr; 11 - use std::sync::Arc; 10 + use std::sync::{Arc, Mutex}; 12 11 use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; 13 12 use tokio::net::{UnixListener, UnixStream}; 14 - use tokio::sync::Mutex; 15 13 use tracing::{error, info}; 16 14 15 + // Schema version - increment when the schema changes incompatibly. 16 + const SCHEMA_VERSION: u32 = 1; 17 + 18 + const SCHEMA: &str = " 19 + CREATE TABLE IF NOT EXISTS events ( 20 + id INTEGER PRIMARY KEY AUTOINCREMENT, 21 + nix_id INTEGER, 22 + parent_id INTEGER, 23 + event_type INTEGER, 24 + text TEXT, 25 + drv_path TEXT, 26 + cache_url TEXT, 27 + start_time TEXT, 28 + end_time TEXT, 29 + duration_ms INTEGER, 30 + total_bytes INTEGER 31 + ); 32 + "; 33 + 17 34 #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] 18 - #[serde(from = "u64")] 19 35 #[repr(u64)] 20 36 enum ActivityType { 21 37 Unknown = 0, ··· 55 71 } 56 72 } 57 73 58 - impl From<i64> for ActivityType { 59 - fn from(n: i64) -> Self { 60 - Self::from(n as u64) 61 - } 62 - } 63 - 64 - impl Default for ActivityType { 65 - fn default() -> Self { Self::Unknown } 66 - } 67 - 68 74 impl fmt::Display for ActivityType { 69 75 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 70 76 write!(f, "{:?}", self) 71 77 } 72 78 } 73 79 74 - #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] 75 - #[repr(u64)] 80 + #[derive(Debug, Clone, Copy, PartialEq, Eq)] 76 81 enum ResultType { 77 - Unknown = 0, 78 - FileLinked = 100, 79 - BuildLogLine = 101, 80 - UntrustedPath = 102, 81 - CorruptedPath = 103, 82 - SetPhase = 104, 83 - Progress = 105, 84 - SetExpected = 106, 85 - PostBuildLogLine = 107, 86 - FetchStatus = 108, 82 + Unknown, 83 + FileLinked, 84 + BuildLogLine, 85 + UntrustedPath, 86 + CorruptedPath, 87 + SetPhase, 88 + Progress, 89 + SetExpected, 90 + PostBuildLogLine, 91 + FetchStatus, 87 92 } 88 93 89 94 impl From<u64> for ResultType { ··· 109 114 } 110 115 } 111 116 112 - impl Default for ResultType { 113 - fn default() -> Self { Self::Unknown } 114 - } 115 - 116 117 #[derive(Parser)] 117 118 struct Cli { 118 119 #[command(subcommand)] ··· 123 124 enum Commands { 124 125 /// Run the observability daemon 125 126 Daemon { 126 - /// SQLite database URL 127 - #[arg(short, long, env = "DATABASE_URL")] 128 - db_url: Option<String>, 127 + /// Path to the SQLite database file 128 + #[arg(short, long, env = "NOD_DB")] 129 + db: Option<PathBuf>, 129 130 /// Path to the Unix socket 130 131 #[arg(short, long, env = "NOD_SOCKET")] 131 132 socket: Option<PathBuf>, ··· 198 199 199 200 struct State { 200 201 active_activities: HashMap<u64, Activity>, 201 - pool: Pool<Sqlite>, 202 + db: Arc<Mutex<Connection>>, 203 + } 204 + 205 + fn open_db(path: &PathBuf) -> Result<Connection> { 206 + let conn = Connection::open(path) 207 + .with_context(|| format!("Failed to open database at {}", path.display()))?; 208 + 209 + // Check schema version; reset if mismatched. 210 + let version: u32 = conn 211 + .query_row("PRAGMA user_version", [], |r| r.get(0)) 212 + .unwrap_or(0); 213 + 214 + if version != 0 && version != SCHEMA_VERSION { 215 + info!(current = version, expected = SCHEMA_VERSION, "Schema version mismatch, resetting database"); 216 + drop(conn); 217 + std::fs::remove_file(path) 218 + .with_context(|| format!("Failed to remove stale database at {}", path.display()))?; 219 + return open_db(path); 220 + } 221 + 222 + conn.execute_batch(SCHEMA) 223 + .context("Failed to create schema")?; 224 + conn.execute_batch(&format!("PRAGMA user_version = {}", SCHEMA_VERSION)) 225 + .context("Failed to set schema version")?; 226 + conn.execute_batch("PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL;") 227 + .context("Failed to configure WAL mode")?; 228 + 229 + Ok(conn) 202 230 } 203 231 204 232 #[tokio::main] ··· 208 236 209 237 let project_dirs = ProjectDirs::from("org", "nixos", "nod"); 210 238 211 - let command = cli.command.unwrap_or(Commands::Daemon { db_url: None, socket: None }); 239 + let command = cli.command.unwrap_or(Commands::Daemon { db: None, socket: None }); 212 240 213 241 match command { 214 - Commands::Daemon { db_url, socket } => { 215 - let db_url = db_url.unwrap_or_else(|| { 216 - let db_path = project_dirs.as_ref() 242 + Commands::Daemon { db, socket } => { 243 + let db_path = db.unwrap_or_else(|| { 244 + project_dirs.as_ref() 217 245 .map(|d| d.data_dir().join("nod.db")) 218 - .unwrap_or_else(|| PathBuf::from("nod.db")); 219 - format!("sqlite:{}", db_path.display()) 246 + .unwrap_or_else(|| PathBuf::from("nod.db")) 220 247 }); 221 248 222 249 let socket_path = socket.unwrap_or_else(|| { ··· 226 253 .unwrap_or_else(|| PathBuf::from("/tmp/nod.sock")) 227 254 }); 228 255 229 - let connection_options = SqliteConnectOptions::from_str(&db_url) 230 - .context("Invalid database URL")? 231 - .create_if_missing(true); 232 - 233 - if let Ok(opts) = SqliteConnectOptions::from_str(&db_url) { 234 - if let Some(parent) = opts.get_filename().parent() { 235 - if !parent.as_os_str().is_empty() { 236 - std::fs::create_dir_all(parent) 237 - .with_context(|| format!("Failed to create database directory: {}", parent.display()))?; 238 - } 256 + if let Some(parent) = db_path.parent() { 257 + if !parent.as_os_str().is_empty() { 258 + std::fs::create_dir_all(parent) 259 + .with_context(|| format!("Failed to create database directory: {}", parent.display()))?; 239 260 } 240 261 } 241 262 ··· 246 267 } 247 268 } 248 269 249 - let pool = SqlitePoolOptions::new() 250 - .max_connections(5) 251 - .connect_with(connection_options) 252 - .await 253 - .context("Failed to connect to database")?; 254 - 255 - sqlx::migrate!("./migrations") 256 - .run(&pool) 257 - .await 258 - .context("Failed to run database migrations")?; 259 - 260 - run_daemon(socket_path, pool).await.context("Daemon failed")? 270 + let conn = open_db(&db_path)?; 271 + run_daemon(socket_path, Arc::new(Mutex::new(conn))).await.context("Daemon failed")? 261 272 } 262 273 Commands::Stats { socket } => { 263 274 let socket_path = socket.unwrap_or_else(|| { ··· 292 303 .with_context(|| format!("Failed to connect to daemon at {}", socket_path.display()))?; 293 304 294 305 stream.write_all(b"clean\n").await?; 295 - 306 + 296 307 let mut reader = BufReader::new(stream); 297 308 let mut line = String::new(); 298 309 reader.read_line(&mut line).await.context("Daemon closed connection")?; 299 - 310 + 300 311 if line.trim() == "ok" { 301 312 info!("Database cleared successfully."); 302 313 } else { ··· 308 319 Ok(()) 309 320 } 310 321 311 - async fn run_daemon(socket_path: PathBuf, pool: Pool<Sqlite>) -> Result<()> { 322 + async fn run_daemon(socket_path: PathBuf, db: Arc<Mutex<Connection>>) -> Result<()> { 312 323 let state = Arc::new(Mutex::new(State { 313 324 active_activities: HashMap::new(), 314 - pool, 325 + db, 315 326 })); 316 327 317 328 if socket_path.exists() { 318 - std::fs::remove_file(&socket_path).with_context(|| format!("Failed to remove existing socket at {}", socket_path.display()))?; 329 + std::fs::remove_file(&socket_path) 330 + .with_context(|| format!("Failed to remove existing socket at {}", socket_path.display()))?; 319 331 } 320 332 321 333 let listener = UnixListener::bind(&socket_path) ··· 343 355 let cmd = line.trim(); 344 356 345 357 if cmd == "get_stats" { 346 - let pool = state.lock().await.pool.clone(); 347 - let stats = collect_stats(pool).await?; 358 + let db = state.lock().unwrap().db.clone(); 359 + let stats = tokio::task::spawn_blocking(move || collect_stats(&db)) 360 + .await??; 348 361 writer.write_all((serde_json::to_string(&stats)? + "\n").as_bytes()).await?; 349 362 break; 350 363 } 351 364 if cmd == "clean" { 352 - let pool = state.lock().await.pool.clone(); 353 - sqlx::query("DELETE FROM phases").execute(&pool).await?; 354 - sqlx::query("DELETE FROM events").execute(&pool).await?; 355 - sqlx::query("VACUUM").execute(&pool).await?; 365 + let db = state.lock().unwrap().db.clone(); 366 + tokio::task::spawn_blocking(move || -> Result<()> { 367 + let conn = db.lock().unwrap(); 368 + conn.execute_batch("DELETE FROM events; VACUUM;")?; 369 + Ok(()) 370 + }).await??; 356 371 writer.write_all(b"ok\n").await?; 357 372 info!("Database cleared via socket command"); 358 373 break; 359 374 } 360 375 361 - if let Ok(event) = serde_json::from_str::<NixEvent>(&line) { 362 - process_event(event, &state).await?; 376 + if let Ok(event) = serde_json::from_str::<NixEvent>(cmd) { 377 + process_event(event, &state)?; 363 378 } 364 379 } 365 380 Ok(()) 366 381 } 367 382 368 - async fn process_event(event: NixEvent, state: &Arc<Mutex<State>>) -> Result<()> { 369 - let mut s = state.lock().await; 383 + fn process_event(event: NixEvent, state: &Arc<Mutex<State>>) -> Result<()> { 384 + let mut s = state.lock().unwrap(); 370 385 371 386 match event.action.as_str() { 372 387 "start" => { ··· 407 422 ); 408 423 409 424 if let Some(act) = s.active_activities.get_mut(&event.id) { 410 - match res_type { 411 - ResultType::Progress => { 412 - if let Some(total) = event.fields.get(1).and_then(|v| v.as_u64()) { 413 - if total > 0 { act.total_bytes = total; } 414 - } 425 + if res_type == ResultType::Progress { 426 + if let Some(total) = event.fields.get(1).and_then(|v| v.as_u64()) { 427 + if total > 0 { act.total_bytes = total; } 415 428 } 416 - _ => {} 417 429 } 418 430 } 419 431 } ··· 421 433 if let Some(act) = s.active_activities.remove(&event.id) { 422 434 let act_type = ActivityType::from(act.event_type); 423 435 let end_time = Utc::now(); 424 - let duration = end_time.signed_duration_since(act.start_time).num_milliseconds(); 436 + let duration_ms = end_time.signed_duration_since(act.start_time).num_milliseconds(); 425 437 426 438 info!( 427 439 id = act.id, 428 440 act_type = %act_type, 429 - duration_ms = duration, 441 + duration_ms, 430 442 total_bytes = act.total_bytes, 431 443 text = %act.text, 432 444 fields = ?act.fields, ··· 440 452 None 441 453 }; 442 454 443 - let nix_id = act.id as i64; 444 - let parent_id = act.parent_id as i64; 445 - let event_type_i64 = act.event_type as i64; 446 - let start_time_str = act.start_time.to_rfc3339(); 447 - let end_time_str = end_time.to_rfc3339(); 448 - let total_bytes_i64 = act.total_bytes as i64; 449 - 450 - sqlx::query!( 455 + let conn = s.db.lock().unwrap(); 456 + conn.execute( 451 457 "INSERT INTO events (nix_id, parent_id, event_type, text, drv_path, cache_url, start_time, end_time, duration_ms, total_bytes) 452 - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", 453 - nix_id, parent_id, event_type_i64, act.text, drv_path, cache_url, 454 - start_time_str, end_time_str, duration, total_bytes_i64 455 - ) 456 - .execute(&s.pool) 457 - .await?; 458 + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10)", 459 + rusqlite::params![ 460 + act.id as i64, 461 + act.parent_id as i64, 462 + act.event_type as i64, 463 + act.text, 464 + drv_path, 465 + cache_url, 466 + act.start_time.to_rfc3339(), 467 + end_time.to_rfc3339(), 468 + duration_ms, 469 + act.total_bytes as i64, 470 + ], 471 + ).context("Failed to insert event")?; 458 472 } 459 473 } 460 474 _ => { ··· 464 478 Ok(()) 465 479 } 466 480 467 - async fn collect_stats(pool: Pool<Sqlite>) -> Result<Stats> { 468 - // Single pass over events for the three summary counters. 469 - // CAST(COUNT FILTER) returns i32, COALESCE(SUM, 0) returns i32 in sqlx SQLite. 470 - let summary = sqlx::query!( 471 - "SELECT 472 - CAST(COUNT(*) FILTER (WHERE event_type = 105) AS INTEGER) as \"build_count!\", 473 - COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 105), 0) as \"build_total_ms!\", 474 - CAST(COUNT(*) FILTER (WHERE event_type = 108) AS INTEGER) as \"subst_count!\", 475 - COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 108), 0) as \"subst_total_ms!\", 476 - COALESCE(SUM(total_bytes) FILTER (WHERE event_type = 101), 0) as \"download_bytes!\", 477 - COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 101), 0) as \"download_ms!\" 478 - FROM events" 479 - ).fetch_one(&pool).await?; 481 + fn collect_stats(db: &Arc<Mutex<Connection>>) -> Result<Stats> { 482 + let conn = db.lock().unwrap(); 483 + 484 + let (build_count, build_total_ms, subst_count, subst_total_ms, download_bytes, download_ms) = 485 + conn.query_row( 486 + "SELECT 487 + COUNT(*) FILTER (WHERE event_type = 105), 488 + COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 105), 0), 489 + COUNT(*) FILTER (WHERE event_type = 108), 490 + COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 108), 0), 491 + COALESCE(SUM(total_bytes) FILTER (WHERE event_type = 101), 0), 492 + COALESCE(SUM(duration_ms) FILTER (WHERE event_type = 101), 0) 493 + FROM events", 494 + [], 495 + |r| Ok((r.get::<_, i64>(0)?, r.get::<_, i64>(1)?, r.get::<_, i64>(2)?, 496 + r.get::<_, i64>(3)?, r.get::<_, i64>(4)?, r.get::<_, i64>(5)?)), 497 + ).context("Failed to query summary stats")?; 480 498 481 - // Top 10 slowest local builds. 482 - let slowest_builds = sqlx::query_as!( 483 - SlowBuild, 484 - "SELECT duration_ms as \"duration_ms!\", drv_path, text 499 + let mut stmt = conn.prepare( 500 + "SELECT duration_ms, drv_path, text 485 501 FROM events WHERE event_type = 105 486 - ORDER BY duration_ms DESC LIMIT 10" 487 - ).fetch_all(&pool).await?; 502 + ORDER BY duration_ms DESC LIMIT 10", 503 + ).context("Failed to prepare slowest builds query")?; 504 + let slowest_builds: Vec<SlowBuild> = stmt.query_map([], |r| { 505 + Ok(SlowBuild { 506 + duration_ms: r.get(0)?, 507 + drv_path: r.get(1)?, 508 + text: r.get(2)?, 509 + }) 510 + })?.filter_map(|r| r.ok()).collect(); 488 511 489 - // Per-cache average query latency (QueryPathInfo = 109 stores cache_url). 490 - let cache_latency = sqlx::query_as!( 491 - CacheStat, 492 - "SELECT cache_url as \"cache_url!\", CAST(AVG(duration_ms) AS REAL) as \"avg_ms!\", CAST(COUNT(*) AS INTEGER) as \"count!\" 512 + let mut stmt = conn.prepare( 513 + "SELECT cache_url, AVG(duration_ms), COUNT(*) 493 514 FROM events WHERE cache_url IS NOT NULL 494 - GROUP BY cache_url ORDER BY 2 DESC" 495 - ).fetch_all(&pool).await?; 515 + GROUP BY cache_url ORDER BY AVG(duration_ms) DESC", 516 + ).context("Failed to prepare cache latency query")?; 517 + let cache_latency: Vec<CacheStat> = stmt.query_map([], |r| { 518 + Ok(CacheStat { 519 + cache_url: r.get(0)?, 520 + avg_ms: r.get(1)?, 521 + count: r.get(2)?, 522 + }) 523 + })?.filter_map(|r| r.ok()).collect(); 496 524 497 - Ok(Stats { 498 - build_count: summary.build_count as i64, 499 - build_total_ms: summary.build_total_ms as i64, 500 - subst_count: summary.subst_count as i64, 501 - subst_total_ms: summary.subst_total_ms as i64, 502 - download_bytes: summary.download_bytes as i64, 503 - download_ms: summary.download_ms as i64, 504 - slowest_builds, 505 - cache_latency, 506 - }) 525 + Ok(Stats { build_count, build_total_ms, subst_count, subst_total_ms, download_bytes, download_ms, slowest_builds, cache_latency }) 507 526 } 508 527 509 528 fn fmt_ms(ms: i64) -> String { ··· 516 535 } 517 536 } 518 537 519 - // Strip /nix/store/<hash>- prefix to get the human-readable package name. 538 + // Strip /nix/store/<32-char-hash>- prefix to get the human-readable package name. 520 539 fn drv_name(path: &str) -> &str { 521 540 let s = path.strip_prefix("/nix/store/").unwrap_or(path); 522 - // hash is 32 hex chars followed by '-' 523 - if s.len() > 33 && s.chars().take(32).all(|c| c.is_ascii_hexdigit()) && s.as_bytes()[32] == b'-' { 541 + if s.len() > 33 && s.as_bytes()[32] == b'-' && s[..32].chars().all(|c| c.is_ascii_alphanumeric()) { 524 542 &s[33..] 525 543 } else { 526 544 s