Experiments in applying Entity-Component-System patterns to durable data storage APIs.

Ecs: Add (optional) change tracking #1

closed opened by moritz.vongoewels.de targeting main from mvg/push-xuwrltyunnop
Labels

None yet.

assignee

None yet.

Participants 1
AT URI
at://did:plc:6mxidoalkl5es5lek7ey2ziq/sh.tangled.repo.pull/3m3rh2iaxcz22
+386 -174
Diff #0
+194 -170
Cargo.lock
··· 4 4 5 5 [[package]] 6 6 name = "ahash" 7 - version = "0.8.11" 7 + version = "0.8.12" 8 8 source = "registry+https://github.com/rust-lang/crates.io-index" 9 - checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 9 + checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 10 10 dependencies = [ 11 11 "cfg-if", 12 12 "once_cell", ··· 14 14 "zerocopy", 15 15 ] 16 16 17 - [[package]] 18 - name = "android-tzdata" 19 - version = "0.1.1" 20 - source = "registry+https://github.com/rust-lang/crates.io-index" 21 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 22 - 23 17 [[package]] 24 18 name = "android_system_properties" 25 19 version = "0.1.5" ··· 31 25 32 26 [[package]] 33 27 name = "anyhow" 34 - version = "1.0.94" 28 + version = "1.0.100" 35 29 source = "registry+https://github.com/rust-lang/crates.io-index" 36 - checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" 30 + checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 37 31 38 32 [[package]] 39 33 name = "anymap" ··· 43 37 44 38 [[package]] 45 39 name = "autocfg" 46 - version = "1.4.0" 40 + version = "1.5.0" 47 41 source = "registry+https://github.com/rust-lang/crates.io-index" 48 - checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 42 + checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 49 43 50 44 [[package]] 51 45 name = "bitflags" 52 - version = "2.6.0" 46 + version = "2.9.4" 53 47 source = "registry+https://github.com/rust-lang/crates.io-index" 54 - checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 48 + checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 55 49 56 50 [[package]] 57 51 name = "bumpalo" 58 - version = "3.16.0" 52 + version = "3.19.0" 59 53 source = "registry+https://github.com/rust-lang/crates.io-index" 60 - checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 54 + checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 61 55 62 56 [[package]] 63 57 name = "cc" 64 - version = "1.2.2" 58 + version = "1.2.38" 65 59 source = "registry+https://github.com/rust-lang/crates.io-index" 66 - checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" 60 + checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" 67 61 dependencies = [ 62 + "find-msvc-tools", 68 63 "shlex", 69 64 ] 70 65 71 66 [[package]] 72 67 name = "cfg-if" 73 - version = "1.0.0" 68 + version = "1.0.3" 74 69 source = "registry+https://github.com/rust-lang/crates.io-index" 75 - checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 70 + checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 76 71 77 72 [[package]] 78 73 name = "chrono" 79 - version = "0.4.38" 74 + version = "0.4.42" 80 75 source = "registry+https://github.com/rust-lang/crates.io-index" 81 - checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 76 + checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 82 77 dependencies = [ 83 - "android-tzdata", 84 78 "iana-time-zone", 85 79 "js-sys", 86 80 "num-traits", 87 81 "serde", 88 82 "wasm-bindgen", 89 - "windows-targets", 83 + "windows-link", 90 84 ] 91 85 92 86 [[package]] ··· 97 91 98 92 [[package]] 99 93 name = "darling" 100 - version = "0.20.10" 94 + version = "0.20.11" 101 95 source = "registry+https://github.com/rust-lang/crates.io-index" 102 - checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 96 + checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 103 97 dependencies = [ 104 98 "darling_core", 105 99 "darling_macro", ··· 107 101 108 102 [[package]] 109 103 name = "darling_core" 110 - version = "0.20.10" 104 + version = "0.20.11" 111 105 source = "registry+https://github.com/rust-lang/crates.io-index" 112 - checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 106 + checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 113 107 dependencies = [ 114 108 "fnv", 115 109 "ident_case", ··· 120 114 121 115 [[package]] 122 116 name = "darling_macro" 123 - version = "0.20.10" 117 + version = "0.20.11" 124 118 source = "registry+https://github.com/rust-lang/crates.io-index" 125 - checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 119 + checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 126 120 dependencies = [ 127 121 "darling_core", 128 122 "quote", ··· 144 138 "sea-query", 145 139 "serde", 146 140 "serde_json", 147 - "thiserror 2.0.4", 141 + "thiserror", 148 142 "tracing", 149 143 "tracing-subscriber", 150 144 ] ··· 160 154 161 155 [[package]] 162 156 name = "eloquent" 163 - version = "2.0.3" 157 + version = "2.0.4" 164 158 source = "registry+https://github.com/rust-lang/crates.io-index" 165 - checksum = "517c3a122847f4da19d35f4bdbc40a712f1640b535a59c0559e2dbf3a39847f3" 159 + checksum = "ebac9654d805c45acdc34fbd1662c9fb2f0f83212a5d1af5d535c378233ff1b9" 166 160 dependencies = [ 167 161 "eloquent_core", 168 162 ] 169 163 170 164 [[package]] 171 165 name = "eloquent_core" 172 - version = "2.0.2" 166 + version = "2.0.4" 173 167 source = "registry+https://github.com/rust-lang/crates.io-index" 174 - checksum = "5a4ed861817efa9c37276a12abf36194a9737f54ab86ceaac973ee0bfb901ede" 168 + checksum = "d29024f25aa28620ab42d49ab4d1ca77ec5fa8140389a9d3ad8b7ac980a7b640" 175 169 dependencies = [ 176 170 "log", 177 171 "sqlformat", ··· 189 183 source = "registry+https://github.com/rust-lang/crates.io-index" 190 184 checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" 191 185 186 + [[package]] 187 + name = "find-msvc-tools" 188 + version = "0.1.2" 189 + source = "registry+https://github.com/rust-lang/crates.io-index" 190 + checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" 191 + 192 192 [[package]] 193 193 name = "fnv" 194 194 version = "1.0.7" ··· 227 227 228 228 [[package]] 229 229 name = "iana-time-zone" 230 - version = "0.1.61" 230 + version = "0.1.64" 231 231 source = "registry+https://github.com/rust-lang/crates.io-index" 232 - checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 232 + checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 233 233 dependencies = [ 234 234 "android_system_properties", 235 235 "core-foundation-sys", 236 236 "iana-time-zone-haiku", 237 237 "js-sys", 238 + "log", 238 239 "wasm-bindgen", 239 240 "windows-core", 240 241 ] ··· 256 257 257 258 [[package]] 258 259 name = "inherent" 259 - version = "1.0.11" 260 + version = "1.0.13" 260 261 source = "registry+https://github.com/rust-lang/crates.io-index" 261 - checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" 262 + checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" 262 263 dependencies = [ 263 264 "proc-macro2", 264 265 "quote", ··· 267 268 268 269 [[package]] 269 270 name = "itoa" 270 - version = "1.0.14" 271 + version = "1.0.15" 271 272 source = "registry+https://github.com/rust-lang/crates.io-index" 272 - checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 273 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 273 274 274 275 [[package]] 275 276 name = "js-sys" 276 - version = "0.3.74" 277 + version = "0.3.80" 277 278 source = "registry+https://github.com/rust-lang/crates.io-index" 278 - checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" 279 + checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" 279 280 dependencies = [ 280 281 "once_cell", 281 282 "wasm-bindgen", ··· 289 290 290 291 [[package]] 291 292 name = "libc" 292 - version = "0.2.167" 293 + version = "0.2.176" 293 294 source = "registry+https://github.com/rust-lang/crates.io-index" 294 - checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" 295 + checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" 295 296 296 297 [[package]] 297 298 name = "libsqlite3-sys" ··· 305 306 306 307 [[package]] 307 308 name = "log" 308 - version = "0.4.22" 309 + version = "0.4.28" 309 310 source = "registry+https://github.com/rust-lang/crates.io-index" 310 - checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 311 + checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 311 312 312 313 [[package]] 313 314 name = "memchr" 314 - version = "2.7.4" 315 - source = "registry+https://github.com/rust-lang/crates.io-index" 316 - checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 317 - 318 - [[package]] 319 - name = "minimal-lexical" 320 - version = "0.2.1" 321 - source = "registry+https://github.com/rust-lang/crates.io-index" 322 - checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 323 - 324 - [[package]] 325 - name = "nom" 326 - version = "7.1.3" 315 + version = "2.7.5" 327 316 source = "registry+https://github.com/rust-lang/crates.io-index" 328 - checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 329 - dependencies = [ 330 - "memchr", 331 - "minimal-lexical", 332 - ] 317 + checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 333 318 334 319 [[package]] 335 320 name = "nu-ansi-term" 336 - version = "0.46.0" 321 + version = "0.50.1" 337 322 source = "registry+https://github.com/rust-lang/crates.io-index" 338 - checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 323 + checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" 339 324 dependencies = [ 340 - "overload", 341 - "winapi", 325 + "windows-sys", 342 326 ] 343 327 344 328 [[package]] ··· 352 336 353 337 [[package]] 354 338 name = "once_cell" 355 - version = "1.20.2" 356 - source = "registry+https://github.com/rust-lang/crates.io-index" 357 - checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 358 - 359 - [[package]] 360 - name = "overload" 361 - version = "0.1.1" 339 + version = "1.21.3" 362 340 source = "registry+https://github.com/rust-lang/crates.io-index" 363 - checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 341 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 364 342 365 343 [[package]] 366 344 name = "pin-project-lite" 367 - version = "0.2.15" 345 + version = "0.2.16" 368 346 source = "registry+https://github.com/rust-lang/crates.io-index" 369 - checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" 347 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 370 348 371 349 [[package]] 372 350 name = "pkg-config" 373 - version = "0.3.31" 351 + version = "0.3.32" 374 352 source = "registry+https://github.com/rust-lang/crates.io-index" 375 - checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 353 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 376 354 377 355 [[package]] 378 356 name = "proc-macro2" 379 - version = "1.0.92" 357 + version = "1.0.101" 380 358 source = "registry+https://github.com/rust-lang/crates.io-index" 381 - checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" 359 + checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 382 360 dependencies = [ 383 361 "unicode-ident", 384 362 ] 385 363 386 364 [[package]] 387 365 name = "quote" 388 - version = "1.0.37" 366 + version = "1.0.40" 389 367 source = "registry+https://github.com/rust-lang/crates.io-index" 390 - checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 368 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 391 369 dependencies = [ 392 370 "proc-macro2", 393 371 ] ··· 406 384 "smallvec", 407 385 ] 408 386 387 + [[package]] 388 + name = "rustversion" 389 + version = "1.0.22" 390 + source = "registry+https://github.com/rust-lang/crates.io-index" 391 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 392 + 409 393 [[package]] 410 394 name = "ryu" 411 - version = "1.0.18" 395 + version = "1.0.20" 412 396 source = "registry+https://github.com/rust-lang/crates.io-index" 413 - checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 397 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 414 398 415 399 [[package]] 416 400 name = "sea-query" 417 - version = "0.32.1" 401 + version = "0.32.7" 418 402 source = "registry+https://github.com/rust-lang/crates.io-index" 419 - checksum = "085e94f7d7271c0393ac2d164a39994b1dff1b06bc40cd9a0da04f3d672b0fee" 403 + checksum = "8a5d1c518eaf5eda38e5773f902b26ab6d5e9e9e2bb2349ca6c64cf96f80448c" 420 404 dependencies = [ 421 405 "inherent", 422 406 "sea-query-derive", ··· 424 408 425 409 [[package]] 426 410 name = "sea-query-derive" 427 - version = "0.4.2" 411 + version = "0.4.3" 428 412 source = "registry+https://github.com/rust-lang/crates.io-index" 429 - checksum = "9834af2c4bd8c5162f00c89f1701fb6886119a88062cf76fe842ea9e232b9839" 413 + checksum = "bae0cbad6ab996955664982739354128c58d16e126114fe88c2a493642502aab" 430 414 dependencies = [ 431 415 "darling", 432 416 "heck", 433 417 "proc-macro2", 434 418 "quote", 435 419 "syn", 436 - "thiserror 1.0.69", 420 + "thiserror", 437 421 ] 438 422 439 423 [[package]] 440 424 name = "serde" 441 - version = "1.0.215" 425 + version = "1.0.226" 426 + source = "registry+https://github.com/rust-lang/crates.io-index" 427 + checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" 428 + dependencies = [ 429 + "serde_core", 430 + "serde_derive", 431 + ] 432 + 433 + [[package]] 434 + name = "serde_core" 435 + version = "1.0.226" 442 436 source = "registry+https://github.com/rust-lang/crates.io-index" 443 - checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" 437 + checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" 444 438 dependencies = [ 445 439 "serde_derive", 446 440 ] 447 441 448 442 [[package]] 449 443 name = "serde_derive" 450 - version = "1.0.215" 444 + version = "1.0.226" 451 445 source = "registry+https://github.com/rust-lang/crates.io-index" 452 - checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" 446 + checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" 453 447 dependencies = [ 454 448 "proc-macro2", 455 449 "quote", ··· 458 452 459 453 [[package]] 460 454 name = "serde_json" 461 - version = "1.0.133" 455 + version = "1.0.145" 462 456 source = "registry+https://github.com/rust-lang/crates.io-index" 463 - checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" 457 + checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 464 458 dependencies = [ 465 459 "itoa", 466 460 "memchr", 467 461 "ryu", 468 462 "serde", 463 + "serde_core", 469 464 ] 470 465 471 466 [[package]] ··· 485 480 486 481 [[package]] 487 482 name = "smallvec" 488 - version = "1.13.2" 483 + version = "1.15.1" 489 484 source = "registry+https://github.com/rust-lang/crates.io-index" 490 - checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 485 + checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 491 486 492 487 [[package]] 493 488 name = "sqlformat" 494 - version = "0.2.6" 489 + version = "0.3.5" 495 490 source = "registry+https://github.com/rust-lang/crates.io-index" 496 - checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" 491 + checksum = "a0d7b3e8a3b6f2ee93ac391a0f757c13790caa0147892e3545cd549dd5b54bc0" 497 492 dependencies = [ 498 - "nom", 499 493 "unicode_categories", 494 + "winnow", 500 495 ] 501 496 502 497 [[package]] 503 498 name = "syn" 504 - version = "2.0.90" 499 + version = "2.0.106" 505 500 source = "registry+https://github.com/rust-lang/crates.io-index" 506 - checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" 501 + checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 507 502 dependencies = [ 508 503 "proc-macro2", 509 504 "quote", ··· 512 507 513 508 [[package]] 514 509 name = "thiserror" 515 - version = "1.0.69" 516 - source = "registry+https://github.com/rust-lang/crates.io-index" 517 - checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 518 - dependencies = [ 519 - "thiserror-impl 1.0.69", 520 - ] 521 - 522 - [[package]] 523 - name = "thiserror" 524 - version = "2.0.4" 525 - source = "registry+https://github.com/rust-lang/crates.io-index" 526 - checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" 527 - dependencies = [ 528 - "thiserror-impl 2.0.4", 529 - ] 530 - 531 - [[package]] 532 - name = "thiserror-impl" 533 - version = "1.0.69" 510 + version = "2.0.16" 534 511 source = "registry+https://github.com/rust-lang/crates.io-index" 535 - checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 512 + checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" 536 513 dependencies = [ 537 - "proc-macro2", 538 - "quote", 539 - "syn", 514 + "thiserror-impl", 540 515 ] 541 516 542 517 [[package]] 543 518 name = "thiserror-impl" 544 - version = "2.0.4" 519 + version = "2.0.16" 545 520 source = "registry+https://github.com/rust-lang/crates.io-index" 546 - checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" 521 + checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" 547 522 dependencies = [ 548 523 "proc-macro2", 549 524 "quote", ··· 552 527 553 528 [[package]] 554 529 name = "thread_local" 555 - version = "1.1.8" 530 + version = "1.1.9" 556 531 source = "registry+https://github.com/rust-lang/crates.io-index" 557 - checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 532 + checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 558 533 dependencies = [ 559 534 "cfg-if", 560 - "once_cell", 561 535 ] 562 536 563 537 [[package]] ··· 573 547 574 548 [[package]] 575 549 name = "tracing-attributes" 576 - version = "0.1.28" 550 + version = "0.1.30" 577 551 source = "registry+https://github.com/rust-lang/crates.io-index" 578 - checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 552 + checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 579 553 dependencies = [ 580 554 "proc-macro2", 581 555 "quote", ··· 584 558 585 559 [[package]] 586 560 name = "tracing-core" 587 - version = "0.1.33" 561 + version = "0.1.34" 588 562 source = "registry+https://github.com/rust-lang/crates.io-index" 589 - checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 563 + checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 590 564 dependencies = [ 591 565 "once_cell", 592 566 "valuable", ··· 605 579 606 580 [[package]] 607 581 name = "tracing-subscriber" 608 - version = "0.3.19" 582 + version = "0.3.20" 609 583 source = "registry+https://github.com/rust-lang/crates.io-index" 610 - checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 584 + checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" 611 585 dependencies = [ 612 586 "nu-ansi-term", 613 587 "sharded-slab", ··· 619 593 620 594 [[package]] 621 595 name = "unicode-ident" 622 - version = "1.0.14" 596 + version = "1.0.19" 623 597 source = "registry+https://github.com/rust-lang/crates.io-index" 624 - checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 598 + checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 625 599 626 600 [[package]] 627 601 name = "unicode_categories" ··· 631 605 632 606 [[package]] 633 607 name = "valuable" 634 - version = "0.1.0" 608 + version = "0.1.1" 635 609 source = "registry+https://github.com/rust-lang/crates.io-index" 636 - checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 610 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 637 611 638 612 [[package]] 639 613 name = "vcpkg" ··· 649 623 650 624 [[package]] 651 625 name = "wasm-bindgen" 652 - version = "0.2.97" 626 + version = "0.2.103" 653 627 source = "registry+https://github.com/rust-lang/crates.io-index" 654 - checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" 628 + checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" 655 629 dependencies = [ 656 630 "cfg-if", 657 631 "once_cell", 632 + "rustversion", 658 633 "wasm-bindgen-macro", 634 + "wasm-bindgen-shared", 659 635 ] 660 636 661 637 [[package]] 662 638 name = "wasm-bindgen-backend" 663 - version = "0.2.97" 639 + version = "0.2.103" 664 640 source = "registry+https://github.com/rust-lang/crates.io-index" 665 - checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" 641 + checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" 666 642 dependencies = [ 667 643 "bumpalo", 668 644 "log", 669 - "once_cell", 670 645 "proc-macro2", 671 646 "quote", 672 647 "syn", ··· 675 650 676 651 [[package]] 677 652 name = "wasm-bindgen-macro" 678 - version = "0.2.97" 653 + version = "0.2.103" 679 654 source = "registry+https://github.com/rust-lang/crates.io-index" 680 - checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" 655 + checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" 681 656 dependencies = [ 682 657 "quote", 683 658 "wasm-bindgen-macro-support", ··· 685 660 686 661 [[package]] 687 662 name = "wasm-bindgen-macro-support" 688 - version = "0.2.97" 663 + version = "0.2.103" 689 664 source = "registry+https://github.com/rust-lang/crates.io-index" 690 - checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" 665 + checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" 691 666 dependencies = [ 692 667 "proc-macro2", 693 668 "quote", ··· 698 673 699 674 [[package]] 700 675 name = "wasm-bindgen-shared" 701 - version = "0.2.97" 676 + version = "0.2.103" 702 677 source = "registry+https://github.com/rust-lang/crates.io-index" 703 - checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" 678 + checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" 679 + dependencies = [ 680 + "unicode-ident", 681 + ] 704 682 705 683 [[package]] 706 - name = "winapi" 707 - version = "0.3.9" 684 + name = "windows-core" 685 + version = "0.62.0" 708 686 source = "registry+https://github.com/rust-lang/crates.io-index" 709 - checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 687 + checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" 710 688 dependencies = [ 711 - "winapi-i686-pc-windows-gnu", 712 - "winapi-x86_64-pc-windows-gnu", 689 + "windows-implement", 690 + "windows-interface", 691 + "windows-link", 692 + "windows-result", 693 + "windows-strings", 713 694 ] 714 695 715 696 [[package]] 716 - name = "winapi-i686-pc-windows-gnu" 717 - version = "0.4.0" 697 + name = "windows-implement" 698 + version = "0.60.0" 699 + source = "registry+https://github.com/rust-lang/crates.io-index" 700 + checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 701 + dependencies = [ 702 + "proc-macro2", 703 + "quote", 704 + "syn", 705 + ] 706 + 707 + [[package]] 708 + name = "windows-interface" 709 + version = "0.59.1" 710 + source = "registry+https://github.com/rust-lang/crates.io-index" 711 + checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 712 + dependencies = [ 713 + "proc-macro2", 714 + "quote", 715 + "syn", 716 + ] 717 + 718 + [[package]] 719 + name = "windows-link" 720 + version = "0.2.0" 718 721 source = "registry+https://github.com/rust-lang/crates.io-index" 719 - checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 722 + checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" 720 723 721 724 [[package]] 722 - name = "winapi-x86_64-pc-windows-gnu" 725 + name = "windows-result" 723 726 version = "0.4.0" 724 727 source = "registry+https://github.com/rust-lang/crates.io-index" 725 - checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 728 + checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" 729 + dependencies = [ 730 + "windows-link", 731 + ] 732 + 733 + [[package]] 734 + name = "windows-strings" 735 + version = "0.5.0" 736 + source = "registry+https://github.com/rust-lang/crates.io-index" 737 + checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" 738 + dependencies = [ 739 + "windows-link", 740 + ] 726 741 727 742 [[package]] 728 - name = "windows-core" 743 + name = "windows-sys" 729 744 version = "0.52.0" 730 745 source = "registry+https://github.com/rust-lang/crates.io-index" 731 - checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 746 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 732 747 dependencies = [ 733 748 "windows-targets", 734 749 ] ··· 797 812 source = "registry+https://github.com/rust-lang/crates.io-index" 798 813 checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 799 814 815 + [[package]] 816 + name = "winnow" 817 + version = "0.6.26" 818 + source = "registry+https://github.com/rust-lang/crates.io-index" 819 + checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" 820 + dependencies = [ 821 + "memchr", 822 + ] 823 + 800 824 [[package]] 801 825 name = "zerocopy" 802 - version = "0.7.35" 826 + version = "0.8.27" 803 827 source = "registry+https://github.com/rust-lang/crates.io-index" 804 - checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 828 + checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 805 829 dependencies = [ 806 830 "zerocopy-derive", 807 831 ] 808 832 809 833 [[package]] 810 834 name = "zerocopy-derive" 811 - version = "0.7.35" 835 + version = "0.8.27" 812 836 source = "registry+https://github.com/rust-lang/crates.io-index" 813 - checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 837 + checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 814 838 dependencies = [ 815 839 "proc-macro2", 816 840 "quote",
+5
src/change_tracking_disable.sql
··· 1 + drop trigger if exists components_changes_attach_trigger; 2 + 3 + drop trigger if exists components_changes_update_trigger; 4 + 5 + drop trigger if exists components_changes_detach_trigger;
+40
src/change_tracking_enable.sql
··· 1 + -- Runs when a component is attached 2 + create trigger if not exists components_changes_attach_trigger 3 + after insert 4 + on components for each row 5 + begin 6 + insert into changes (entity, component, change) 7 + select new.entity, new.component, 'create' 8 + where not exists ( 9 + select true from components 10 + where entity = new.entity 11 + and component != new.component 12 + ); 13 + 14 + insert into changes (entity, component, change) 15 + select new.entity, new.component, 'attach'; 16 + end; 17 + 18 + -- Runs when a component is changed 19 + create trigger if not exists components_changes_update_trigger 20 + after update 21 + on components for each row 22 + begin 23 + insert into changes (entity, component, change) 24 + values (new.entity, new.component, 'attach'); 25 + end; 26 + 27 + -- Runs when a component is detached 28 + create trigger if not exists components_changes_detach_trigger 29 + after delete 30 + on components for each row 31 + begin 32 + insert into changes (entity, component, change) 33 + values (old.entity, old.component, 'detach'); 34 + 35 + insert into changes (entity, component, change) 36 + select old.entity, old.component, 'destroy' 37 + where not exists ( 38 + select true from components where entity = old.entity 39 + ); 40 + end;
+1 -1
src/entity.rs
··· 1 1 use std::iter; 2 2 3 3 use rusqlite::params; 4 - use tracing::{debug, trace}; 4 + use tracing::debug; 5 5 6 6 use crate::{ 7 7 component::Bundle,
+138 -2
src/lib.rs
··· 1 1 pub mod component; 2 - 3 2 pub use component::{Component, ComponentRead, ComponentWrite}; 4 3 5 4 pub mod entity; ··· 76 75 } 77 76 } 78 77 78 + impl Ecs { 79 + pub fn enable_change_tracking(&mut self) -> Result<(), Error> { 80 + self.conn 81 + .execute_batch(include_str!("change_tracking_enable.sql"))?; 82 + Ok(()) 83 + } 84 + 85 + pub fn disable_change_tracking(&mut self) -> Result<(), Error> { 86 + self.conn 87 + .execute_batch(include_str!("change_tracking_disable.sql"))?; 88 + Ok(()) 89 + } 90 + } 91 + 79 92 impl Ecs { 80 93 pub fn new_entity<'a>(&'a self) -> NewEntity<'a> { 81 94 Entity::without_id(self) ··· 181 194 } 182 195 } 183 196 197 + #[derive(Debug, PartialEq, Eq)] 198 + pub enum Change { 199 + Create { entity: EntityId }, 200 + Attach { entity: EntityId, component: String }, 201 + Detach { entity: EntityId, component: String }, 202 + Destroy { entity: EntityId }, 203 + } 204 + 205 + impl Ecs { 206 + pub fn changes(&self) -> Result<Vec<Change>, Error> { 207 + let mut stmt = self 208 + .conn 209 + .prepare_cached("select * from changes order by sequence asc")?; 210 + 211 + let changes = stmt 212 + .query_map(params![], |row| { 213 + let entity = row.get("entity")?; 214 + let change: String = row.get("change")?; 215 + 216 + match change.as_str() { 217 + "create" => Ok(Change::Create { entity }), 218 + "attach" => { 219 + let component = row.get("component")?; 220 + Ok(Change::Attach { entity, component }) 221 + } 222 + "detach" => { 223 + let component = row.get("component")?; 224 + Ok(Change::Detach { entity, component }) 225 + } 226 + "destroy" => Ok(Change::Destroy { entity }), 227 + other => { 228 + panic!("Invalid 'changes.change' {other:?}"); 229 + } 230 + } 231 + })? 232 + .collect::<Result<_, _>>()?; 233 + 234 + Ok(changes) 235 + } 236 + 237 + pub fn clear_changes(&self) -> Result<(), Error> { 238 + self.conn.execute("delete from changes", params![])?; 239 + Ok(()) 240 + } 241 + } 242 + 184 243 pub mod rusqlite { 185 244 pub use rusqlite::*; 186 245 } ··· 216 275 #[cfg(test)] 217 276 mod tests { 218 277 // #[derive(Component)] derives `impl ecsdb::Component for ...` 219 - use crate::{self as ecsdb, Ecs}; 278 + use crate::{self as ecsdb, Change, Ecs}; 220 279 use crate::{BelongsTo, Component}; 221 280 222 281 use anyhow::anyhow; ··· 572 631 573 632 Ok(()) 574 633 } 634 + 635 + #[test] 636 + fn change_tracking_enable_disable() -> Result<(), anyhow::Error> { 637 + let mut ecs = super::Ecs::open_in_memory()?; 638 + ecs.enable_change_tracking()?; 639 + 640 + assert_eq!(ecs.changes()?, vec![]); 641 + 642 + ecs.new_entity().attach(A); 643 + assert_eq!(ecs.changes()?.len(), 2); 644 + 645 + ecs.disable_change_tracking()?; 646 + ecs.clear_changes()?; 647 + 648 + ecs.new_entity().attach(A); 649 + assert!(ecs.changes()?.is_empty()); 650 + 651 + Ok(()) 652 + } 653 + 654 + #[test] 655 + fn change_tracking() -> Result<(), anyhow::Error> { 656 + let mut ecs = super::Ecs::open_in_memory()?; 657 + ecs.enable_change_tracking()?; 658 + 659 + let mut changes = vec![]; 660 + 661 + assert_eq!(ecs.changes()?, vec![]); 662 + 663 + let entity = ecs.new_entity().attach(A); 664 + 665 + changes.extend([ 666 + Change::Create { 667 + entity: entity.id(), 668 + }, 669 + Change::Attach { 670 + entity: entity.id(), 671 + component: <A as Component>::component_name().to_owned(), 672 + }, 673 + ]); 674 + 675 + assert_eq!(ecs.changes()?, changes); 676 + 677 + entity.attach(B); 678 + changes.push(Change::Attach { 679 + entity: entity.id(), 680 + component: <B as Component>::component_name().to_owned(), 681 + }); 682 + 683 + assert_eq!(ecs.changes()?, changes); 684 + 685 + entity.detach::<B>(); 686 + changes.push(Change::Detach { 687 + entity: entity.id(), 688 + component: <B as Component>::component_name().to_owned(), 689 + }); 690 + 691 + assert_eq!(ecs.changes()?, changes); 692 + 693 + entity.detach::<A>(); 694 + changes.extend([ 695 + Change::Detach { 696 + entity: entity.id(), 697 + component: <A as Component>::component_name().to_owned(), 698 + }, 699 + Change::Destroy { 700 + entity: entity.id(), 701 + }, 702 + ]); 703 + 704 + assert_eq!(ecs.changes()?, changes); 705 + 706 + ecs.clear_changes()?; 707 + assert!(ecs.changes()?.is_empty()); 708 + 709 + Ok(()) 710 + } 575 711 }
+7
src/schema.sql
··· 20 20 21 21 end; 22 22 23 + create table if not exists changes ( 24 + sequence integer primary key autoincrement, 25 + entity integer not null, 26 + component text, 27 + change text not null 28 + ); 29 + 23 30 create table if not exists resources ( 24 31 name text not null unique, 25 32 data blob,
+1 -1
src/system.rs
··· 1 1 use serde::{Deserialize, Serialize}; 2 2 use tracing::{debug, error}; 3 3 4 - use crate::{self as ecsdb, query, Component, Ecs, Entity, EntityId}; 4 + use crate::{self as ecsdb, query, Component, Ecs, Entity}; 5 5 6 6 use core::marker::PhantomData; 7 7 use std::borrow::Cow;

Submissions

sign up or login to add to the discussion
moritz.vongoewels.de submitted #0
1 commit
expand
Ecs: Add (optional) change tracking
closed without merging