From 4beafb67a4ad8344f2496473699c1b165457f870 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 00:19:44 +0000 Subject: [PATCH 1/4] chore(deps): migrate to sqlx 0.9 (and ipnetwork 0.21) sqlx 0.9 reworks several traits that the custom `durable-sqlx` driver implements. ipnetwork is bumped in lockstep because sqlx-postgres pins it. Driver (durable-sqlx) changes: - Database::Arguments, ArgumentBuffer and Statement lose their lifetime parameters; ValueRef keeps its lifetime. Updated the associated types and every `ArgumentBuffer<'q>` reference across the type impls. - Arguments / IntoArguments lose their lifetime parameter; `add` moves the lifetime onto the method. - Statement now owns a `SqlStr` (no lifetime), is `Clone`, and exposes `into_sql`/`sql() -> &SqlStr`. - Connection / ConnectOptions trait methods became RPITIT; implemented with `async fn`. TransactionManager moved to `sqlx_core::transaction` and uses `impl Future`. - Executor: `Execute::sql` now consumes self and returns `SqlStr`, so `take_arguments` is called before `sql()`; `prepare_with`/`describe` take an owned `SqlStr`. `describe` is gated behind sqlx-core's `offline` feature, which we now enable unconditionally to keep the impl consistent across builds. - Dropped the driver's `Type`/`Encode`/`Decode` impls for `&T`, `Cow`, `Box<[T]>` and `JsonRawValue`/`Box` that now conflict with blanket impls added in sqlx 0.9 (behaviour is preserved as the blankets delegate to the remaining base impls). - Public `query*` helpers take `impl SqlSafeStr` to mirror sqlx 0.9. Host-side changes: - durable-runtime: `PgArgumentBuffer` lost its lifetime; dynamic SQL in the sql plugin wrapped with `AssertSqlSafe`. - durable-migrate: dynamic DDL/DML and `raw_sql` calls wrapped with `AssertSqlSafe`. - durable-test: replaced the removed `runtime-tokio-rustls` feature with `runtime-tokio` + `tls-rustls`. Verified with `cargo check --workspace --all-features --locked` and `cargo clippy --workspace --all-targets --all-features` (both clean). The DB-backed nextest and `cargo sqlx prepare --check` jobs run in CI; no `query!` macro invocations changed, so the .sqlx cache is unaffected. https://claude.ai/code/session_01KN3PaeQ1pFq1B3uReMqHjp --- Cargo.lock | 433 +++--------------- crates/durable-cli/Cargo.toml | 2 +- crates/durable-client/Cargo.toml | 2 +- crates/durable-migrate/Cargo.toml | 2 +- crates/durable-migrate/src/apply.rs | 16 +- crates/durable-runtime/Cargo.toml | 6 +- .../src/plugin/durable/sql/mod.rs | 3 +- .../src/plugin/durable/sql/value.rs | 8 +- crates/durable-sqlx-macros/Cargo.toml | 2 +- crates/durable-sqlx/Cargo.toml | 10 +- crates/durable-sqlx/src/driver/arguments.rs | 10 +- crates/durable-sqlx/src/driver/connection.rs | 45 +- crates/durable-sqlx/src/driver/database.rs | 6 +- crates/durable-sqlx/src/driver/statement.rs | 39 +- crates/durable-sqlx/src/driver/transaction.rs | 27 +- .../durable-sqlx/src/driver/types/boolean.rs | 2 +- crates/durable-sqlx/src/driver/types/bytea.rs | 11 +- .../durable-sqlx/src/driver/types/chrono.rs | 12 +- crates/durable-sqlx/src/driver/types/float.rs | 4 +- crates/durable-sqlx/src/driver/types/int.rs | 8 +- .../src/driver/types/ipnetwork.rs | 12 +- crates/durable-sqlx/src/driver/types/json.rs | 50 +- crates/durable-sqlx/src/driver/types/mod.rs | 14 +- .../durable-sqlx/src/driver/types/option.rs | 2 +- crates/durable-sqlx/src/driver/types/text.rs | 12 +- crates/durable-sqlx/src/driver/types/uuid.rs | 8 +- crates/durable-sqlx/src/lib.rs | 37 +- crates/durable-test-workflows/Cargo.toml | 2 +- .../src/bin/sqlx-enum-insert.rs | 2 +- .../src/bin/sqlx-enum.rs | 2 +- crates/durable-test/Cargo.toml | 2 +- crates/durable-worker/Cargo.toml | 2 +- crates/xtask/Cargo.toml | 2 +- 33 files changed, 235 insertions(+), 560 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d2d9c08..e3a13ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -294,12 +294,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - [[package]] name = "bitflags" version = "1.3.2" @@ -503,6 +497,12 @@ dependencies = [ "cc", ] +[[package]] +name = "cmov" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" + [[package]] name = "cobs" version = "0.3.0" @@ -577,12 +577,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - [[package]] name = "const-oid" version = "0.10.2" @@ -880,6 +874,15 @@ dependencies = [ "linktime-proc-macro", ] +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "darling" version = "0.21.3" @@ -924,17 +927,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid 0.9.6", - "pem-rfc7468", - "zeroize", -] - [[package]] name = "derive_setters" version = "0.1.9" @@ -954,9 +946,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", - "const-oid 0.9.6", "crypto-common 0.1.7", - "subtle", ] [[package]] @@ -966,8 +956,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", - "const-oid 0.10.2", + "const-oid", "crypto-common 0.2.2", + "ctutils", ] [[package]] @@ -1136,7 +1127,7 @@ dependencies = [ "getrandom 0.4.2", "http", "humantime", - "ipnetwork 0.21.1", + "ipnetwork", "log", "metrics", "parking_lot", @@ -1170,7 +1161,7 @@ dependencies = [ "durable-sqlx-macros", "futures-core", "futures-util", - "ipnetwork 0.21.1", + "ipnetwork", "log", "serde", "serde_json", @@ -1284,13 +1275,12 @@ dependencies = [ [[package]] name = "etcetera" -version = "0.8.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +checksum = "de48cc4d1c1d97a20fd819def54b890cadde72ed3ad0c614822a0a433361be96" dependencies = [ "cfg-if", - "home", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -1340,9 +1330,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" dependencies = [ "futures-core", "futures-sink", @@ -1621,8 +1611,6 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "allocator-api2", - "equivalent", "foldhash 0.1.5", ] @@ -1631,6 +1619,11 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] [[package]] name = "hashbrown" @@ -1645,11 +1638,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", ] [[package]] @@ -1679,29 +1672,20 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hkdf" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +checksum = "4aaa26c720c68b866f2c96ef5c1264b3e6f473fe5d4ce61cd44bbe913e553018" dependencies = [ "hmac", ] [[package]] name = "hmac" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", + "digest 0.11.3", ] [[package]] @@ -2006,15 +1990,6 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "ipnetwork" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" -dependencies = [ - "serde", -] - [[package]] name = "ipnetwork" version = "0.21.1" @@ -2140,9 +2115,6 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] [[package]] name = "leb128fmt" @@ -2168,10 +2140,7 @@ version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ - "bitflags 2.13.0", "libc", - "plain", - "redox_syscall 0.8.1", ] [[package]] @@ -2255,12 +2224,12 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "md-5" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest 0.10.7", + "digest 0.11.3", ] [[package]] @@ -2362,42 +2331,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.6", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -2405,7 +2338,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", ] [[package]] @@ -2482,20 +2414,11 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall", "smallvec", "windows-link", ] -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - [[package]] name = "percent-encoding" version = "2.3.2" @@ -2538,39 +2461,12 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - [[package]] name = "pkg-config" version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - [[package]] name = "portable-atomic" version = "1.13.1" @@ -2780,24 +2676,13 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" -[[package]] -name = "rand" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - [[package]] name = "rand" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ - "rand_chacha 0.9.0", + "rand_chacha", "rand_core 0.9.5", ] @@ -2812,16 +2697,6 @@ dependencies = [ "rand_core 0.10.1", ] -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - [[package]] name = "rand_chacha" version = "0.9.0" @@ -2832,15 +2707,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - [[package]] name = "rand_core" version = "0.9.5" @@ -2894,15 +2760,6 @@ dependencies = [ "bitflags 2.13.0", ] -[[package]] -name = "redox_syscall" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b44b894f2a6e36457d665d1e08c3866add6ed5e70050c1b4ba8a8ddedb02ce7" -dependencies = [ - "bitflags 2.13.0", -] - [[package]] name = "redox_users" version = "0.4.6" @@ -2997,26 +2854,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rsa" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" -dependencies = [ - "const-oid 0.9.6", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "signature", - "spki", - "subtle", - "zeroize", -] - [[package]] name = "rustc-demangle" version = "0.1.27" @@ -3262,13 +3099,13 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -3318,16 +3155,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "simd-adler32" version = "0.3.9" @@ -3384,21 +3211,11 @@ dependencies = [ "lock_api", ] -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - [[package]] name = "sqlx" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +checksum = "378620ccc25c62c89d8be1c819e76a88d59bdcc3304733330788948e619bfd71" dependencies = [ "sqlx-core", "sqlx-macros", @@ -3409,12 +3226,13 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +checksum = "05b44e85bf579a8eeb4ceaa77a3a523baf2bf0e9bac7e40f405d537b5d2d5ccb" dependencies = [ "base64 0.22.1", "bytes", + "cfg-if", "chrono", "crc", "crossbeam-queue", @@ -3424,13 +3242,12 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "hashlink", "indexmap", - "ipnetwork 0.20.0", + "ipnetwork", "log", "memchr", - "once_cell", "percent-encoding", "rustls", "serde", @@ -3443,14 +3260,14 @@ dependencies = [ "tracing", "url", "uuid", - "webpki-roots 0.26.11", + "webpki-roots", ] [[package]] name = "sqlx-macros" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +checksum = "bd2b84f2bc39a5705ef27ec785a11c934a41bbd4a24941e257927cddc26b60bf" dependencies = [ "proc-macro2", "quote", @@ -3461,15 +3278,15 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +checksum = "fb8d96de5fdc85a5c4ec813432b523ec637e80ba98f046555f75f7908ddac7c3" dependencies = [ + "cfg-if", "dotenvy", "either", "heck", "hex", - "once_cell", "proc-macro2", "quote", "serde", @@ -3480,59 +3297,44 @@ dependencies = [ "sqlx-postgres", "sqlx-sqlite", "syn", + "thiserror 2.0.18", "tokio", "url", ] [[package]] name = "sqlx-mysql" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +checksum = "90b8020fe17c5f2c245bfa2505d7ef59c5604839527c740266ad2214acebea27" dependencies = [ - "atoi", - "base64 0.22.1", "bitflags 2.13.0", "byteorder", "bytes", "chrono", "crc", - "digest 0.10.7", + "digest 0.11.3", "dotenvy", "either", - "futures-channel", "futures-core", - "futures-io", "futures-util", "generic-array", - "hex", - "hkdf", - "hmac", - "itoa", "log", - "md-5", - "memchr", - "once_cell", "percent-encoding", - "rand 0.8.6", - "rsa", "serde", "sha1", - "sha2 0.10.9", - "smallvec", + "sha2 0.11.0", "sqlx-core", - "stringprep", "thiserror 2.0.18", "tracing", "uuid", - "whoami", ] [[package]] name = "sqlx-postgres" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +checksum = "87a2bdd6e83f6b3ea525ca9fee568030508b58355a43d0b2c1674d5f79dcd65e" dependencies = [ "atoi", "base64 0.22.1", @@ -3548,17 +3350,15 @@ dependencies = [ "hex", "hkdf", "hmac", - "home", - "ipnetwork 0.20.0", + "ipnetwork", "itoa", "log", "md-5", "memchr", - "once_cell", - "rand 0.8.6", + "rand 0.10.1", "serde", "serde_json", - "sha2 0.10.9", + "sha2 0.11.0", "smallvec", "sqlx-core", "stringprep", @@ -3570,13 +3370,14 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +checksum = "488e99c397a62007e4229aec669a179816339afc6d2620ca6fa420dbee2e982c" dependencies = [ "atoi", "chrono", "flume", + "form_urlencoded", "futures-channel", "futures-core", "futures-executor", @@ -3586,7 +3387,6 @@ dependencies = [ "log", "percent-encoding", "serde", - "serde_urlencoded", "sqlx-core", "thiserror 2.0.18", "tracing", @@ -4250,12 +4050,6 @@ dependencies = [ "wit-bindgen 0.51.0", ] -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - [[package]] name = "wasm-bindgen" version = "0.2.123" @@ -4745,15 +4539,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "webpki-roots" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.7", -] - [[package]] name = "webpki-roots" version = "1.0.7" @@ -4765,13 +4550,9 @@ dependencies = [ [[package]] name = "whoami" -version = "1.6.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" -dependencies = [ - "libredox", - "wasite", -] +checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" [[package]] name = "winapi" @@ -4893,15 +4674,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -4929,21 +4701,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -4977,12 +4734,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -4995,12 +4746,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -5013,12 +4758,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5043,12 +4782,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -5061,12 +4794,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -5079,12 +4806,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -5097,12 +4818,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" diff --git a/crates/durable-cli/Cargo.toml b/crates/durable-cli/Cargo.toml index ea68955..1817a8e 100644 --- a/crates/durable-cli/Cargo.toml +++ b/crates/durable-cli/Cargo.toml @@ -26,5 +26,5 @@ tokio = { version = "1.50.0", features = ["full"] } tracing-subscriber = { version = "0.3.23", features = ["fmt", "env-filter"] } [dependencies.sqlx] -version = "0.8.6" +version = "0.9" features = ["postgres", "runtime-tokio", "tls-rustls"] diff --git a/crates/durable-client/Cargo.toml b/crates/durable-client/Cargo.toml index 40ae104..00d217e 100644 --- a/crates/durable-client/Cargo.toml +++ b/crates/durable-client/Cargo.toml @@ -23,6 +23,6 @@ futures-util = "0.3.32" serde = "1.0.228" serde_json = "1.0.149" sha2 = "0.11.0" -sqlx = { version = "0.8", features = ["chrono", "macros", "postgres", "runtime-tokio"] } +sqlx = { version = "0.9", features = ["chrono", "macros", "postgres", "runtime-tokio"] } wasmparser = { version = "0.251.0", features = ["validate"] } weak-table = "0.3.2" diff --git a/crates/durable-migrate/Cargo.toml b/crates/durable-migrate/Cargo.toml index 6220294..4fade90 100644 --- a/crates/durable-migrate/Cargo.toml +++ b/crates/durable-migrate/Cargo.toml @@ -16,7 +16,7 @@ thiserror = "2.0" tracing = { version = "0.1.44", optional = true } [dependencies.sqlx] -version = "0.8.6" +version = "0.9" optional = true default-features = false features = ["postgres"] diff --git a/crates/durable-migrate/src/apply.rs b/crates/durable-migrate/src/apply.rs index ac44403..b8ace6b 100644 --- a/crates/durable-migrate/src/apply.rs +++ b/crates/durable-migrate/src/apply.rs @@ -35,7 +35,9 @@ impl<'a> Operation<'a> { impl Migrator { async fn setup(&self, conn: &mut sqlx::PgConnection, options: &Options) -> Result<(), Error> { if let Some(schema) = options.migration_table.schema.as_deref() { - sqlx::query(&format!("CREATE SCHEMA IF NOT EXISTS {schema:?}")) + sqlx::query(sqlx::AssertSqlSafe(format!( + "CREATE SCHEMA IF NOT EXISTS {schema:?}" + ))) .execute(&mut *conn) .await?; } @@ -51,7 +53,7 @@ impl Migrator { ", table = options.migration_table.as_sql() ); - sqlx::query(&query).execute(&mut *conn).await?; + sqlx::query(sqlx::AssertSqlSafe(query)).execute(&mut *conn).await?; Ok(()) } @@ -66,7 +68,7 @@ impl Migrator { table = options.migration_table.as_sql() ); - let migrations = sqlx::query(&query) + let migrations = sqlx::query(sqlx::AssertSqlSafe(query)) .try_map(|record: PgRow| { Ok(DatabaseMigration { version: record.get::("version"), @@ -258,13 +260,13 @@ impl Migrator { } => { tracing::debug!("running migration {version} - {name}"); - sqlx::raw_sql(sql).execute(&mut *tx).await?; + sqlx::raw_sql(sqlx::AssertSqlSafe(sql)).execute(&mut *tx).await?; let query = format!( "INSERT INTO {table}(version, name, revert) VALUES ($1, $2, $3) ", table = options.migration_table.as_sql() ); - sqlx::query(&query) + sqlx::query(sqlx::AssertSqlSafe(query)) .bind(version) .bind(name) .bind(revert) @@ -282,12 +284,12 @@ impl Migrator { "DELETE FROM {table} WHERE version = $1 RETURNING version", table = options.migration_table.as_sql() ); - sqlx::query(&query) + sqlx::query(sqlx::AssertSqlSafe(query)) .bind(version) .fetch_one(&mut *tx) .await?; - sqlx::raw_sql(revert).execute(&mut *tx).await?; + sqlx::raw_sql(sqlx::AssertSqlSafe(revert)).execute(&mut *tx).await?; } } diff --git a/crates/durable-runtime/Cargo.toml b/crates/durable-runtime/Cargo.toml index 0520831..c5d8d07 100644 --- a/crates/durable-runtime/Cargo.toml +++ b/crates/durable-runtime/Cargo.toml @@ -29,7 +29,7 @@ chrono = { version = "0.4.44", features = ["serde"] } clap = { version = "4.6", optional = true, features = ["derive", "env"] } console-subscriber = { version = "0.5.0", optional = true } derive_setters = "0.1.9" -ipnetwork = "0.20.0" +ipnetwork = "0.21.0" futures-concurrency = "7.7.1" futures-util = "0.3.32" getrandom = { version = "0.4.2", features = ["std"] } @@ -53,7 +53,7 @@ url = "2.5.8" metrics = "0.24.3" [dependencies.sqlx] -version = "0.8.6" +version = "0.9" features = [ "postgres", "runtime-tokio", @@ -64,7 +64,7 @@ features = [ ] [dependencies.sqlx-postgres] -version = "0.8.6" +version = "0.9" features = ["offline"] [dependencies.tracing-subscriber] diff --git a/crates/durable-runtime/src/plugin/durable/sql/mod.rs b/crates/durable-runtime/src/plugin/durable/sql/mod.rs index ef4f0f1..33804c8 100644 --- a/crates/durable-runtime/src/plugin/durable/sql/mod.rs +++ b/crates/durable-runtime/src/plugin/durable/sql/mod.rs @@ -978,7 +978,8 @@ impl Host for Task { txn.start_query(move |conn| { Box::pin(try_stream! { - let mut query = sqlx::query(&sql).persistent(options.persistent); + let mut query = + sqlx::query(sqlx::AssertSqlSafe(sql)).persistent(options.persistent); for param in params { query = query.bind(param); } diff --git a/crates/durable-runtime/src/plugin/durable/sql/value.rs b/crates/durable-runtime/src/plugin/durable/sql/value.rs index f8d1556..7e8f073 100644 --- a/crates/durable-runtime/src/plugin/durable/sql/value.rs +++ b/crates/durable-runtime/src/plugin/durable/sql/value.rs @@ -123,11 +123,11 @@ impl sqlx::Type for ValueResource { impl<'a> sqlx::Encode<'a, sqlx::Postgres> for ValueResource { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'a>, + buf: &mut ::ArgumentBuffer, ) -> Result { fn encode_by_ref<'a, T>( val: &T, - buf: &mut ::ArgumentBuffer<'a>, + buf: &mut ::ArgumentBuffer, ) -> Result where T: sqlx::Encode<'a, sqlx::Postgres>, @@ -145,11 +145,11 @@ impl<'a> sqlx::Encode<'a, sqlx::Postgres> for ValueResource { fn encode( self, - buf: &mut ::ArgumentBuffer<'a>, + buf: &mut ::ArgumentBuffer, ) -> Result { fn encode<'a, T>( val: T, - buf: &mut ::ArgumentBuffer<'a>, + buf: &mut ::ArgumentBuffer, ) -> Result where T: sqlx::Encode<'a, sqlx::Postgres>, diff --git a/crates/durable-sqlx-macros/Cargo.toml b/crates/durable-sqlx-macros/Cargo.toml index c92c82a..2b7d30a 100644 --- a/crates/durable-sqlx-macros/Cargo.toml +++ b/crates/durable-sqlx-macros/Cargo.toml @@ -26,5 +26,5 @@ version = "2.0.117" features = ["full", "parsing", "proc-macro", "visit-mut"] [dependencies.sqlx-macros-core] -version = "0.8.6" +version = "0.9" features = ["macros", "postgres", "_rt-tokio"] diff --git a/crates/durable-sqlx/Cargo.toml b/crates/durable-sqlx/Cargo.toml index 67ca2cc..3acb84b 100644 --- a/crates/durable-sqlx/Cargo.toml +++ b/crates/durable-sqlx/Cargo.toml @@ -24,12 +24,16 @@ async-stream = "0.3.6" chrono = { version = "0.4.44", optional = true } futures-core = "0.3.32" futures-util = "0.3.32" -ipnetwork = { version = "0.20.0", features = ["serde"], optional = true } +ipnetwork = { version = "0.21.0", features = ["serde"], optional = true } log = "0.4.29" serde = "1.0.228" serde_json = { version = "1.0", features = ["raw_value"] } -sqlx = { version = "0.8.6", default-features = false } -sqlx-core = { version = "0.8.6", default-features = false } +sqlx = { version = "0.9", default-features = false } +# The `offline` feature gates the `Executor::describe` method in sqlx-core. It is +# enabled unconditionally elsewhere in the workspace (via sqlx-postgres), so we +# enable it here too to keep our `Executor` impl consistent regardless of which +# crates are compiled together. +sqlx-core = { version = "0.9", default-features = false, features = ["offline"] } url = "2.5.8" wit-bindgen-rt = { workspace = true } thiserror = "2.0.18" diff --git a/crates/durable-sqlx/src/driver/arguments.rs b/crates/durable-sqlx/src/driver/arguments.rs index 41f210d..580e400 100644 --- a/crates/durable-sqlx/src/driver/arguments.rs +++ b/crates/durable-sqlx/src/driver/arguments.rs @@ -11,16 +11,16 @@ impl Arguments { } } -impl<'q> sqlx::Arguments<'q> for Arguments { +impl sqlx::Arguments for Arguments { type Database = Durable; fn reserve(&mut self, additional: usize, _: usize) { self.0.reserve(additional); } - fn add(&mut self, value: T) -> Result<(), sqlx::error::BoxDynError> + fn add<'t, T>(&mut self, value: T) -> Result<(), sqlx::error::BoxDynError> where - T: 'q + sqlx::Encode<'q, Self::Database> + sqlx::Type, + T: sqlx::Encode<'t, Self::Database> + sqlx::Type, { let ty = value.produces().unwrap_or_else(T::type_info); if value.encode(&mut self.0)?.is_null() { @@ -35,8 +35,8 @@ impl<'q> sqlx::Arguments<'q> for Arguments { } } -impl<'q> sqlx::IntoArguments<'q, Durable> for Arguments { - fn into_arguments(self) -> ::Arguments<'q> { +impl sqlx::IntoArguments for Arguments { + fn into_arguments(self) -> ::Arguments { self } } diff --git a/crates/durable-sqlx/src/driver/connection.rs b/crates/durable-sqlx/src/driver/connection.rs index b47cfba..67c2693 100644 --- a/crates/durable-sqlx/src/driver/connection.rs +++ b/crates/durable-sqlx/src/driver/connection.rs @@ -4,6 +4,7 @@ use std::time::Duration; use futures_core::future::BoxFuture; use futures_core::stream::BoxStream; use log::LevelFilter; +use sqlx::SqlStr; use url::Url; use crate::bindings as sql; @@ -20,7 +21,7 @@ impl sqlx::ConnectOptions for ConnectOptions { Self::from_str(url.as_str()) } - fn connect(&self) -> BoxFuture<'_, Result> { + async fn connect(&self) -> Result { match *self {} } @@ -89,28 +90,28 @@ impl sqlx::Connection for Connection { type Database = Durable; type Options = ConnectOptions; - fn close(self) -> BoxFuture<'static, Result<(), sqlx::Error>> { - Box::pin(std::future::ready(Ok(()))) + async fn close(self) -> Result<(), sqlx::Error> { + Ok(()) } - fn close_hard(self) -> BoxFuture<'static, Result<(), sqlx::Error>> { - self.close() + async fn close_hard(self) -> Result<(), sqlx::Error> { + Ok(()) } - fn ping(&mut self) -> BoxFuture<'_, Result<(), sqlx::Error>> { - Box::pin(std::future::ready(Ok(()))) + async fn ping(&mut self) -> Result<(), sqlx::Error> { + Ok(()) } - fn begin( + async fn begin( &mut self, - ) -> BoxFuture<'_, Result, sqlx::Error>> { - sqlx::Transaction::begin(self, None) + ) -> Result, sqlx::Error> { + sqlx::Transaction::begin(self, None).await } fn shrink_buffers(&mut self) {} - fn flush(&mut self) -> BoxFuture<'_, Result<(), sqlx::Error>> { - Box::pin(std::future::ready(Ok(()))) + async fn flush(&mut self) -> Result<(), sqlx::Error> { + Ok(()) } fn should_flush(&self) -> bool { @@ -127,7 +128,7 @@ impl<'c> sqlx::Acquire<'c> for &'c mut Connection { } fn begin(self) -> BoxFuture<'c, Result, sqlx::Error>> { - ::begin(self) + Box::pin(::begin(self)) } } @@ -147,8 +148,8 @@ impl<'c> sqlx::Executor<'c> for &'c mut Connection { { use async_stream::try_stream; - let sql = query.sql(); let params = query.take_arguments().map_err(sqlx::Error::Encode); + let sql = query.sql(); let options = sql::Options { limit: u8::MAX, persistent: true, @@ -156,7 +157,7 @@ impl<'c> sqlx::Executor<'c> for &'c mut Connection { Box::pin(try_stream! { let params = params?.unwrap_or_default(); - let iter = self.run(sql, params, options); + let iter = self.run(sql.as_str(), params, options); for item in iter { yield item?; @@ -172,8 +173,8 @@ impl<'c> sqlx::Executor<'c> for &'c mut Connection { 'c: 'e, E: 'q + sqlx::Execute<'q, Self::Database>, { - let sql = query.sql(); let params = query.take_arguments().map_err(sqlx::Error::Encode); + let sql = query.sql(); let options = sql::Options { limit: 1, persistent: true, @@ -181,7 +182,7 @@ impl<'c> sqlx::Executor<'c> for &'c mut Connection { Box::pin(async move { let params = params?.unwrap_or_default(); - let iter = self.run(sql, params, options); + let iter = self.run(sql.as_str(), params, options); for item in iter { if let sqlx::Either::Right(row) = item? { @@ -193,20 +194,20 @@ impl<'c> sqlx::Executor<'c> for &'c mut Connection { }) } - fn prepare_with<'e, 'q: 'e>( + fn prepare_with<'e>( self, - sql: &'q str, + sql: SqlStr, _: &'e [TypeInfo], - ) -> BoxFuture<'e, Result, sqlx::Error>> + ) -> BoxFuture<'e, Result> where 'c: 'e, { Box::pin(std::future::ready(Ok(Statement::new(sql)))) } - fn describe<'e, 'q: 'e>( + fn describe<'e>( self, - _: &'q str, + _: SqlStr, ) -> BoxFuture<'e, Result, sqlx::Error>> where 'c: 'e, diff --git a/crates/durable-sqlx/src/driver/database.rs b/crates/durable-sqlx/src/driver/database.rs index 94cfae7..cdd401c 100644 --- a/crates/durable-sqlx/src/driver/database.rs +++ b/crates/durable-sqlx/src/driver/database.rs @@ -16,9 +16,9 @@ impl sqlx::Database for Durable { type TypeInfo = TypeInfo; type Value = Value; type ValueRef<'r> = &'r Value; - type Arguments<'q> = Arguments; - type ArgumentBuffer<'q> = Vec; - type Statement<'q> = Statement<'q>; + type Arguments = Arguments; + type ArgumentBuffer = Vec; + type Statement = Statement; const NAME: &'static str = "durable"; const URL_SCHEMES: &'static [&'static str] = &[]; diff --git a/crates/durable-sqlx/src/driver/statement.rs b/crates/durable-sqlx/src/driver/statement.rs index f30c446..b97952d 100644 --- a/crates/durable-sqlx/src/driver/statement.rs +++ b/crates/durable-sqlx/src/driver/statement.rs @@ -1,23 +1,24 @@ -use std::borrow::Cow; +use sqlx::SqlStr; use crate::driver::Durable; -pub struct Statement<'q>(Cow<'q, str>); +#[derive(Clone)] +pub struct Statement(SqlStr); -impl<'q> Statement<'q> { - pub(crate) fn new(sql: &'q str) -> Self { - Self(Cow::Borrowed(sql)) +impl Statement { + pub(crate) fn new(sql: SqlStr) -> Self { + Self(sql) } } -impl<'q> sqlx::Statement<'q> for Statement<'q> { +impl sqlx::Statement for Statement { type Database = Durable; - fn to_owned(&self) -> Statement<'static> { - Statement(Cow::Owned(self.0.clone().into_owned())) + fn into_sql(self) -> SqlStr { + self.0 } - fn sql(&self) -> &str { + fn sql(&self) -> &SqlStr { &self.0 } @@ -33,26 +34,20 @@ impl<'q> sqlx::Statement<'q> for Statement<'q> { fn query( &self, - ) -> sqlx::query::Query<'_, Self::Database, ::Arguments<'_>> - { + ) -> sqlx::query::Query<'_, Self::Database, ::Arguments> { sqlx_core::query::query_statement(self) } - fn query_with<'s, A>(&'s self, arguments: A) -> sqlx::query::Query<'s, Self::Database, A> + fn query_with(&self, arguments: A) -> sqlx::query::Query<'_, Self::Database, A> where - A: sqlx::IntoArguments<'s, Self::Database>, + A: sqlx::IntoArguments, { sqlx_core::query::query_statement_with(self, arguments) } fn query_as( &self, - ) -> sqlx::query::QueryAs< - '_, - Self::Database, - O, - ::Arguments<'_>, - > + ) -> sqlx::query::QueryAs<'_, Self::Database, O, ::Arguments> where O: for<'r> sqlx::FromRow<'r, ::Row>, { @@ -65,7 +60,7 @@ impl<'q> sqlx::Statement<'q> for Statement<'q> { ) -> sqlx::query::QueryAs<'s, Self::Database, O, A> where O: for<'r> sqlx::FromRow<'r, ::Row>, - A: sqlx::IntoArguments<'s, Self::Database>, + A: sqlx::IntoArguments, { sqlx_core::query_as::query_statement_as_with(self, arguments) } @@ -76,7 +71,7 @@ impl<'q> sqlx::Statement<'q> for Statement<'q> { '_, Self::Database, O, - ::Arguments<'_>, + ::Arguments, > where (O,): for<'r> sqlx::FromRow<'r, ::Row>, @@ -90,7 +85,7 @@ impl<'q> sqlx::Statement<'q> for Statement<'q> { ) -> sqlx::query::QueryScalar<'s, Self::Database, O, A> where (O,): for<'r> sqlx::FromRow<'r, ::Row>, - A: sqlx::IntoArguments<'s, Self::Database>, + A: sqlx::IntoArguments, { sqlx_core::query_scalar::query_statement_scalar_with(self, arguments) } diff --git a/crates/durable-sqlx/src/driver/transaction.rs b/crates/durable-sqlx/src/driver/transaction.rs index 9a69cd6..37a6d02 100644 --- a/crates/durable-sqlx/src/driver/transaction.rs +++ b/crates/durable-sqlx/src/driver/transaction.rs @@ -1,6 +1,4 @@ -use std::borrow::Cow; - -use futures_core::future::BoxFuture; +use sqlx::{AssertSqlSafe, SqlStr}; use crate::driver::{Connection, Durable}; @@ -9,7 +7,7 @@ pub enum TransactionManager {} impl TransactionManager { async fn begin(conn: &mut Connection) -> Result<(), sqlx::Error> { let sql = format!("SAVEPOINT savepoint_{}", conn.txn_depth); - sqlx::query(&sql).execute(&mut *conn).await?; + sqlx::query(AssertSqlSafe(sql)).execute(&mut *conn).await?; conn.txn_depth += 1; Ok(()) @@ -23,7 +21,7 @@ impl TransactionManager { } let sql = format!("RELEASE savepoint_{}", conn.txn_depth - 1); - sqlx::query(&sql).execute(&mut *conn).await?; + sqlx::query(AssertSqlSafe(sql)).execute(&mut *conn).await?; conn.txn_depth -= 1; Ok(()) @@ -38,29 +36,26 @@ impl TransactionManager { } let sql = format!("ROLLBACK TO savepoint_{}", conn.txn_depth - 1); - sqlx::query(&sql).execute(&mut *conn).await?; + sqlx::query(AssertSqlSafe(sql)).execute(&mut *conn).await?; conn.txn_depth -= 1; Ok(()) } } -impl sqlx::TransactionManager for TransactionManager { +impl sqlx_core::transaction::TransactionManager for TransactionManager { type Database = Durable; - fn begin<'conn>( - conn: &'conn mut Connection, - _statement: Option>, - ) -> BoxFuture<'conn, Result<(), sqlx::Error>> { - Box::pin(Self::begin(conn)) + async fn begin(conn: &mut Connection, _statement: Option) -> Result<(), sqlx::Error> { + Self::begin(conn).await } - fn commit(conn: &mut Connection) -> BoxFuture<'_, Result<(), sqlx::Error>> { - Box::pin(Self::commit(conn)) + async fn commit(conn: &mut Connection) -> Result<(), sqlx::Error> { + Self::commit(conn).await } - fn rollback(conn: &mut Connection) -> BoxFuture<'_, Result<(), sqlx::Error>> { - Box::pin(Self::rollback(conn)) + async fn rollback(conn: &mut Connection) -> Result<(), sqlx::Error> { + Self::rollback(conn).await } fn start_rollback(conn: &mut Connection) { diff --git a/crates/durable-sqlx/src/driver/types/boolean.rs b/crates/durable-sqlx/src/driver/types/boolean.rs index 2b30780..ead9308 100644 --- a/crates/durable-sqlx/src/driver/types/boolean.rs +++ b/crates/durable-sqlx/src/driver/types/boolean.rs @@ -18,7 +18,7 @@ impl sqlx::Decode<'_, Durable> for bool { impl sqlx::Encode<'_, Durable> for bool { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::boolean(*self))); Ok(IsNull::No) diff --git a/crates/durable-sqlx/src/driver/types/bytea.rs b/crates/durable-sqlx/src/driver/types/bytea.rs index 492177b..df07afc 100644 --- a/crates/durable-sqlx/src/driver/types/bytea.rs +++ b/crates/durable-sqlx/src/driver/types/bytea.rs @@ -10,7 +10,7 @@ use crate::{bindings as sql, Durable}; impl sqlx::Encode<'_, Durable> for [u8] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::bytea(self))); Ok(IsNull::No) @@ -25,7 +25,7 @@ forward_encode_deref!(Cow<'_, [u8]> => [u8]); impl sqlx::Encode<'_, Durable> for [u8; N] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { encode_by_ref::<[u8]>(self, buf) } @@ -38,8 +38,7 @@ impl sqlx::Type for Vec { } forward_type!([u8] => Vec); -forward_type!(Box<[u8]> => Vec); -forward_type!(Cow<'_, [u8]> => Vec); +// `Type` for `Box<[u8]>` and `Cow<'_, [u8]>` is covered by blanket impls in sqlx 0.9. impl sqlx::Type for [u8; N] { fn type_info() -> ::TypeInfo { @@ -50,7 +49,7 @@ impl sqlx::Type for [u8; N] { impl sqlx::Encode<'_, Durable> for [&[u8]] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::bytea_array(self))); Ok(IsNull::No) @@ -60,7 +59,7 @@ impl sqlx::Encode<'_, Durable> for [&[u8]] { impl sqlx::Encode<'_, Durable> for [Vec] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let vec: Vec<_> = self.iter().map(|x| &x[..]).collect(); encode_by_ref::<[&[u8]]>(&vec, buf) diff --git a/crates/durable-sqlx/src/driver/types/chrono.rs b/crates/durable-sqlx/src/driver/types/chrono.rs index 320970c..dc6da0a 100644 --- a/crates/durable-sqlx/src/driver/types/chrono.rs +++ b/crates/durable-sqlx/src/driver/types/chrono.rs @@ -9,7 +9,7 @@ use crate::driver::{Durable, TypeInfo, Value}; impl sqlx::Encode<'_, Durable> for DateTime { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::timestamptz(self.into()))); Ok(IsNull::No) @@ -48,7 +48,7 @@ impl sqlx::Type for DateTime { impl sqlx::Encode<'_, Durable> for NaiveDateTime { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::timestamp((*self).into()))); Ok(IsNull::No) @@ -74,7 +74,7 @@ impl sqlx::Type for NaiveDateTime { impl sqlx::Encode<'_, Durable> for &'_ [DateTime] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let values: Vec<_> = self.iter().map(|ts| ts.into()).collect(); buf.push(Value::new(sql::Value::timestamptz_array(&values))); @@ -85,7 +85,7 @@ impl sqlx::Encode<'_, Durable> for &'_ [DateTime] { impl sqlx::Encode<'_, Durable> for Vec> { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { <&[DateTime] as sqlx::Encode>::encode(self, buf) } @@ -157,7 +157,7 @@ impl sqlx::Type for Vec> { impl sqlx::Encode<'_, Durable> for &'_ [NaiveDateTime] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let values: Vec<_> = self.iter().copied().map(|ts| ts.into()).collect(); buf.push(Value::new(sql::Value::timestamp_array(&values))); @@ -168,7 +168,7 @@ impl sqlx::Encode<'_, Durable> for &'_ [NaiveDateTime] { impl sqlx::Encode<'_, Durable> for Vec { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { <&[NaiveDateTime] as sqlx::Encode>::encode(self, buf) } diff --git a/crates/durable-sqlx/src/driver/types/float.rs b/crates/durable-sqlx/src/driver/types/float.rs index 90f5ce2..6a62e45 100644 --- a/crates/durable-sqlx/src/driver/types/float.rs +++ b/crates/durable-sqlx/src/driver/types/float.rs @@ -8,7 +8,7 @@ use crate::{bindings as sql, Durable}; impl sqlx::Encode<'_, Durable> for f32 { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::float4(*self))); Ok(IsNull::No) @@ -32,7 +32,7 @@ impl sqlx::Decode<'_, Durable> for f32 { impl sqlx::Encode<'_, Durable> for f64 { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::float8(*self))); Ok(IsNull::No) diff --git a/crates/durable-sqlx/src/driver/types/int.rs b/crates/durable-sqlx/src/driver/types/int.rs index fa002ba..9e9b39f 100644 --- a/crates/durable-sqlx/src/driver/types/int.rs +++ b/crates/durable-sqlx/src/driver/types/int.rs @@ -9,7 +9,7 @@ use crate::driver::{Durable, TypeInfo, Value}; impl Encode<'_, Durable> for i8 { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::int1(*self))); Ok(IsNull::No) @@ -19,7 +19,7 @@ impl Encode<'_, Durable> for i8 { impl Encode<'_, Durable> for i16 { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::int2(*self))); Ok(IsNull::No) @@ -29,7 +29,7 @@ impl Encode<'_, Durable> for i16 { impl Encode<'_, Durable> for i32 { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::int4(*self))); Ok(IsNull::No) @@ -39,7 +39,7 @@ impl Encode<'_, Durable> for i32 { impl Encode<'_, Durable> for i64 { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::int8(*self))); Ok(IsNull::No) diff --git a/crates/durable-sqlx/src/driver/types/ipnetwork.rs b/crates/durable-sqlx/src/driver/types/ipnetwork.rs index 83a49e8..c7e66c6 100644 --- a/crates/durable-sqlx/src/driver/types/ipnetwork.rs +++ b/crates/durable-sqlx/src/driver/types/ipnetwork.rs @@ -11,7 +11,7 @@ use crate::driver::{Durable, TypeInfo, Value}; impl sqlx::Encode<'_, Durable> for IpNetwork { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value(sql::Value::inet((*self).into())?)); Ok(IsNull::No) @@ -21,7 +21,7 @@ impl sqlx::Encode<'_, Durable> for IpNetwork { impl sqlx::Encode<'_, Durable> for Ipv4Network { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { >::encode(IpNetwork::V4(*self), buf) } @@ -30,7 +30,7 @@ impl sqlx::Encode<'_, Durable> for Ipv4Network { impl sqlx::Encode<'_, Durable> for Ipv6Network { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { >::encode(IpNetwork::V6(*self), buf) } @@ -67,7 +67,7 @@ impl sqlx::Type for Ipv6Network { impl sqlx::Encode<'_, Durable> for IpAddr { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let inet = match *self { Self::V4(v4) => IpNetwork::V4(Ipv4Network::new(v4, 32)?), @@ -81,7 +81,7 @@ impl sqlx::Encode<'_, Durable> for IpAddr { impl sqlx::Encode<'_, Durable> for Ipv4Addr { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let inet = IpNetwork::V4(Ipv4Network::new(*self, 32)?); @@ -92,7 +92,7 @@ impl sqlx::Encode<'_, Durable> for Ipv4Addr { impl sqlx::Encode<'_, Durable> for Ipv6Addr { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let inet = IpNetwork::V6(Ipv6Network::new(*self, 128)?); diff --git a/crates/durable-sqlx/src/driver/types/json.rs b/crates/durable-sqlx/src/driver/types/json.rs index bae712e..62d2238 100644 --- a/crates/durable-sqlx/src/driver/types/json.rs +++ b/crates/durable-sqlx/src/driver/types/json.rs @@ -2,7 +2,7 @@ use serde::de::DeserializeOwned; use serde::Serialize; use sqlx::encode::IsNull; use sqlx::error::BoxDynError; -use sqlx::types::{Json, JsonRawValue}; +use sqlx::types::Json; use super::{encode_by_ref, unexpected_nonnull_type}; use crate::bindings::durable::core::sql; @@ -14,7 +14,7 @@ where { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let json = serde_json::to_string(&self.0)?; buf.push(Value(sql::Value::jsonb(&json))); @@ -46,7 +46,7 @@ impl sqlx::Type for Json { impl sqlx::Encode<'_, Durable> for [Json] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let mut json = Vec::with_capacity(self.len()); @@ -63,7 +63,7 @@ impl sqlx::Encode<'_, Durable> for [Json] { impl sqlx::Encode<'_, Durable> for &'_ [Json] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { encode_by_ref::<[Json]>(self, buf) } @@ -75,7 +75,7 @@ where { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { <&[Json] as sqlx::Encode>::encode(self, buf) } @@ -112,40 +112,6 @@ impl sqlx::Type for Vec> { } } -impl sqlx::Encode<'_, Durable> for JsonRawValue { - fn encode_by_ref( - &self, - buf: &mut ::ArgumentBuffer<'_>, - ) -> Result { - buf.push(Value(sql::Value::jsonb(self.get()))); - Ok(IsNull::No) - } -} - -impl sqlx::Encode<'_, Durable> for Box { - fn encode_by_ref( - &self, - buf: &mut ::ArgumentBuffer<'_>, - ) -> Result { - encode_by_ref::(self, buf) - } -} - -impl sqlx::Decode<'_, Durable> for Box { - fn decode(value: ::ValueRef<'_>) -> Result { - if let Some(json) = value.0.as_json() { - let _: &JsonRawValue = serde_json::from_str(&json)?; - let json: Box = json.into_boxed_str(); - - // SAFETY: JsonRawValue is a repr(transparent) wrapper around a str. This is not - // necessarily a guarantee of the serde_json API but seems unlikely to - // change anytime soon given that serde_json takes advantage of it - // internally. - let json: Box = unsafe { std::mem::transmute(json) }; - - return Ok(json); - } - - Err(unexpected_nonnull_type(&TypeInfo::jsonb(), value)) - } -} +// `Encode`/`Decode` for `JsonRawValue`, `&JsonRawValue` and `Box` are +// provided by blanket impls in sqlx 0.9 that delegate to `Json<&Self>` / `Json`, +// which route through the `Json` impls above, so we no longer define them here. diff --git a/crates/durable-sqlx/src/driver/types/mod.rs b/crates/durable-sqlx/src/driver/types/mod.rs index cf32bc5..5065ea8 100644 --- a/crates/durable-sqlx/src/driver/types/mod.rs +++ b/crates/durable-sqlx/src/driver/types/mod.rs @@ -10,7 +10,7 @@ macro_rules! generic_slice_decl { impl<'q> sqlx::Encode<'q, Durable> for [$type] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'q>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::$ctor(self))); Ok(IsNull::No) @@ -48,7 +48,7 @@ macro_rules! forward_encode_deref { impl<'q> sqlx::Encode<'q, Durable> for $type { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'q>, + buf: &mut ::ArgumentBuffer, ) -> Result { <$target as sqlx::Encode<'q, Durable>>::encode_by_ref(self, buf) } @@ -57,10 +57,10 @@ macro_rules! forward_encode_deref { } macro_rules! forward_slice_encode_deref { ($elem:ty) => { - forward_encode_deref!(&'_ [$elem] => [$elem]); + // `&T` and `Cow<'_, T>` are covered by blanket `Encode` impls in sqlx 0.9, + // so we only forward for the wrappers without such blanket impls. forward_encode_deref!(Vec<$elem> => [$elem]); forward_encode_deref!(Box<[$elem]> => [$elem]); - forward_encode_deref!(std::borrow::Cow<'_, [$elem]> => [$elem]); } } @@ -76,9 +76,9 @@ macro_rules! forward_type { macro_rules! forward_slice_type { ($elem:ty) => { + // `Box` and `Cow<'_, T>` are covered by blanket `Type` impls in sqlx 0.9, + // which forward to `<[$elem] as Type>::type_info()` via this base impl. forward_type!([$elem] => Vec<$elem>); - forward_type!(Box<[$elem]> => Vec<$elem>); - forward_type!(std::borrow::Cow<'_, [$elem]> => Vec<$elem>); } } @@ -111,7 +111,7 @@ fn unexpected_nonnull_type(expected: &TypeInfo, value: &Value) -> BoxDynError { fn encode_by_ref<'q, T>( value: &T, - buf: &mut ::ArgumentBuffer<'q>, + buf: &mut ::ArgumentBuffer, ) -> Result where T: sqlx::Encode<'q, Durable> + ?Sized, diff --git a/crates/durable-sqlx/src/driver/types/option.rs b/crates/durable-sqlx/src/driver/types/option.rs index 1898ea3..ed97cfe 100644 --- a/crates/durable-sqlx/src/driver/types/option.rs +++ b/crates/durable-sqlx/src/driver/types/option.rs @@ -9,7 +9,7 @@ where { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'r>, + buf: &mut ::ArgumentBuffer, ) -> Result { match self { Some(value) => value.encode_by_ref(buf), diff --git a/crates/durable-sqlx/src/driver/types/text.rs b/crates/durable-sqlx/src/driver/types/text.rs index 9167aa4..85192b2 100644 --- a/crates/durable-sqlx/src/driver/types/text.rs +++ b/crates/durable-sqlx/src/driver/types/text.rs @@ -10,7 +10,7 @@ use crate::{bindings as sql, Durable}; impl sqlx::Encode<'_, Durable> for str { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::text(self))); Ok(IsNull::No) @@ -32,12 +32,6 @@ impl sqlx::Decode<'_, Durable> for String { } } -impl<'r> sqlx::Decode<'r, Durable> for Cow<'_, str> { - fn decode(value: ::ValueRef<'r>) -> Result { - >::decode(value).map(Cow::Owned) - } -} - impl sqlx::Decode<'_, Durable> for Box { fn decode(value: ::ValueRef<'_>) -> Result { >::decode(value).map(|s| s.into_boxed_str()) @@ -57,7 +51,7 @@ forward_type!(Cow<'_, str> => String); impl sqlx::Encode<'_, Durable> for [&str] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::text_array(self))); Ok(IsNull::No) @@ -69,7 +63,7 @@ forward_slice_encode_deref!(&'_ str); impl sqlx::Encode<'_, Durable> for [String] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let values = self.iter().map(|s| s.as_str()).collect(); as sqlx::Encode>::encode(values, buf) diff --git a/crates/durable-sqlx/src/driver/types/uuid.rs b/crates/durable-sqlx/src/driver/types/uuid.rs index a950f73..b644bd5 100644 --- a/crates/durable-sqlx/src/driver/types/uuid.rs +++ b/crates/durable-sqlx/src/driver/types/uuid.rs @@ -11,7 +11,7 @@ use crate::driver::{Durable, TypeInfo, Value}; impl sqlx::Encode<'_, Durable> for Uuid { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { buf.push(Value::new(sql::Value::uuid((*self).into()))); Ok(IsNull::No) @@ -37,7 +37,7 @@ impl sqlx::Type for Uuid { impl sqlx::Encode<'_, Durable> for [Uuid] { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let array: Vec = self.iter().copied().map(From::from).collect(); @@ -49,14 +49,14 @@ impl sqlx::Encode<'_, Durable> for [Uuid] { impl sqlx::Encode<'_, Durable> for Vec { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { <&[Uuid] as sqlx::Encode<'_, Durable>>::encode(self, buf) } fn encode( self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let array: Vec = self.into_iter().map(From::from).collect(); diff --git a/crates/durable-sqlx/src/lib.rs b/crates/durable-sqlx/src/lib.rs index d44fe7c..d5edb78 100644 --- a/crates/durable-sqlx/src/lib.rs +++ b/crates/durable-sqlx/src/lib.rs @@ -206,7 +206,7 @@ where /// As an additional benefit, query parameters are usually sent in a compact /// binary encoding instead of a human-readable text encoding, which saves /// bandwidth. -pub fn query(sql: &str) -> Query<'_, driver::Arguments> { +pub fn query<'q>(sql: impl sqlx::SqlSafeStr) -> Query<'q, driver::Arguments> { Query(sqlx::query(sql)) } @@ -214,23 +214,23 @@ pub fn query(sql: &str) -> Query<'_, driver::Arguments> { /// given arguments. /// /// See [`query()`][query] for details, such as supported syntax. -pub fn query_with<'q, A>(sql: &'q str, arguments: A) -> Query<'q, A> +pub fn query_with<'q, A>(sql: impl sqlx::SqlSafeStr, arguments: A) -> Query<'q, A> where - A: sqlx::IntoArguments<'q, Durable>, + A: sqlx::IntoArguments, { Query(sqlx::query_with(sql, arguments)) } -pub fn query_as<'q, O>(sql: &'q str) -> QueryAs<'q, O, driver::Arguments> +pub fn query_as<'q, O>(sql: impl sqlx::SqlSafeStr) -> QueryAs<'q, O, driver::Arguments> where O: for<'r> sqlx::FromRow<'r, Row>, { QueryAs(sqlx::query_as(sql)) } -pub fn query_as_with<'q, O, A>(sql: &'q str, arguments: A) -> QueryAs<'q, O, A> +pub fn query_as_with<'q, O, A>(sql: impl sqlx::SqlSafeStr, arguments: A) -> QueryAs<'q, O, A> where - A: sqlx::IntoArguments<'q, Durable>, + A: sqlx::IntoArguments, O: for<'r> sqlx::FromRow<'r, Row>, { QueryAs(sqlx::query_as_with(sql, arguments)) @@ -241,7 +241,7 @@ where /// /// This is a thin wrapper around [`sqlx::query_scalar`]. See the docs there for /// more. -pub fn query_scalar<'q, O>(sql: &'q str) -> QueryScalar<'q, O, driver::Arguments> +pub fn query_scalar<'q, O>(sql: impl sqlx::SqlSafeStr) -> QueryScalar<'q, O, driver::Arguments> where (O,): for<'r> sqlx::FromRow<'r, Row>, { @@ -252,9 +252,12 @@ where /// given arguments, and extract the first column of each row. /// /// See [`query_scalar()`] for details. -pub fn query_scalar_with<'q, O, A>(sql: &'q str, arguments: A) -> QueryScalar<'q, O, A> +pub fn query_scalar_with<'q, O, A>( + sql: impl sqlx::SqlSafeStr, + arguments: A, +) -> QueryScalar<'q, O, A> where - A: sqlx::IntoArguments<'q, Durable>, + A: sqlx::IntoArguments, (O,): for<'r> sqlx::FromRow<'r, Row>, { QueryScalar(sqlx::query_scalar_with(sql, arguments)) @@ -295,7 +298,7 @@ impl<'q> Query<'q, driver::Arguments> { impl<'q, A> Query<'q, A> where - A: sqlx::IntoArguments<'q, Durable> + Send + 'q, + A: sqlx::IntoArguments + Send + 'q, { /// Map each row in the result to another type. /// @@ -424,7 +427,7 @@ impl<'q, O> QueryAs<'q, O, driver::Arguments> { impl<'q, O, A> QueryAs<'q, O, A> where - A: sqlx::IntoArguments<'q, Durable> + 'q, + A: sqlx::IntoArguments + 'q, O: for<'r> sqlx::FromRow<'r, Row> + Send + Unpin, { /// Execute the query and return the generated results as a iterator. @@ -519,7 +522,7 @@ impl<'q, F, O, A> Map<'q, F, A> where F: FnMut(Row) -> sqlx::Result + Send, O: Send + Unpin, - A: sqlx::IntoArguments<'q, Durable> + Send + 'q, + A: sqlx::IntoArguments + Send + 'q, { /// Map each row in the result to another type. /// @@ -629,19 +632,19 @@ pub struct QueryScalar<'q, O, A>(sqlx::query::QueryScalar<'q, Durable, O, A>); impl<'q, O, A> sqlx::Execute<'q, Durable> for QueryScalar<'q, O, A> where O: Send, - A: sqlx::IntoArguments<'q, Durable> + Send + 'q, + A: sqlx::IntoArguments + Send + 'q, { - fn sql(&self) -> &'q str { + fn sql(self) -> sqlx::SqlStr { self.0.sql() } - fn statement(&self) -> Option<&::Statement<'q>> { + fn statement(&self) -> Option<&::Statement> { self.0.statement() } fn take_arguments( &mut self, - ) -> std::result::Result::Arguments<'q>>, BoxDynError> { + ) -> std::result::Result::Arguments>, BoxDynError> { self.0.take_arguments() } @@ -665,7 +668,7 @@ impl<'q, O> QueryScalar<'q, O, driver::Arguments> { impl<'q, O, A> QueryScalar<'q, O, A> where O: Send + Unpin, - A: sqlx::IntoArguments<'q, Durable> + 'q, + A: sqlx::IntoArguments + 'q, (O,): Send + Unpin, (O,): for<'r> sqlx::FromRow<'r, driver::Row>, { diff --git a/crates/durable-test-workflows/Cargo.toml b/crates/durable-test-workflows/Cargo.toml index b00bae5..e96eea3 100644 --- a/crates/durable-test-workflows/Cargo.toml +++ b/crates/durable-test-workflows/Cargo.toml @@ -13,4 +13,4 @@ durable = { workspace = true, features = ["http", "sqlx-full"] } anyhow = "1.0" serde = { version = "1.0", features = ["derive"] } -sqlx = { version = "0.8", features = ["macros"] } +sqlx = { version = "0.9", features = ["macros"] } diff --git a/crates/durable-test-workflows/src/bin/sqlx-enum-insert.rs b/crates/durable-test-workflows/src/bin/sqlx-enum-insert.rs index b31486e..d4efd52 100644 --- a/crates/durable-test-workflows/src/bin/sqlx-enum-insert.rs +++ b/crates/durable-test-workflows/src/bin/sqlx-enum-insert.rs @@ -11,7 +11,7 @@ enum TestDummy { impl sqlx::Encode<'_, Durable> for TestDummy { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let tyinfo = >::type_info(); let value = match self { diff --git a/crates/durable-test-workflows/src/bin/sqlx-enum.rs b/crates/durable-test-workflows/src/bin/sqlx-enum.rs index 2c27d26..fd7fb56 100644 --- a/crates/durable-test-workflows/src/bin/sqlx-enum.rs +++ b/crates/durable-test-workflows/src/bin/sqlx-enum.rs @@ -12,7 +12,7 @@ enum TaskState { impl sqlx::Encode<'_, Durable> for TaskState { fn encode_by_ref( &self, - buf: &mut ::ArgumentBuffer<'_>, + buf: &mut ::ArgumentBuffer, ) -> Result { let value = match self { Self::Ready => "ready", diff --git a/crates/durable-test/Cargo.toml b/crates/durable-test/Cargo.toml index bc911c5..b49884a 100644 --- a/crates/durable-test/Cargo.toml +++ b/crates/durable-test/Cargo.toml @@ -13,7 +13,7 @@ anyhow = "1.0" chrono = "0.4" dotenvy = "0.15.7" serde_json = "1.0.149" -sqlx = { version = "0.8", features = ["postgres", "runtime-tokio-rustls"] } +sqlx = { version = "0.9", features = ["postgres", "runtime-tokio", "tls-rustls"] } tokio = { version = "1.50", features = ["full", "macros"] } wasmtime = { workspace = true } futures = "0.3.32" diff --git a/crates/durable-worker/Cargo.toml b/crates/durable-worker/Cargo.toml index dd6a236..adec6ea 100644 --- a/crates/durable-worker/Cargo.toml +++ b/crates/durable-worker/Cargo.toml @@ -17,7 +17,7 @@ durable-runtime = { workspace = true } anyhow = "1.0" clap = { version = "4.6", features = ["derive", "env"] } console-subscriber = { version = "0.5.0", optional = true } -sqlx = { version = "0.8.6", features = ["postgres"] } +sqlx = { version = "0.9", features = ["postgres"] } tokio = { version = "1.50", features = ["full"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] } diff --git a/crates/xtask/Cargo.toml b/crates/xtask/Cargo.toml index 8d3369f..b4250ad 100644 --- a/crates/xtask/Cargo.toml +++ b/crates/xtask/Cargo.toml @@ -24,6 +24,6 @@ glob = "0.3.3" scopeguard = "1.2.0" [dependencies.sqlx] -version = "0.8.6" +version = "0.9" default-features = false features = ["json", "postgres", "runtime-tokio", "tls-rustls"] From 1848568c6f6bdfe580e5c7b9b0897c51ee4af15e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 08:41:46 +0000 Subject: [PATCH 2/4] style: apply nightly rustfmt formatting for sqlx 0.9 changes Break long method chains, collapse the Connection::begin signature, and re-wrap two comments to satisfy the nightly rustfmt config used in CI. https://claude.ai/code/session_01KN3PaeQ1pFq1B3uReMqHjp --- crates/durable-migrate/src/apply.rs | 16 +++++++++++----- crates/durable-sqlx/src/driver/connection.rs | 4 +--- crates/durable-sqlx/src/driver/types/bytea.rs | 3 ++- crates/durable-sqlx/src/driver/types/json.rs | 7 ++++--- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/crates/durable-migrate/src/apply.rs b/crates/durable-migrate/src/apply.rs index b8ace6b..472912e 100644 --- a/crates/durable-migrate/src/apply.rs +++ b/crates/durable-migrate/src/apply.rs @@ -38,8 +38,8 @@ impl Migrator { sqlx::query(sqlx::AssertSqlSafe(format!( "CREATE SCHEMA IF NOT EXISTS {schema:?}" ))) - .execute(&mut *conn) - .await?; + .execute(&mut *conn) + .await?; } #[rustfmt::skip] @@ -53,7 +53,9 @@ impl Migrator { ", table = options.migration_table.as_sql() ); - sqlx::query(sqlx::AssertSqlSafe(query)).execute(&mut *conn).await?; + sqlx::query(sqlx::AssertSqlSafe(query)) + .execute(&mut *conn) + .await?; Ok(()) } @@ -260,7 +262,9 @@ impl Migrator { } => { tracing::debug!("running migration {version} - {name}"); - sqlx::raw_sql(sqlx::AssertSqlSafe(sql)).execute(&mut *tx).await?; + sqlx::raw_sql(sqlx::AssertSqlSafe(sql)) + .execute(&mut *tx) + .await?; let query = format!( "INSERT INTO {table}(version, name, revert) VALUES ($1, $2, $3) ", @@ -289,7 +293,9 @@ impl Migrator { .fetch_one(&mut *tx) .await?; - sqlx::raw_sql(sqlx::AssertSqlSafe(revert)).execute(&mut *tx).await?; + sqlx::raw_sql(sqlx::AssertSqlSafe(revert)) + .execute(&mut *tx) + .await?; } } diff --git a/crates/durable-sqlx/src/driver/connection.rs b/crates/durable-sqlx/src/driver/connection.rs index 67c2693..9610c53 100644 --- a/crates/durable-sqlx/src/driver/connection.rs +++ b/crates/durable-sqlx/src/driver/connection.rs @@ -102,9 +102,7 @@ impl sqlx::Connection for Connection { Ok(()) } - async fn begin( - &mut self, - ) -> Result, sqlx::Error> { + async fn begin(&mut self) -> Result, sqlx::Error> { sqlx::Transaction::begin(self, None).await } diff --git a/crates/durable-sqlx/src/driver/types/bytea.rs b/crates/durable-sqlx/src/driver/types/bytea.rs index df07afc..0a48b8d 100644 --- a/crates/durable-sqlx/src/driver/types/bytea.rs +++ b/crates/durable-sqlx/src/driver/types/bytea.rs @@ -38,7 +38,8 @@ impl sqlx::Type for Vec { } forward_type!([u8] => Vec); -// `Type` for `Box<[u8]>` and `Cow<'_, [u8]>` is covered by blanket impls in sqlx 0.9. +// `Type` for `Box<[u8]>` and `Cow<'_, [u8]>` is covered by blanket impls in +// sqlx 0.9. impl sqlx::Type for [u8; N] { fn type_info() -> ::TypeInfo { diff --git a/crates/durable-sqlx/src/driver/types/json.rs b/crates/durable-sqlx/src/driver/types/json.rs index 62d2238..f7bf5bd 100644 --- a/crates/durable-sqlx/src/driver/types/json.rs +++ b/crates/durable-sqlx/src/driver/types/json.rs @@ -112,6 +112,7 @@ impl sqlx::Type for Vec> { } } -// `Encode`/`Decode` for `JsonRawValue`, `&JsonRawValue` and `Box` are -// provided by blanket impls in sqlx 0.9 that delegate to `Json<&Self>` / `Json`, -// which route through the `Json` impls above, so we no longer define them here. +// `Encode`/`Decode` for `JsonRawValue`, `&JsonRawValue` and `Box` +// are provided by blanket impls in sqlx 0.9 that delegate to `Json<&Self>` / +// `Json`, which route through the `Json` impls above, so we no longer define +// them here. From 7ef4061a74b6705d7feffdc8da7c734da49dcd7b Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 08:52:22 +0000 Subject: [PATCH 3/4] fix(sqlx): regenerate .sqlx cache for 0.9 and fix doctest - Regenerate the offline query cache with sqlx-cli 0.9 (adds the new per-column `origin` provenance field and a trailing newline to each file). Generated with --all-targets --all-features so the test-only queries the clippy job needs offline are retained. - Re-export `AssertSqlSafe` / `SqlSafeStr` / `SqlStr` from durable-sqlx so callers of the `query*` helpers (which now take `impl SqlSafeStr`) can wrap dynamic SQL. - Update the SQL-injection doctest to wrap the dynamic string in `AssertSqlSafe`, mirroring sqlx 0.9's own updated example. https://claude.ai/code/session_01KN3PaeQ1pFq1B3uReMqHjp --- ...368aa6e0fcbe476ca57841ce2c0e5e995d1e9.json | 2 +- ...e32c48eef6bddbd5192c1677772cbf51dbe84.json | 2 +- ...dfc75722e027524c753738323bea2f343fb56.json | 2 +- ...8a50c5731c6b9bb4dfae298197349827113b6.json | 2 +- ...3ebe6188e00186344ec881c5e339a5f0bb7c9.json | 8 +++- ...9451793d9f5f8b5af7be67c348d952216ac92.json | 2 +- ...9597bd10ac826027f2819e6f6f38fa8ad10be.json | 2 +- ...35f3fc1e0436b5da9f2f96af0d5686f438a19.json | 8 +++- ...9c51e69b585bea674c4f6ac6ff544e164c7d3.json | 3 +- ...6b4f6282b60772eb1c64a86816a51ea59ed25.json | 24 +++++++++-- ...01ebdb7cc711e0c41b0f116b518b3b26156c9.json | 10 ++++- ...a91b6874f63cc9168daf53a69d03455b5102e.json | 8 +++- ...b8fd68b5bf51d0b1278ca8421a1f36fd87509.json | 16 +++++++- ...2c6894b1eb27718b2e01878138d05c9fdb0e7.json | 8 ++-- ...c41e2d3a82eb19f95d8e2a3cf721298c965d2.json | 2 +- ...3e4fce9905647474ea0d445a6d3764cf4caf1.json | 8 +++- ...a001a52fae5d290811ea953f2ad022d96dfed.json | 2 +- ...991c193416b9fe48151a1e712ef3bc25e599a.json | 11 ++++- ...4edc7f9aee0703ea1f5c1c84b221c0dd529b1.json | 10 ++++- ...683708fa4a03576b80a9a677732e5387865a2.json | 26 ++++++++++-- ...952e2d13f61d34be3e004177c799b8ade0ed0.json | 8 +++- ...2e173479e1a82efe0f289bb4baa03642a32b1.json | 8 +++- ...30023315c5ce96b9b77b8d32e143f05d55f51.json | 8 +++- ...7884ac9de62131a613743cf87d1fde733280f.json | 40 ++++++++++++++++--- ...6507b05f9333aedaa31aa3128fcd59124618c.json | 2 +- ...bed26e1d7a8dfc591a6735b3712aa32014419.json | 16 +++++++- ...cfda15846e1a9f2447c2d0cd7d7d158ede5f0.json | 6 +++ ...b0218a6489aa437d7396c3d59fcb30beba0e7.json | 3 +- ...dfcd0d83855bfb315e2e5515dbc0d6a1b017f.json | 24 +++++++++-- ...7ec118c74c57532fd97965435f98d81a140bd.json | 16 +++++++- ...cfcb190a30a29a62207344fb6b6cc2b1e0718.json | 8 +++- ...9cdc902fe170a67e25de18c0743f1ef4981fa.json | 3 +- ...16d53ef5ec74e1e797250141dc2eaef7f493a.json | 3 +- ...cf6b0a9e690fe51f5886b99cf6a5ee0ff5e75.json | 2 +- ...59f91d8efe0b28c7d014c8320e973ea552dcf.json | 2 +- ...c83ea7820e05ee59a70817ac9ea55500ca1ba.json | 8 +++- ...dc5cd6bb5e3e24361bf22d896a412fecbbf9c.json | 2 +- ...2c9c657ede5cb2dd677fa2d89755a011cea46.json | 19 +++++++-- ...626eb8dc9ebb07cd563b2681b106e6fa74596.json | 2 +- crates/durable-sqlx/src/lib.rs | 7 +++- 40 files changed, 283 insertions(+), 60 deletions(-) diff --git a/.sqlx/query-0404a682784ca66d2c778acb3b0368aa6e0fcbe476ca57841ce2c0e5e995d1e9.json b/.sqlx/query-0404a682784ca66d2c778acb3b0368aa6e0fcbe476ca57841ce2c0e5e995d1e9.json index 3c7a79b..2162928 100644 --- a/.sqlx/query-0404a682784ca66d2c778acb3b0368aa6e0fcbe476ca57841ce2c0e5e995d1e9.json +++ b/.sqlx/query-0404a682784ca66d2c778acb3b0368aa6e0fcbe476ca57841ce2c0e5e995d1e9.json @@ -11,4 +11,4 @@ "nullable": [] }, "hash": "0404a682784ca66d2c778acb3b0368aa6e0fcbe476ca57841ce2c0e5e995d1e9" -} \ No newline at end of file +} diff --git a/.sqlx/query-22fd40e5440beb2915e95637404e32c48eef6bddbd5192c1677772cbf51dbe84.json b/.sqlx/query-22fd40e5440beb2915e95637404e32c48eef6bddbd5192c1677772cbf51dbe84.json index a6b33ae..bb6e965 100644 --- a/.sqlx/query-22fd40e5440beb2915e95637404e32c48eef6bddbd5192c1677772cbf51dbe84.json +++ b/.sqlx/query-22fd40e5440beb2915e95637404e32c48eef6bddbd5192c1677772cbf51dbe84.json @@ -11,4 +11,4 @@ "nullable": [] }, "hash": "22fd40e5440beb2915e95637404e32c48eef6bddbd5192c1677772cbf51dbe84" -} \ No newline at end of file +} diff --git a/.sqlx/query-2d3b7402df579487b699a1b50b5dfc75722e027524c753738323bea2f343fb56.json b/.sqlx/query-2d3b7402df579487b699a1b50b5dfc75722e027524c753738323bea2f343fb56.json index 9ad6465..4b9a22b 100644 --- a/.sqlx/query-2d3b7402df579487b699a1b50b5dfc75722e027524c753738323bea2f343fb56.json +++ b/.sqlx/query-2d3b7402df579487b699a1b50b5dfc75722e027524c753738323bea2f343fb56.json @@ -9,4 +9,4 @@ "nullable": [] }, "hash": "2d3b7402df579487b699a1b50b5dfc75722e027524c753738323bea2f343fb56" -} \ No newline at end of file +} diff --git a/.sqlx/query-3402a2d91a23aa927386d4825768a50c5731c6b9bb4dfae298197349827113b6.json b/.sqlx/query-3402a2d91a23aa927386d4825768a50c5731c6b9bb4dfae298197349827113b6.json index 561818b..d5a9468 100644 --- a/.sqlx/query-3402a2d91a23aa927386d4825768a50c5731c6b9bb4dfae298197349827113b6.json +++ b/.sqlx/query-3402a2d91a23aa927386d4825768a50c5731c6b9bb4dfae298197349827113b6.json @@ -11,4 +11,4 @@ "nullable": [] }, "hash": "3402a2d91a23aa927386d4825768a50c5731c6b9bb4dfae298197349827113b6" -} \ No newline at end of file +} diff --git a/.sqlx/query-36b0970e1af499032f73b7974d43ebe6188e00186344ec881c5e339a5f0bb7c9.json b/.sqlx/query-36b0970e1af499032f73b7974d43ebe6188e00186344ec881c5e339a5f0bb7c9.json index 1e2cf08..91fab5d 100644 --- a/.sqlx/query-36b0970e1af499032f73b7974d43ebe6188e00186344ec881c5e339a5f0bb7c9.json +++ b/.sqlx/query-36b0970e1af499032f73b7974d43ebe6188e00186344ec881c5e339a5f0bb7c9.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "wasm", - "type_info": "Bytea" + "type_info": "Bytea", + "origin": { + "Table": { + "table": "durable.wasm", + "name": "wasm" + } + } } ], "parameters": { diff --git a/.sqlx/query-3cd8e92d208177ffc7168ab4bf19451793d9f5f8b5af7be67c348d952216ac92.json b/.sqlx/query-3cd8e92d208177ffc7168ab4bf19451793d9f5f8b5af7be67c348d952216ac92.json index 9d6798f..a42e7d1 100644 --- a/.sqlx/query-3cd8e92d208177ffc7168ab4bf19451793d9f5f8b5af7be67c348d952216ac92.json +++ b/.sqlx/query-3cd8e92d208177ffc7168ab4bf19451793d9f5f8b5af7be67c348d952216ac92.json @@ -12,4 +12,4 @@ "nullable": [] }, "hash": "3cd8e92d208177ffc7168ab4bf19451793d9f5f8b5af7be67c348d952216ac92" -} \ No newline at end of file +} diff --git a/.sqlx/query-46866c27afbd80cda4ce93a15dc9597bd10ac826027f2819e6f6f38fa8ad10be.json b/.sqlx/query-46866c27afbd80cda4ce93a15dc9597bd10ac826027f2819e6f6f38fa8ad10be.json index ca425ff..2939904 100644 --- a/.sqlx/query-46866c27afbd80cda4ce93a15dc9597bd10ac826027f2819e6f6f38fa8ad10be.json +++ b/.sqlx/query-46866c27afbd80cda4ce93a15dc9597bd10ac826027f2819e6f6f38fa8ad10be.json @@ -12,4 +12,4 @@ "nullable": [] }, "hash": "46866c27afbd80cda4ce93a15dc9597bd10ac826027f2819e6f6f38fa8ad10be" -} \ No newline at end of file +} diff --git a/.sqlx/query-4b00eb27c0687f3a24729cf77dd35f3fc1e0436b5da9f2f96af0d5686f438a19.json b/.sqlx/query-4b00eb27c0687f3a24729cf77dd35f3fc1e0436b5da9f2f96af0d5686f438a19.json index 5785b4b..ecb047b 100644 --- a/.sqlx/query-4b00eb27c0687f3a24729cf77dd35f3fc1e0436b5da9f2f96af0d5686f438a19.json +++ b/.sqlx/query-4b00eb27c0687f3a24729cf77dd35f3fc1e0436b5da9f2f96af0d5686f438a19.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "message", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.log", + "name": "message" + } + } } ], "parameters": { diff --git a/.sqlx/query-4bb061ea8b2df1791af1d34e4599c51e69b585bea674c4f6ac6ff544e164c7d3.json b/.sqlx/query-4bb061ea8b2df1791af1d34e4599c51e69b585bea674c4f6ac6ff544e164c7d3.json index 04e4d15..79785c7 100644 --- a/.sqlx/query-4bb061ea8b2df1791af1d34e4599c51e69b585bea674c4f6ac6ff544e164c7d3.json +++ b/.sqlx/query-4bb061ea8b2df1791af1d34e4599c51e69b585bea674c4f6ac6ff544e164c7d3.json @@ -6,7 +6,8 @@ { "ordinal": 0, "name": "state!", - "type_info": "Text" + "type_info": "Text", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-4f5eb0238c822ef6eeea2ea094d6b4f6282b60772eb1c64a86816a51ea59ed25.json b/.sqlx/query-4f5eb0238c822ef6eeea2ea094d6b4f6282b60772eb1c64a86816a51ea59ed25.json index 390a491..b0de96c 100644 --- a/.sqlx/query-4f5eb0238c822ef6eeea2ea094d6b4f6282b60772eb1c64a86816a51ea59ed25.json +++ b/.sqlx/query-4f5eb0238c822ef6eeea2ea094d6b4f6282b60772eb1c64a86816a51ea59ed25.json @@ -6,17 +6,35 @@ { "ordinal": 0, "name": "index", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "durable.event", + "name": "index" + } + } }, { "ordinal": 1, "name": "label", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.event", + "name": "label" + } + } }, { "ordinal": 2, "name": "value!: Json", - "type_info": "Jsonb" + "type_info": "Jsonb", + "origin": { + "Table": { + "table": "durable.event", + "name": "value" + } + } } ], "parameters": { diff --git a/.sqlx/query-50e935d0a6e5dd395bb86c7866c01ebdb7cc711e0c41b0f116b518b3b26156c9.json b/.sqlx/query-50e935d0a6e5dd395bb86c7866c01ebdb7cc711e0c41b0f116b518b3b26156c9.json index 060d48b..d81f9c1 100644 --- a/.sqlx/query-50e935d0a6e5dd395bb86c7866c01ebdb7cc711e0c41b0f116b518b3b26156c9.json +++ b/.sqlx/query-50e935d0a6e5dd395bb86c7866c01ebdb7cc711e0c41b0f116b518b3b26156c9.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.worker", + "name": "id" + } + } } ], "parameters": { @@ -19,4 +25,4 @@ ] }, "hash": "50e935d0a6e5dd395bb86c7866c01ebdb7cc711e0c41b0f116b518b3b26156c9" -} \ No newline at end of file +} diff --git a/.sqlx/query-605c8c9ec1e6327f21c7a175f59a91b6874f63cc9168daf53a69d03455b5102e.json b/.sqlx/query-605c8c9ec1e6327f21c7a175f59a91b6874f63cc9168daf53a69d03455b5102e.json index f126545..2b88d7d 100644 --- a/.sqlx/query-605c8c9ec1e6327f21c7a175f59a91b6874f63cc9168daf53a69d03455b5102e.json +++ b/.sqlx/query-605c8c9ec1e6327f21c7a175f59a91b6874f63cc9168daf53a69d03455b5102e.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.task", + "name": "id" + } + } } ], "parameters": { diff --git a/.sqlx/query-62627f21394ed7851e834fd55d2b8fd68b5bf51d0b1278ca8421a1f36fd87509.json b/.sqlx/query-62627f21394ed7851e834fd55d2b8fd68b5bf51d0b1278ca8421a1f36fd87509.json index 4da3543..4de7a53 100644 --- a/.sqlx/query-62627f21394ed7851e834fd55d2b8fd68b5bf51d0b1278ca8421a1f36fd87509.json +++ b/.sqlx/query-62627f21394ed7851e834fd55d2b8fd68b5bf51d0b1278ca8421a1f36fd87509.json @@ -6,12 +6,24 @@ { "ordinal": 0, "name": "message", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.log", + "name": "message" + } + } }, { "ordinal": 1, "name": "index", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "durable.log", + "name": "index" + } + } } ], "parameters": { diff --git a/.sqlx/query-6586483f7d9bff87477cae679ad2c6894b1eb27718b2e01878138d05c9fdb0e7.json b/.sqlx/query-6586483f7d9bff87477cae679ad2c6894b1eb27718b2e01878138d05c9fdb0e7.json index 0964212..25c0092 100644 --- a/.sqlx/query-6586483f7d9bff87477cae679ad2c6894b1eb27718b2e01878138d05c9fdb0e7.json +++ b/.sqlx/query-6586483f7d9bff87477cae679ad2c6894b1eb27718b2e01878138d05c9fdb0e7.json @@ -6,12 +6,14 @@ { "ordinal": 0, "name": "id!", - "type_info": "Int8" + "type_info": "Int8", + "origin": "Expression" }, { "ordinal": 1, "name": "heartbeat_at!", - "type_info": "Timestamptz" + "type_info": "Timestamptz", + "origin": "Expression" } ], "parameters": { @@ -25,4 +27,4 @@ ] }, "hash": "6586483f7d9bff87477cae679ad2c6894b1eb27718b2e01878138d05c9fdb0e7" -} \ No newline at end of file +} diff --git a/.sqlx/query-685f6bb7abf389c452400578793c41e2d3a82eb19f95d8e2a3cf721298c965d2.json b/.sqlx/query-685f6bb7abf389c452400578793c41e2d3a82eb19f95d8e2a3cf721298c965d2.json index 9b84ab5..8d2c151 100644 --- a/.sqlx/query-685f6bb7abf389c452400578793c41e2d3a82eb19f95d8e2a3cf721298c965d2.json +++ b/.sqlx/query-685f6bb7abf389c452400578793c41e2d3a82eb19f95d8e2a3cf721298c965d2.json @@ -12,4 +12,4 @@ "nullable": [] }, "hash": "685f6bb7abf389c452400578793c41e2d3a82eb19f95d8e2a3cf721298c965d2" -} \ No newline at end of file +} diff --git a/.sqlx/query-69e3a41200109d5036d229c3ee33e4fce9905647474ea0d445a6d3764cf4caf1.json b/.sqlx/query-69e3a41200109d5036d229c3ee33e4fce9905647474ea0d445a6d3764cf4caf1.json index 174537a..4deb93b 100644 --- a/.sqlx/query-69e3a41200109d5036d229c3ee33e4fce9905647474ea0d445a6d3764cf4caf1.json +++ b/.sqlx/query-69e3a41200109d5036d229c3ee33e4fce9905647474ea0d445a6d3764cf4caf1.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.task", + "name": "id" + } + } } ], "parameters": { diff --git a/.sqlx/query-6a58fd11039e3da7feadcf625dca001a52fae5d290811ea953f2ad022d96dfed.json b/.sqlx/query-6a58fd11039e3da7feadcf625dca001a52fae5d290811ea953f2ad022d96dfed.json index 8c732f3..0793b49 100644 --- a/.sqlx/query-6a58fd11039e3da7feadcf625dca001a52fae5d290811ea953f2ad022d96dfed.json +++ b/.sqlx/query-6a58fd11039e3da7feadcf625dca001a52fae5d290811ea953f2ad022d96dfed.json @@ -12,4 +12,4 @@ "nullable": [] }, "hash": "6a58fd11039e3da7feadcf625dca001a52fae5d290811ea953f2ad022d96dfed" -} \ No newline at end of file +} diff --git a/.sqlx/query-6afae92bdc034fd484f4f10b707991c193416b9fe48151a1e712ef3bc25e599a.json b/.sqlx/query-6afae92bdc034fd484f4f10b707991c193416b9fe48151a1e712ef3bc25e599a.json index fd569cf..cc1ca08 100644 --- a/.sqlx/query-6afae92bdc034fd484f4f10b707991c193416b9fe48151a1e712ef3bc25e599a.json +++ b/.sqlx/query-6afae92bdc034fd484f4f10b707991c193416b9fe48151a1e712ef3bc25e599a.json @@ -6,12 +6,19 @@ { "ordinal": 0, "name": "label", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.event", + "name": "label" + } + } }, { "ordinal": 1, "name": "value!", - "type_info": "Text" + "type_info": "Text", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-6b9dd270eea86985822ded5a1fc4edc7f9aee0703ea1f5c1c84b221c0dd529b1.json b/.sqlx/query-6b9dd270eea86985822ded5a1fc4edc7f9aee0703ea1f5c1c84b221c0dd529b1.json index da681d2..8a21718 100644 --- a/.sqlx/query-6b9dd270eea86985822ded5a1fc4edc7f9aee0703ea1f5c1c84b221c0dd529b1.json +++ b/.sqlx/query-6b9dd270eea86985822ded5a1fc4edc7f9aee0703ea1f5c1c84b221c0dd529b1.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "wakeup_at!", - "type_info": "Timestamptz" + "type_info": "Timestamptz", + "origin": { + "Table": { + "table": "durable.task", + "name": "wakeup_at" + } + } } ], "parameters": { @@ -17,4 +23,4 @@ ] }, "hash": "6b9dd270eea86985822ded5a1fc4edc7f9aee0703ea1f5c1c84b221c0dd529b1" -} \ No newline at end of file +} diff --git a/.sqlx/query-7079303b7c4017e46ef7bab339a683708fa4a03576b80a9a677732e5387865a2.json b/.sqlx/query-7079303b7c4017e46ef7bab339a683708fa4a03576b80a9a677732e5387865a2.json index 72320bc..2c2802e 100644 --- a/.sqlx/query-7079303b7c4017e46ef7bab339a683708fa4a03576b80a9a677732e5387865a2.json +++ b/.sqlx/query-7079303b7c4017e46ef7bab339a683708fa4a03576b80a9a677732e5387865a2.json @@ -6,17 +6,35 @@ { "ordinal": 0, "name": "created_at", - "type_info": "Timestamptz" + "type_info": "Timestamptz", + "origin": { + "Table": { + "table": "durable.notification", + "name": "created_at" + } + } }, { "ordinal": 1, "name": "event", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.notification", + "name": "event" + } + } }, { "ordinal": 2, "name": "data: Json>", - "type_info": "Jsonb" + "type_info": "Jsonb", + "origin": { + "Table": { + "table": "durable.notification", + "name": "data" + } + } } ], "parameters": { @@ -31,4 +49,4 @@ ] }, "hash": "7079303b7c4017e46ef7bab339a683708fa4a03576b80a9a677732e5387865a2" -} \ No newline at end of file +} diff --git a/.sqlx/query-73f3e050b14065e3d25a13ff225952e2d13f61d34be3e004177c799b8ade0ed0.json b/.sqlx/query-73f3e050b14065e3d25a13ff225952e2d13f61d34be3e004177c799b8ade0ed0.json index 79b40be..f6d7358 100644 --- a/.sqlx/query-73f3e050b14065e3d25a13ff225952e2d13f61d34be3e004177c799b8ade0ed0.json +++ b/.sqlx/query-73f3e050b14065e3d25a13ff225952e2d13f61d34be3e004177c799b8ade0ed0.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.worker", + "name": "id" + } + } } ], "parameters": { diff --git a/.sqlx/query-7f746180eb4a64c9d07789d04ea2e173479e1a82efe0f289bb4baa03642a32b1.json b/.sqlx/query-7f746180eb4a64c9d07789d04ea2e173479e1a82efe0f289bb4baa03642a32b1.json index 113116a..2136af2 100644 --- a/.sqlx/query-7f746180eb4a64c9d07789d04ea2e173479e1a82efe0f289bb4baa03642a32b1.json +++ b/.sqlx/query-7f746180eb4a64c9d07789d04ea2e173479e1a82efe0f289bb4baa03642a32b1.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.worker", + "name": "id" + } + } } ], "parameters": { diff --git a/.sqlx/query-9586a1de8c2d853dc4c2e33b5b930023315c5ce96b9b77b8d32e143f05d55f51.json b/.sqlx/query-9586a1de8c2d853dc4c2e33b5b930023315c5ce96b9b77b8d32e143f05d55f51.json index af6e145..874b6df 100644 --- a/.sqlx/query-9586a1de8c2d853dc4c2e33b5b930023315c5ce96b9b77b8d32e143f05d55f51.json +++ b/.sqlx/query-9586a1de8c2d853dc4c2e33b5b930023315c5ce96b9b77b8d32e143f05d55f51.json @@ -19,6 +19,12 @@ ] } } + }, + "origin": { + "Table": { + "table": "durable.task", + "name": "state" + } } } ], @@ -32,4 +38,4 @@ ] }, "hash": "9586a1de8c2d853dc4c2e33b5b930023315c5ce96b9b77b8d32e143f05d55f51" -} \ No newline at end of file +} diff --git a/.sqlx/query-a091d500a3fff5c1617746a11bb7884ac9de62131a613743cf87d1fde733280f.json b/.sqlx/query-a091d500a3fff5c1617746a11bb7884ac9de62131a613743cf87d1fde733280f.json index cc6c691..eb420cb 100644 --- a/.sqlx/query-a091d500a3fff5c1617746a11bb7884ac9de62131a613743cf87d1fde733280f.json +++ b/.sqlx/query-a091d500a3fff5c1617746a11bb7884ac9de62131a613743cf87d1fde733280f.json @@ -6,27 +6,57 @@ { "ordinal": 0, "name": "id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.task", + "name": "id" + } + } }, { "ordinal": 1, "name": "name", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.task", + "name": "name" + } + } }, { "ordinal": 2, "name": "created_at", - "type_info": "Timestamptz" + "type_info": "Timestamptz", + "origin": { + "Table": { + "table": "durable.task", + "name": "created_at" + } + } }, { "ordinal": 3, "name": "wasm!", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.task", + "name": "wasm" + } + } }, { "ordinal": 4, "name": "data!: Json>", - "type_info": "Jsonb" + "type_info": "Jsonb", + "origin": { + "Table": { + "table": "durable.task", + "name": "data" + } + } } ], "parameters": { diff --git a/.sqlx/query-a2e037bea4471d830a137c39dad6507b05f9333aedaa31aa3128fcd59124618c.json b/.sqlx/query-a2e037bea4471d830a137c39dad6507b05f9333aedaa31aa3128fcd59124618c.json index b504bfc..4e054a7 100644 --- a/.sqlx/query-a2e037bea4471d830a137c39dad6507b05f9333aedaa31aa3128fcd59124618c.json +++ b/.sqlx/query-a2e037bea4471d830a137c39dad6507b05f9333aedaa31aa3128fcd59124618c.json @@ -13,4 +13,4 @@ "nullable": [] }, "hash": "a2e037bea4471d830a137c39dad6507b05f9333aedaa31aa3128fcd59124618c" -} \ No newline at end of file +} diff --git a/.sqlx/query-b474c49fb504defb57c7e18773ebed26e1d7a8dfc591a6735b3712aa32014419.json b/.sqlx/query-b474c49fb504defb57c7e18773ebed26e1d7a8dfc591a6735b3712aa32014419.json index 03e7c10..b0f2a05 100644 --- a/.sqlx/query-b474c49fb504defb57c7e18773ebed26e1d7a8dfc591a6735b3712aa32014419.json +++ b/.sqlx/query-b474c49fb504defb57c7e18773ebed26e1d7a8dfc591a6735b3712aa32014419.json @@ -6,12 +6,24 @@ { "ordinal": 0, "name": "label", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.event", + "name": "label" + } + } }, { "ordinal": 1, "name": "value: Json>", - "type_info": "Jsonb" + "type_info": "Jsonb", + "origin": { + "Table": { + "table": "durable.event", + "name": "value" + } + } } ], "parameters": { diff --git a/.sqlx/query-b9a345efc3c8b841f1a7666a48ecfda15846e1a9f2447c2d0cd7d7d158ede5f0.json b/.sqlx/query-b9a345efc3c8b841f1a7666a48ecfda15846e1a9f2447c2d0cd7d7d158ede5f0.json index a46acbb..a54c99b 100644 --- a/.sqlx/query-b9a345efc3c8b841f1a7666a48ecfda15846e1a9f2447c2d0cd7d7d158ede5f0.json +++ b/.sqlx/query-b9a345efc3c8b841f1a7666a48ecfda15846e1a9f2447c2d0cd7d7d158ede5f0.json @@ -19,6 +19,12 @@ ] } } + }, + "origin": { + "Table": { + "table": "durable.task", + "name": "state" + } } } ], diff --git a/.sqlx/query-be83acd58277594580a7e1c306db0218a6489aa437d7396c3d59fcb30beba0e7.json b/.sqlx/query-be83acd58277594580a7e1c306db0218a6489aa437d7396c3d59fcb30beba0e7.json index f6ed8b0..2204a58 100644 --- a/.sqlx/query-be83acd58277594580a7e1c306db0218a6489aa437d7396c3d59fcb30beba0e7.json +++ b/.sqlx/query-be83acd58277594580a7e1c306db0218a6489aa437d7396c3d59fcb30beba0e7.json @@ -6,7 +6,8 @@ { "ordinal": 0, "name": "oid!", - "type_info": "Oid" + "type_info": "Oid", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-c7e93c8b478730b7079610807c7dfcd0d83855bfb315e2e5515dbc0d6a1b017f.json b/.sqlx/query-c7e93c8b478730b7079610807c7dfcd0d83855bfb315e2e5515dbc0d6a1b017f.json index 723cda2..e4b9573 100644 --- a/.sqlx/query-c7e93c8b478730b7079610807c7dfcd0d83855bfb315e2e5515dbc0d6a1b017f.json +++ b/.sqlx/query-c7e93c8b478730b7079610807c7dfcd0d83855bfb315e2e5515dbc0d6a1b017f.json @@ -6,17 +6,35 @@ { "ordinal": 0, "name": "index", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "durable.event", + "name": "index" + } + } }, { "ordinal": 1, "name": "label", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.event", + "name": "label" + } + } }, { "ordinal": 2, "name": "value!: Json>", - "type_info": "Jsonb" + "type_info": "Jsonb", + "origin": { + "Table": { + "table": "durable.event", + "name": "value" + } + } } ], "parameters": { diff --git a/.sqlx/query-d71785b5268833e0c38ec5c808e7ec118c74c57532fd97965435f98d81a140bd.json b/.sqlx/query-d71785b5268833e0c38ec5c808e7ec118c74c57532fd97965435f98d81a140bd.json index 0222457..e3df1fb 100644 --- a/.sqlx/query-d71785b5268833e0c38ec5c808e7ec118c74c57532fd97965435f98d81a140bd.json +++ b/.sqlx/query-d71785b5268833e0c38ec5c808e7ec118c74c57532fd97965435f98d81a140bd.json @@ -6,12 +6,24 @@ { "ordinal": 0, "name": "id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.wasm", + "name": "id" + } + } }, { "ordinal": 1, "name": "last_used", - "type_info": "Timestamptz" + "type_info": "Timestamptz", + "origin": { + "Table": { + "table": "durable.wasm", + "name": "last_used" + } + } } ], "parameters": { diff --git a/.sqlx/query-d862efc45d7f2588b18af3c156acfcb190a30a29a62207344fb6b6cc2b1e0718.json b/.sqlx/query-d862efc45d7f2588b18af3c156acfcb190a30a29a62207344fb6b6cc2b1e0718.json index d723697..66abdd1 100644 --- a/.sqlx/query-d862efc45d7f2588b18af3c156acfcb190a30a29a62207344fb6b6cc2b1e0718.json +++ b/.sqlx/query-d862efc45d7f2588b18af3c156acfcb190a30a29a62207344fb6b6cc2b1e0718.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "running_on", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "durable.task", + "name": "running_on" + } + } } ], "parameters": { diff --git a/.sqlx/query-df019a10425aff055eb1a0256969cdc902fe170a67e25de18c0743f1ef4981fa.json b/.sqlx/query-df019a10425aff055eb1a0256969cdc902fe170a67e25de18c0743f1ef4981fa.json index b78c7de..eb6aef6 100644 --- a/.sqlx/query-df019a10425aff055eb1a0256969cdc902fe170a67e25de18c0743f1ef4981fa.json +++ b/.sqlx/query-df019a10425aff055eb1a0256969cdc902fe170a67e25de18c0743f1ef4981fa.json @@ -6,7 +6,8 @@ { "ordinal": 0, "name": "state!", - "type_info": "Text" + "type_info": "Text", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-e7a5f2b6c1fe528b50d8fad456f16d53ef5ec74e1e797250141dc2eaef7f493a.json b/.sqlx/query-e7a5f2b6c1fe528b50d8fad456f16d53ef5ec74e1e797250141dc2eaef7f493a.json index 49f225a..870960f 100644 --- a/.sqlx/query-e7a5f2b6c1fe528b50d8fad456f16d53ef5ec74e1e797250141dc2eaef7f493a.json +++ b/.sqlx/query-e7a5f2b6c1fe528b50d8fad456f16d53ef5ec74e1e797250141dc2eaef7f493a.json @@ -6,7 +6,8 @@ { "ordinal": 0, "name": "state!", - "type_info": "Bool" + "type_info": "Bool", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-ed078b499703e5cc048730b948acf6b0a9e690fe51f5886b99cf6a5ee0ff5e75.json b/.sqlx/query-ed078b499703e5cc048730b948acf6b0a9e690fe51f5886b99cf6a5ee0ff5e75.json index 63c12b2..34bdf92 100644 --- a/.sqlx/query-ed078b499703e5cc048730b948acf6b0a9e690fe51f5886b99cf6a5ee0ff5e75.json +++ b/.sqlx/query-ed078b499703e5cc048730b948acf6b0a9e690fe51f5886b99cf6a5ee0ff5e75.json @@ -11,4 +11,4 @@ "nullable": [] }, "hash": "ed078b499703e5cc048730b948acf6b0a9e690fe51f5886b99cf6a5ee0ff5e75" -} \ No newline at end of file +} diff --git a/.sqlx/query-f0fd494f64d8b26d4d87690558f59f91d8efe0b28c7d014c8320e973ea552dcf.json b/.sqlx/query-f0fd494f64d8b26d4d87690558f59f91d8efe0b28c7d014c8320e973ea552dcf.json index 0541d8d..c758d10 100644 --- a/.sqlx/query-f0fd494f64d8b26d4d87690558f59f91d8efe0b28c7d014c8320e973ea552dcf.json +++ b/.sqlx/query-f0fd494f64d8b26d4d87690558f59f91d8efe0b28c7d014c8320e973ea552dcf.json @@ -11,4 +11,4 @@ "nullable": [] }, "hash": "f0fd494f64d8b26d4d87690558f59f91d8efe0b28c7d014c8320e973ea552dcf" -} \ No newline at end of file +} diff --git a/.sqlx/query-f23c0ac9ee9852b2aeae68741fec83ea7820e05ee59a70817ac9ea55500ca1ba.json b/.sqlx/query-f23c0ac9ee9852b2aeae68741fec83ea7820e05ee59a70817ac9ea55500ca1ba.json index e425331..0859133 100644 --- a/.sqlx/query-f23c0ac9ee9852b2aeae68741fec83ea7820e05ee59a70817ac9ea55500ca1ba.json +++ b/.sqlx/query-f23c0ac9ee9852b2aeae68741fec83ea7820e05ee59a70817ac9ea55500ca1ba.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "last_used", - "type_info": "Timestamptz" + "type_info": "Timestamptz", + "origin": { + "Table": { + "table": "durable.wasm", + "name": "last_used" + } + } } ], "parameters": { diff --git a/.sqlx/query-f640d1e56e13001d184a4d13441dc5cd6bb5e3e24361bf22d896a412fecbbf9c.json b/.sqlx/query-f640d1e56e13001d184a4d13441dc5cd6bb5e3e24361bf22d896a412fecbbf9c.json index 3b6c3fc..2abccd9 100644 --- a/.sqlx/query-f640d1e56e13001d184a4d13441dc5cd6bb5e3e24361bf22d896a412fecbbf9c.json +++ b/.sqlx/query-f640d1e56e13001d184a4d13441dc5cd6bb5e3e24361bf22d896a412fecbbf9c.json @@ -13,4 +13,4 @@ "nullable": [] }, "hash": "f640d1e56e13001d184a4d13441dc5cd6bb5e3e24361bf22d896a412fecbbf9c" -} \ No newline at end of file +} diff --git a/.sqlx/query-fba8b548ce5922b59916c3801602c9c657ede5cb2dd677fa2d89755a011cea46.json b/.sqlx/query-fba8b548ce5922b59916c3801602c9c657ede5cb2dd677fa2d89755a011cea46.json index 7670eea..bb061af 100644 --- a/.sqlx/query-fba8b548ce5922b59916c3801602c9c657ede5cb2dd677fa2d89755a011cea46.json +++ b/.sqlx/query-fba8b548ce5922b59916c3801602c9c657ede5cb2dd677fa2d89755a011cea46.json @@ -6,17 +6,30 @@ { "ordinal": 0, "name": "index", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "durable.event", + "name": "index" + } + } }, { "ordinal": 1, "name": "label", - "type_info": "Text" + "type_info": "Text", + "origin": { + "Table": { + "table": "durable.event", + "name": "label" + } + } }, { "ordinal": 2, "name": "value!", - "type_info": "Text" + "type_info": "Text", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-fef563a3e3a6e8c1a8386e17003626eb8dc9ebb07cd563b2681b106e6fa74596.json b/.sqlx/query-fef563a3e3a6e8c1a8386e17003626eb8dc9ebb07cd563b2681b106e6fa74596.json index 203980b..a0072b5 100644 --- a/.sqlx/query-fef563a3e3a6e8c1a8386e17003626eb8dc9ebb07cd563b2681b106e6fa74596.json +++ b/.sqlx/query-fef563a3e3a6e8c1a8386e17003626eb8dc9ebb07cd563b2681b106e6fa74596.json @@ -12,4 +12,4 @@ "nullable": [] }, "hash": "fef563a3e3a6e8c1a8386e17003626eb8dc9ebb07cd563b2681b106e6fa74596" -} \ No newline at end of file +} diff --git a/crates/durable-sqlx/src/lib.rs b/crates/durable-sqlx/src/lib.rs index d5edb78..e6a6826 100644 --- a/crates/durable-sqlx/src/lib.rs +++ b/crates/durable-sqlx/src/lib.rs @@ -63,6 +63,10 @@ pub mod types { #[doc(inline)] pub use crate::driver::Connection; pub use crate::error::Error; +/// Re-exported from sqlx for use with the [`query`]-family helpers, which take +/// an `impl SqlSafeStr`. Dynamic SQL strings must be wrapped in +/// [`AssertSqlSafe`] after auditing them for injection vulnerabilities. +pub use sqlx::{AssertSqlSafe, SqlSafeStr, SqlStr}; pub type Result = std::result::Result; @@ -116,7 +120,8 @@ where /// // DO NOT DO THIS unless you're ABSOLUTELY CERTAIN it's what you need! /// let query = format!("SELECT * FROM articles WHERE content LIKE '%{user_input}%'"); /// // where `conn` is some type that implements `Executor`. -/// let results = durable::sqlx::query(&query).fetch_all(&mut conn)?; +/// let results = +/// durable::sqlx::query(durable::sqlx::AssertSqlSafe(query)).fetch_all(&mut conn)?; /// # Ok(()) /// # } /// ``` From 275d8a6d3d3730129b7a274e9679b09b1671ddbe Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 10 Jun 2026 08:54:43 +0000 Subject: [PATCH 4/4] style: fix import ordering and doctest line wrap (nightly rustfmt) Order the external sqlx re-export before the crate-local ones per group_imports, and keep the doctest statement on a single line. Verified with nightly rustfmt matching CI. https://claude.ai/code/session_01KN3PaeQ1pFq1B3uReMqHjp --- crates/durable-sqlx/src/lib.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/durable-sqlx/src/lib.rs b/crates/durable-sqlx/src/lib.rs index e6a6826..9bcf633 100644 --- a/crates/durable-sqlx/src/lib.rs +++ b/crates/durable-sqlx/src/lib.rs @@ -60,14 +60,15 @@ pub mod types { pub use sqlx::types::{Json, JsonRawValue}; } -#[doc(inline)] -pub use crate::driver::Connection; -pub use crate::error::Error; /// Re-exported from sqlx for use with the [`query`]-family helpers, which take /// an `impl SqlSafeStr`. Dynamic SQL strings must be wrapped in /// [`AssertSqlSafe`] after auditing them for injection vulnerabilities. pub use sqlx::{AssertSqlSafe, SqlSafeStr, SqlStr}; +#[doc(inline)] +pub use crate::driver::Connection; +pub use crate::error::Error; + pub type Result = std::result::Result; /// Run a durable transaction with a database transaction. @@ -120,8 +121,7 @@ where /// // DO NOT DO THIS unless you're ABSOLUTELY CERTAIN it's what you need! /// let query = format!("SELECT * FROM articles WHERE content LIKE '%{user_input}%'"); /// // where `conn` is some type that implements `Executor`. -/// let results = -/// durable::sqlx::query(durable::sqlx::AssertSqlSafe(query)).fetch_all(&mut conn)?; +/// let results = durable::sqlx::query(durable::sqlx::AssertSqlSafe(query)).fetch_all(&mut conn)?; /// # Ok(()) /// # } /// ```