* fix(macros): smarter `.env` loading, caching, and invalidation
* feat(mysql): test `.env` loading in CI
* feat(postgres): test `.env` loading in CI
* feat(macros): allow `DATABASE_URL` to be empty
* fix(examples/postgres): make `cargo-sqlx` executable
* fix(examples/postgres): `cargo sqlx` invocation
* feat(examples/postgres): check offline prepare on more examples
* fix(examples/postgres): the name of this step
* fix(cli): don't suppress error from `dotenv()`
* fix(ci/examples/postgres): don't use heredoc in this step
* fix(ci/examples/postgres): multi-tenant
* fix(ci/examples/sqlite): test `.env` loading
* chore: add CHANGELOG entry
* build TlsConnector in blocking threadpool
The openssl TlsConnector synchronously loads certificates from files.
Loading these files can block for tens of milliseconds.
* Update sqlx-core/src/net/tls/tls_native_tls.rs
---------
Co-authored-by: David Übler <david.uebler@puzzleyou.de>
Co-authored-by: Austin Bonander <austin.bonander@gmail.com>
* chore(sqlx-postgres): fix typo in `migrate.rs` comment
* feat(sqlite): support `no_tx` migrations
SQLite includes several SQL statements that are useful during migrations but
must be executed outside of a transaction to take effect, such as `PRAGMA
foreign_keys = ON|OFF` or `VACUUM`. Additionally, advanced migrations may want
more precise control over how statements are grouped into transactions or
savepoints to achieve the desired atomicity for different parts of the
migration.
While SQLx already supports marking migrations to run outside explicit
transactions through a `-- no-transaction` comment, this feature is currently
only available for `PgConnection`'s `Migrate` implementation, leaving SQLite and
MySQL without this capability. Although it's possible to work around this
limitation by implementing custom migration logic instead of executing
`Migrator#run`, this comes at a cost of significantly reduced developer
ergonomics: code that relies on the default migration logic, such as
`#[sqlx::test]` or `cargo sqlx database setup`, won't support these migrations.
These changes extend `SqliteConnection`'s `Migrate` implementation to support
`no_tx` migrations in the same way as PostgreSQL, addressing this feature gap. I
also considered implementing the same functionality for MySQL, but since I
haven't found a practical use case for it yet, and every
non-transaction-friendly statement I could think about in MySQL triggers
implicit commits anyway, I determined it wasn't necessary at this time and could
be considered an overreach.
* test(sqlite): add test for `no_tx` migrations
* chore(sqlx-sqlite): bring back useful comment
* chore(sqlx-sqlite): unify SQL dialect in annotation comments
* restore fallback to `async-io` for `connect_tcp()` when `runtime-tokio` feature is enabled
* `smol` and `async-global-executor` both use `async-task`, so `JoinHandle` impls can be consolidated
* no need for duplicate `yield_now()` impls
* delete `impl Socket for ()`
* Yield while salting password for PG SASL
To prevent spenting too much time doing synchronous work on the
event loop, we yield every few iterations of the hmac-sha256.
* Remove unused bench
Once a connection to the database is lost all future macro evaluations
will fail. This is fine for normal compilation since it tends to be
short but causes issues with rust-analyzer since it keeps the macro
binaries loaded for a long time.
This commit changes the macro implementation to drop the cached
connection when it encounters an IO or protocol error. In practice these
seem to be the errors that show up when the connection is lost and
dumping the connection on every error would have unnecessary overhead.
* sqlx-postgres(tests): fix positive_int domain type
* sqlx-postgres(tests): Update no pg array test
* sqlx-core: Remove conflicting Type impl for Box<JsonRawValue>
* Add support for `Box<JsonRawValue>` types.
This allows keeping structs that implement FromRow lifetime-free,
previously you had to use `&'a JsonRawValue`.
```rust
struct Foo {
bar: Box<JsonRawValue>,
}
```
* Add Encode impls for `JsonRawValue`.