Remove unused SQLx macro facade
Depend directly on sqlx-core-oldapi and use its module-level runtime APIs. SQLPage uses no SQLx query or derive macros, so this removes sqlx-oldapi and sqlx-macros-oldapi from the resolved graph. macOS arm64 cargo build --release: 43,037,040 -> 43,020,288 bytes (-16,752 bytes, -0.04%).
This commit is contained in:
Generated
+1
-31
@@ -4624,7 +4624,7 @@ dependencies = [
|
||||
"serde_json",
|
||||
"sha2 0.11.0",
|
||||
"sqlparser",
|
||||
"sqlx-oldapi",
|
||||
"sqlx-core-oldapi",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
"tokio-util",
|
||||
@@ -4719,36 +4719,6 @@ dependencies = [
|
||||
"whoami",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-macros-oldapi"
|
||||
version = "0.6.56"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "adbf4ebc08c19991fa51993f471e572930c4dec146d3dc915a8e54db91d624c6"
|
||||
dependencies = [
|
||||
"dotenvy",
|
||||
"either",
|
||||
"heck",
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"serde_json",
|
||||
"sha2 0.11.0",
|
||||
"sqlx-core-oldapi",
|
||||
"sqlx-rt-oldapi",
|
||||
"syn",
|
||||
"url",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-oldapi"
|
||||
version = "0.6.56"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c9ba4d352504ee1a0a76eb052879d68ba63536c738da5062026ac0d3dc724c7"
|
||||
dependencies = [
|
||||
"sqlx-core-oldapi",
|
||||
"sqlx-macros-oldapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-rt-oldapi"
|
||||
version = "0.6.56"
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ panic = "abort"
|
||||
codegen-units = 2
|
||||
|
||||
[dependencies]
|
||||
sqlx = { package = "sqlx-oldapi", version = "0.6.56", default-features = false, features = [
|
||||
sqlx = { package = "sqlx-core-oldapi", version = "0.6.56", default-features = false, features = [
|
||||
"any",
|
||||
"runtime-tokio-rustls",
|
||||
"migrate",
|
||||
|
||||
+4
-3
@@ -5,8 +5,9 @@ use crate::{AppState, TEMPLATES_DIR};
|
||||
use anyhow::Context;
|
||||
use chrono::{DateTime, Utc};
|
||||
use sqlx::any::{AnyStatement, AnyTypeInfo};
|
||||
use sqlx::executor::Executor;
|
||||
use sqlx::postgres::types::PgTimeTz;
|
||||
use sqlx::{Executor, Postgres, Statement, Type};
|
||||
use sqlx::{postgres::Postgres, statement::Statement, types::Type};
|
||||
use std::fmt::Write;
|
||||
use std::io::ErrorKind;
|
||||
use std::path::{Component, Path, PathBuf};
|
||||
@@ -429,7 +430,7 @@ impl DbFsQueries {
|
||||
#[actix_web::test]
|
||||
async fn test_sql_file_read_utf8() -> anyhow::Result<()> {
|
||||
use crate::app_config;
|
||||
use sqlx::Executor;
|
||||
use sqlx::executor::Executor;
|
||||
let config = app_config::tests::test_config();
|
||||
let state = AppState::init(&config).await?;
|
||||
|
||||
@@ -463,7 +464,7 @@ async fn test_sql_file_read_utf8() -> anyhow::Result<()> {
|
||||
make_placeholder(dbms, 1),
|
||||
make_placeholder(dbms, 2)
|
||||
);
|
||||
sqlx::query(&insert_sql)
|
||||
sqlx::query::query(&insert_sql)
|
||||
.bind("unit test file.txt")
|
||||
.bind("Héllö world! 😀".as_bytes())
|
||||
.execute(conn)
|
||||
|
||||
@@ -2,7 +2,7 @@ use opentelemetry::global;
|
||||
use opentelemetry::metrics::{Histogram, ObservableGauge};
|
||||
use opentelemetry_semantic_conventions::attribute as otel;
|
||||
use opentelemetry_semantic_conventions::metric as otel_metric;
|
||||
use sqlx::AnyPool;
|
||||
use sqlx::any::AnyPool;
|
||||
|
||||
pub struct TelemetryMetrics {
|
||||
pub http_request_duration: Histogram<f64>,
|
||||
|
||||
@@ -8,9 +8,10 @@ use crate::{
|
||||
};
|
||||
use anyhow::Context;
|
||||
use futures_util::future::BoxFuture;
|
||||
use sqlx::connection::{ConnectOptions, Connection};
|
||||
use sqlx::executor::Executor;
|
||||
use sqlx::odbc::OdbcConnectOptions;
|
||||
use sqlx::{
|
||||
ConnectOptions, Connection, Executor,
|
||||
any::{Any, AnyConnectOptions, AnyConnection, AnyKind},
|
||||
pool::PoolOptions,
|
||||
sqlite::{Function, SqliteConnectOptions, SqliteFunctionCtx},
|
||||
@@ -146,11 +147,11 @@ fn add_on_return_to_pool(config: &AppConfig, pool_options: PoolOptions<Any>) ->
|
||||
}
|
||||
|
||||
fn on_return_to_pool(
|
||||
conn: &mut sqlx::AnyConnection,
|
||||
conn: &mut sqlx::any::AnyConnection,
|
||||
meta: sqlx::pool::PoolConnectionMetadata,
|
||||
sql: std::sync::Arc<String>,
|
||||
) -> BoxFuture<'_, Result<bool, sqlx::Error>> {
|
||||
use sqlx::Row;
|
||||
) -> BoxFuture<'_, Result<bool, sqlx::error::Error>> {
|
||||
use sqlx::row::Row;
|
||||
Box::pin(async move {
|
||||
log::trace!("Running the custom SQL connection cleanup handler. {meta:?}");
|
||||
let query_result = conn.fetch_optional(sql.as_str()).await?;
|
||||
|
||||
@@ -5,10 +5,10 @@ use futures_util::StreamExt;
|
||||
use sqlparser::ast::{
|
||||
CopyLegacyCsvOption, CopyLegacyOption, CopyOption, CopySource, CopyTarget, Statement,
|
||||
};
|
||||
use sqlx::{
|
||||
AnyConnection, Arguments, Executor, PgConnection,
|
||||
any::{AnyArguments, AnyConnectionKind, AnyKind},
|
||||
};
|
||||
use sqlx::any::{AnyArguments, AnyConnection, AnyConnectionKind, AnyKind};
|
||||
use sqlx::arguments::Arguments;
|
||||
use sqlx::executor::Executor;
|
||||
use sqlx::postgres::PgConnection;
|
||||
use tokio::io::AsyncRead;
|
||||
|
||||
use crate::webserver::http_request_info::RequestInfo;
|
||||
@@ -337,7 +337,7 @@ fn test_make_statement() {
|
||||
|
||||
#[actix_web::test]
|
||||
async fn test_end_to_end() {
|
||||
use sqlx::ConnectOptions;
|
||||
use sqlx::connection::ConnectOptions;
|
||||
|
||||
let mut copy_stmt = sqlparser::parser::Parser::parse_sql(
|
||||
&sqlparser::dialect::GenericDialect {},
|
||||
@@ -376,7 +376,7 @@ async fn test_end_to_end() {
|
||||
run_csv_import_insert(&mut conn, &csv_import, file)
|
||||
.await
|
||||
.unwrap();
|
||||
let rows: Vec<(String, String)> = sqlx::query_as("SELECT * FROM my_table")
|
||||
let rows: Vec<(String, String)> = sqlx::query_as::query_as("SELECT * FROM my_table")
|
||||
.fetch_all(&mut conn)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
@@ -21,13 +21,19 @@ use crate::webserver::http_request_info::ExecutionContext;
|
||||
use crate::webserver::single_or_vec::SingleOrVec;
|
||||
|
||||
use super::{Database, DbItem, ScalarSubqueryBehavior, error_highlighting::display_db_error};
|
||||
use sqlx::any::{AnyArguments, AnyQueryResult, AnyRow, AnyStatement, AnyTypeInfo};
|
||||
use sqlx::pool::PoolConnection;
|
||||
use sqlx::{
|
||||
Any, AnyConnection, Arguments, Column, Either, Executor, Row as _, Statement, ValueRef,
|
||||
use sqlx::Either;
|
||||
use sqlx::any::{
|
||||
Any, AnyArguments, AnyConnection, AnyQueryResult, AnyRow, AnyStatement, AnyTypeInfo,
|
||||
};
|
||||
use sqlx::arguments::Arguments;
|
||||
use sqlx::column::Column;
|
||||
use sqlx::executor::{Execute, Executor};
|
||||
use sqlx::pool::PoolConnection;
|
||||
use sqlx::row::Row as _;
|
||||
use sqlx::statement::Statement;
|
||||
use sqlx::value::ValueRef;
|
||||
|
||||
pub type DbConn = Option<PoolConnection<sqlx::Any>>;
|
||||
pub type DbConn = Option<PoolConnection<Any>>;
|
||||
|
||||
/// One database result together with private values reserved for computed
|
||||
/// columns and therefore omitted from the user-visible row.
|
||||
@@ -538,7 +544,7 @@ async fn take_connection<'a>(
|
||||
db: &'a Database,
|
||||
conn: &'a mut DbConn,
|
||||
request: &ExecutionContext,
|
||||
) -> anyhow::Result<&'a mut PoolConnection<sqlx::Any>> {
|
||||
) -> anyhow::Result<&'a mut PoolConnection<Any>> {
|
||||
if let Some(c) = conn {
|
||||
return Ok(c);
|
||||
}
|
||||
@@ -609,7 +615,7 @@ fn parse_single_sql_result(
|
||||
source_file: &Path,
|
||||
query: &DatabaseQuery,
|
||||
source_span: SourceSpan,
|
||||
res: sqlx::Result<Either<AnyQueryResult, AnyRow>>,
|
||||
res: sqlx::error::Result<Either<AnyQueryResult, AnyRow>>,
|
||||
) -> QueryResult {
|
||||
match res {
|
||||
Ok(Either::Right(r)) => {
|
||||
@@ -790,7 +796,7 @@ pub struct BoundQuery<'a> {
|
||||
param_values: Vec<Option<String>>,
|
||||
}
|
||||
|
||||
impl<'q> sqlx::Execute<'q, Any> for BoundQuery<'q> {
|
||||
impl<'q> Execute<'q, Any> for BoundQuery<'q> {
|
||||
fn sql(&self) -> &'q str {
|
||||
self.sql
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ impl From<AnyKind> for SupportedDatabase {
|
||||
}
|
||||
|
||||
pub struct Database {
|
||||
pub connection: sqlx::AnyPool,
|
||||
pub connection: sqlx::any::AnyPool,
|
||||
pub info: DbInfo,
|
||||
}
|
||||
|
||||
|
||||
@@ -21,10 +21,14 @@ use bigdecimal::BigDecimal;
|
||||
use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime};
|
||||
use serde_json::{self, Map, Value};
|
||||
use sqlx::any::{AnyColumn, AnyRow, AnyTypeInfo, AnyTypeInfoKind};
|
||||
use sqlx::column::Column;
|
||||
use sqlx::decode::Decode;
|
||||
use sqlx::postgres::PgValueRef;
|
||||
use sqlx::postgres::types::PgRange;
|
||||
use sqlx::{Column, Row, TypeInfo, ValueRef};
|
||||
use sqlx::{Decode, Type};
|
||||
use sqlx::row::Row;
|
||||
use sqlx::type_info::TypeInfo;
|
||||
use sqlx::types::Type;
|
||||
use sqlx::value::ValueRef;
|
||||
|
||||
#[cfg(test)]
|
||||
pub fn row_to_json(row: &AnyRow) -> Value {
|
||||
@@ -118,13 +122,13 @@ fn decode_pg_range<'r, T>(raw_value: sqlx::any::AnyValueRef<'r>) -> Value
|
||||
where
|
||||
T: std::fmt::Display
|
||||
+ Type<sqlx::postgres::Postgres>
|
||||
+ for<'a> sqlx::Decode<'a, sqlx::postgres::Postgres>,
|
||||
+ for<'a> sqlx::decode::Decode<'a, sqlx::postgres::Postgres>,
|
||||
{
|
||||
let Ok(pg_val): Result<PgValueRef<'r>, _> = raw_value.try_into() else {
|
||||
log::error!("Only postgres range values are supported");
|
||||
return Value::Null;
|
||||
};
|
||||
match <PgRange<T> as sqlx::Decode<'r, sqlx::postgres::Postgres>>::decode(pg_val) {
|
||||
match <PgRange<T> as sqlx::decode::Decode<'r, sqlx::postgres::Postgres>>::decode(pg_val) {
|
||||
Ok(pg_range) => pg_range.to_string().into(),
|
||||
Err(e) => {
|
||||
log::error!("Failed to decode postgres range value: {e}");
|
||||
@@ -205,7 +209,7 @@ mod tests {
|
||||
use crate::app_config::tests::test_database_url;
|
||||
|
||||
use super::*;
|
||||
use sqlx::Connection;
|
||||
use sqlx::connection::Connection;
|
||||
|
||||
fn setup_logging() {
|
||||
crate::telemetry::init_test_logging();
|
||||
@@ -224,10 +228,10 @@ mod tests {
|
||||
|
||||
#[actix_web::test]
|
||||
async fn test_row_to_json() -> anyhow::Result<()> {
|
||||
use sqlx::Connection;
|
||||
use sqlx::connection::Connection;
|
||||
let db_url = test_database_url();
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query(
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query::query(
|
||||
"SELECT
|
||||
123.456 as one_value,
|
||||
1 as two_values,
|
||||
@@ -253,8 +257,8 @@ mod tests {
|
||||
#[actix_web::test]
|
||||
async fn private_inputs_are_split_from_the_trailing_suffix() -> anyhow::Result<()> {
|
||||
let db_url = test_database_url();
|
||||
let mut connection = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query(
|
||||
let mut connection = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query::query(
|
||||
"SELECT 'public' AS \"__sqlpage_input_0\", 'private' AS \"__sqlpage_input_0\"",
|
||||
)
|
||||
.fetch_one(&mut connection)
|
||||
@@ -273,8 +277,8 @@ mod tests {
|
||||
let Some(db_url) = db_specific_test("postgres") else {
|
||||
return Ok(());
|
||||
};
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query(
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query::query(
|
||||
"SELECT
|
||||
42::INT2 as small_int,
|
||||
42::INT4 as integer,
|
||||
@@ -350,8 +354,8 @@ mod tests {
|
||||
let Some(db_url) = db_specific_test("postgres") else {
|
||||
return Ok(());
|
||||
};
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query(
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query::query(
|
||||
"SELECT
|
||||
'2024-03-14'::DATE as date,
|
||||
'13:14:15'::TIME as time,
|
||||
@@ -388,8 +392,8 @@ mod tests {
|
||||
let Some(db_url) = db_specific_test("postgres") else {
|
||||
return Ok(());
|
||||
};
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query(
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query::query(
|
||||
"SELECT
|
||||
'[1,5)'::INT4RANGE as int4range,
|
||||
'[2024-11-12 01:02:03,2024-11-12 23:00:00)'::TSRANGE as tsrange,
|
||||
@@ -419,9 +423,9 @@ mod tests {
|
||||
let Some(db_url) = db_url else {
|
||||
return Ok(());
|
||||
};
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
|
||||
sqlx::query(
|
||||
sqlx::query::query(
|
||||
"CREATE TEMPORARY TABLE _sqlp_t (
|
||||
tiny_int TINYINT,
|
||||
small_int SMALLINT,
|
||||
@@ -475,7 +479,7 @@ mod tests {
|
||||
.execute(&mut c)
|
||||
.await?;
|
||||
|
||||
let row = sqlx::query("SELECT * FROM _sqlp_t")
|
||||
let row = sqlx::query::query("SELECT * FROM _sqlp_t")
|
||||
.fetch_one(&mut c)
|
||||
.await?;
|
||||
|
||||
@@ -508,7 +512,9 @@ mod tests {
|
||||
}),
|
||||
);
|
||||
|
||||
sqlx::query("DROP TABLE _sqlp_t").execute(&mut c).await?;
|
||||
sqlx::query::query("DROP TABLE _sqlp_t")
|
||||
.execute(&mut c)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -518,8 +524,8 @@ mod tests {
|
||||
let Some(db_url) = db_specific_test("sqlite") else {
|
||||
return Ok(());
|
||||
};
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query(
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query::query(
|
||||
"SELECT
|
||||
42 as integer,
|
||||
42.25 as real,
|
||||
@@ -546,8 +552,8 @@ mod tests {
|
||||
let Some(db_url) = db_specific_test("mssql") else {
|
||||
return Ok(());
|
||||
};
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query(
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let row = sqlx::query::query(
|
||||
"SELECT
|
||||
CAST(1 AS BIT) as true_bit,
|
||||
CAST(0 AS BIT) as false_bit,
|
||||
@@ -639,10 +645,10 @@ mod tests {
|
||||
#[actix_web::test]
|
||||
async fn test_canonical_col_name_variations() -> anyhow::Result<()> {
|
||||
let db_url = test_database_url();
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
|
||||
// Test various column name formats to ensure canonical_col_name works correctly
|
||||
let row = sqlx::query(
|
||||
let row = sqlx::query::query(
|
||||
r#"SELECT
|
||||
42 as "UPPERCASE_COL",
|
||||
42 as "lowercase_col",
|
||||
@@ -695,11 +701,11 @@ mod tests {
|
||||
#[actix_web::test]
|
||||
async fn test_row_to_json_edge_cases() -> anyhow::Result<()> {
|
||||
let db_url = test_database_url();
|
||||
let mut c = sqlx::AnyConnection::connect(&db_url).await?;
|
||||
let mut c = sqlx::any::AnyConnection::connect(&db_url).await?;
|
||||
let dbms_name = c.dbms_name().await.expect("retrieve db name");
|
||||
|
||||
// Test edge cases for row_to_json
|
||||
let row = sqlx::query(
|
||||
let row = sqlx::query::query(
|
||||
"SELECT
|
||||
NULL as null_col,
|
||||
'' as empty_string,
|
||||
|
||||
@@ -183,7 +183,7 @@ pub(super) fn anyhow_err_to_actix_resp(e: &anyhow::Error, state: &AppState) -> H
|
||||
"Basic realm=\"Authentication required\", charset=\"UTF-8\"",
|
||||
));
|
||||
}
|
||||
} else if let Some(sqlx::Error::PoolTimedOut) = e.downcast_ref() {
|
||||
} else if let Some(sqlx::error::Error::PoolTimedOut) = e.downcast_ref() {
|
||||
use rand::RngExt;
|
||||
resp.status(StatusCode::TOO_MANY_REQUESTS).insert_header((
|
||||
header::RETRY_AFTER,
|
||||
@@ -211,7 +211,7 @@ pub(super) fn anyhow_err_to_actix_resp(e: &anyhow::Error, state: &AppState) -> H
|
||||
fn anyhow_error_status(e: &anyhow::Error) -> Option<StatusCode> {
|
||||
if let Some(&ErrorWithStatus { status }) = e.downcast_ref() {
|
||||
Some(status)
|
||||
} else if let Some(sqlx::Error::PoolTimedOut) = e.downcast_ref() {
|
||||
} else if let Some(sqlx::error::Error::PoolTimedOut) = e.downcast_ref() {
|
||||
Some(StatusCode::TOO_MANY_REQUESTS)
|
||||
} else {
|
||||
None
|
||||
|
||||
+3
-3
@@ -3,7 +3,7 @@ use sqlpage::{
|
||||
AppState,
|
||||
webserver::{self, make_placeholder},
|
||||
};
|
||||
use sqlx::Executor as _;
|
||||
use sqlx::executor::Executor as _;
|
||||
|
||||
use crate::common::{make_app_data_from_config, req_path, req_path_with_app_data, test_config};
|
||||
|
||||
@@ -79,7 +79,7 @@ async fn test_routing_with_db_fs() {
|
||||
"INSERT INTO sqlpage_files(path, contents) VALUES ('on_db.sql', {})",
|
||||
make_placeholder(state.db.info.kind, 1)
|
||||
);
|
||||
sqlx::query(&insert_sql)
|
||||
sqlx::query::query(&insert_sql)
|
||||
.bind("select ''text'' as component, ''Hi from db !'' AS contents;".as_bytes())
|
||||
.execute(&state.db.connection)
|
||||
.await
|
||||
@@ -125,7 +125,7 @@ async fn test_non_unicode_static_path_returns_bad_request_with_db_fs() {
|
||||
make_placeholder(state.db.info.kind, 1),
|
||||
make_placeholder(state.db.info.kind, 2)
|
||||
);
|
||||
sqlx::query(&insert_sql)
|
||||
sqlx::query::query(&insert_sql)
|
||||
.bind(expected_db_path)
|
||||
.bind("file from db fs".as_bytes())
|
||||
.execute(&mut *conn)
|
||||
|
||||
Reference in New Issue
Block a user