Files
Modrinth-plus/packages/sqlx-tracing/src/any_connection.rs
aecsocket e57c15b3ce Add SQLx operation tracing (#5223)
* wip: vendor sqlx-tracing

* (compiles) standardize pg types used

* more standardization

* general log message improvements

* wip: improve sqlx-tracing architecture

* unify sqlx::Executor type

* wip: try fix sqlx tracing

* wip: sqlx-tracing compiles

* so close

* it compiles

* fix ci
2026-01-28 13:38:57 +00:00

104 lines
2.9 KiB
Rust

use crate::{AnyConnection, Database};
impl<'c, 's, DB> sqlx::Executor<'s> for &'s mut AnyConnection<'c, DB>
where
DB: Database,
// I attempted to have `DB::ConnectionRef<'c>` unify to `&'c mut DB::Connection`.
// This *can* be unified apparently, but we can't actually use the fact that
// `DB::ConnectionRef<'c>: sqlx::Executor` if we do this.
// So, we need a casting function in `crate::Database`.
// Maybe this can be revisited sometime to not require the casting fn.
//
// for<'a> DB: Database<ConnectionRef<'a> = &'a mut <DB as sqlx::Database>::Connection>,
{
type Database = DB;
fn fetch_many<'e, 'q: 'e, E>(
self,
query: E,
) -> futures::stream::BoxStream<
'e,
Result<
sqlx::Either<
<Self::Database as sqlx::Database>::QueryResult,
<Self::Database as sqlx::Database>::Row,
>,
sqlx::Error,
>,
>
where
's: 'e,
E: 'q + sqlx::Execute<'q, Self::Database>,
{
match self {
AnyConnection::Pool(pool) => {
DB::cast_connection(&mut pool.inner).fetch_many(query)
}
AnyConnection::Raw(conn) => {
DB::cast_connection(conn.inner).fetch_many(query)
}
}
}
fn fetch_optional<'e, 'q: 'e, E>(
self,
query: E,
) -> futures::future::BoxFuture<
'e,
Result<Option<<Self::Database as sqlx::Database>::Row>, sqlx::Error>,
>
where
's: 'e,
E: 'q + sqlx::Execute<'q, Self::Database>,
{
match self {
AnyConnection::Pool(pool) => {
DB::cast_connection(&mut pool.inner).fetch_optional(query)
}
AnyConnection::Raw(conn) => {
DB::cast_connection(conn.inner).fetch_optional(query)
}
}
}
fn prepare_with<'e, 'q: 'e>(
self,
sql: &'q str,
parameters: &'e [<Self::Database as sqlx::Database>::TypeInfo],
) -> futures::future::BoxFuture<
'e,
Result<<Self::Database as sqlx::Database>::Statement<'q>, sqlx::Error>,
>
where
's: 'e,
{
match self {
AnyConnection::Pool(pool) => DB::cast_connection(&mut pool.inner)
.prepare_with(sql, parameters),
AnyConnection::Raw(conn) => {
DB::cast_connection(conn.inner).prepare_with(sql, parameters)
}
}
}
fn describe<'e, 'q: 'e>(
self,
sql: &'q str,
) -> futures::future::BoxFuture<
'e,
Result<sqlx::Describe<Self::Database>, sqlx::Error>,
>
where
's: 'e,
{
match self {
AnyConnection::Pool(pool) => {
DB::cast_connection(&mut pool.inner).describe(sql)
}
AnyConnection::Raw(conn) => {
DB::cast_connection(conn.inner).describe(sql)
}
}
}
}