diff --git a/Cargo.lock b/Cargo.lock index 9b86b9c17184..646e5f46d709 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3822,9 +3822,12 @@ dependencies = [ "log", "prisma-models", "psl", + "quaint", + "query-connector", "serde", "serde-wasm-bindgen", "serde_json", + "sql-query-connector", "thiserror", "tokio", "tracing", diff --git a/query-engine/connectors/sql-query-connector/Cargo.toml b/query-engine/connectors/sql-query-connector/Cargo.toml index 62d0be640761..9ed0b4070056 100644 --- a/query-engine/connectors/sql-query-connector/Cargo.toml +++ b/query-engine/connectors/sql-query-connector/Cargo.toml @@ -5,6 +5,8 @@ version = "0.1.0" [features] vendored-openssl = ["quaint/vendored-openssl"] + +# Enable Driver Adapters driver-adapters = [] [dependencies] @@ -18,15 +20,20 @@ once_cell = "1.3" rand = "0.7" serde_json = {version = "1.0", features = ["float_roundtrip"]} thiserror = "1.0" -tokio.workspace = true +tokio = { version = "1.0", features = ["macros", "time"] } tracing = "0.1" tracing-futures = "0.2" uuid.workspace = true opentelemetry = { version = "0.17", features = ["tokio"] } tracing-opentelemetry = "0.17.3" -quaint.workspace = true cuid = { git = "https://github.com/prisma/cuid-rust", branch = "wasm32-support" } +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +quaint.workspace = true + +[target.'cfg(target_arch = "wasm32")'.dependencies] +quaint = { path = "../../../quaint" } + [dependencies.connector-interface] package = "query-connector" path = "../query-connector" diff --git a/query-engine/connectors/sql-query-connector/src/database/connection.rs b/query-engine/connectors/sql-query-connector/src/database/connection.rs index 0247e8c4b601..7895e838399a 100644 --- a/query-engine/connectors/sql-query-connector/src/database/connection.rs +++ b/query-engine/connectors/sql-query-connector/src/database/connection.rs @@ -1,3 +1,5 @@ +#![cfg_attr(target_arch = "wasm32", allow(dead_code))] + use super::{catch, transaction::SqlConnectorTransaction}; use crate::{database::operations::*, Context, SqlError}; use async_trait::async_trait; diff --git a/query-engine/connectors/sql-query-connector/src/database/mod.rs b/query-engine/connectors/sql-query-connector/src/database/mod.rs index 695db13b6620..e693769373b0 100644 --- a/query-engine/connectors/sql-query-connector/src/database/mod.rs +++ b/query-engine/connectors/sql-query-connector/src/database/mod.rs @@ -1,12 +1,16 @@ mod connection; #[cfg(feature = "driver-adapters")] mod js; -mod mssql; -mod mysql; -mod postgresql; -mod sqlite; mod transaction; +#[cfg(not(target_arch = "wasm32"))] +pub(crate) mod native { + pub(crate) mod mssql; + pub(crate) mod mysql; + pub(crate) mod postgresql; + pub(crate) mod sqlite; +} + pub(crate) mod operations; use async_trait::async_trait; @@ -14,10 +18,9 @@ use connector_interface::{error::ConnectorError, Connector}; #[cfg(feature = "driver-adapters")] pub use js::*; -pub use mssql::*; -pub use mysql::*; -pub use postgresql::*; -pub use sqlite::*; + +#[cfg(not(target_arch = "wasm32"))] +pub use native::{mssql::*, mysql::*, postgresql::*, sqlite::*}; #[async_trait] pub trait FromSource { diff --git a/query-engine/connectors/sql-query-connector/src/database/mssql.rs b/query-engine/connectors/sql-query-connector/src/database/native/mssql.rs similarity index 94% rename from query-engine/connectors/sql-query-connector/src/database/mssql.rs rename to query-engine/connectors/sql-query-connector/src/database/native/mssql.rs index 9655d205e4ca..19d3580bba9f 100644 --- a/query-engine/connectors/sql-query-connector/src/database/mssql.rs +++ b/query-engine/connectors/sql-query-connector/src/database/native/mssql.rs @@ -1,4 +1,4 @@ -use super::connection::SqlConnection; +use crate::database::{catch, connection::SqlConnection}; use crate::{FromSource, SqlError}; use async_trait::async_trait; use connector_interface::{ @@ -60,7 +60,7 @@ impl FromSource for Mssql { #[async_trait] impl Connector for Mssql { async fn get_connection<'a>(&'a self) -> connector::Result> { - super::catch(self.connection_info.clone(), async move { + catch(self.connection_info.clone(), async move { let conn = self.pool.check_out().await.map_err(SqlError::from)?; let conn = SqlConnection::new(conn, &self.connection_info, self.features); diff --git a/query-engine/connectors/sql-query-connector/src/database/mysql.rs b/query-engine/connectors/sql-query-connector/src/database/native/mysql.rs similarity index 95% rename from query-engine/connectors/sql-query-connector/src/database/mysql.rs rename to query-engine/connectors/sql-query-connector/src/database/native/mysql.rs index deb3e6a4f35f..477d687b995b 100644 --- a/query-engine/connectors/sql-query-connector/src/database/mysql.rs +++ b/query-engine/connectors/sql-query-connector/src/database/native/mysql.rs @@ -1,4 +1,4 @@ -use super::connection::SqlConnection; +use crate::database::{catch, connection::SqlConnection}; use crate::{FromSource, SqlError}; use async_trait::async_trait; use connector_interface::{ @@ -65,7 +65,7 @@ impl FromSource for Mysql { #[async_trait] impl Connector for Mysql { async fn get_connection<'a>(&'a self) -> connector::Result> { - super::catch(self.connection_info.clone(), async move { + catch(self.connection_info.clone(), async move { let runtime_conn = self.pool.check_out().await?; // Note: `runtime_conn` must be `Sized`, as that's required by `TransactionCapable` diff --git a/query-engine/connectors/sql-query-connector/src/database/postgresql.rs b/query-engine/connectors/sql-query-connector/src/database/native/postgresql.rs similarity index 95% rename from query-engine/connectors/sql-query-connector/src/database/postgresql.rs rename to query-engine/connectors/sql-query-connector/src/database/native/postgresql.rs index 242b2b63090e..0e49a1de8bbd 100644 --- a/query-engine/connectors/sql-query-connector/src/database/postgresql.rs +++ b/query-engine/connectors/sql-query-connector/src/database/native/postgresql.rs @@ -1,4 +1,4 @@ -use super::connection::SqlConnection; +use crate::database::{catch, connection::SqlConnection}; use crate::{FromSource, SqlError}; use async_trait::async_trait; use connector_interface::{ @@ -67,7 +67,7 @@ impl FromSource for PostgreSql { #[async_trait] impl Connector for PostgreSql { async fn get_connection<'a>(&'a self) -> connector_interface::Result> { - super::catch(self.connection_info.clone(), async move { + catch(self.connection_info.clone(), async move { let conn = self.pool.check_out().await.map_err(SqlError::from)?; let conn = SqlConnection::new(conn, &self.connection_info, self.features); Ok(Box::new(conn) as Box) diff --git a/query-engine/connectors/sql-query-connector/src/database/sqlite.rs b/query-engine/connectors/sql-query-connector/src/database/native/sqlite.rs similarity index 96% rename from query-engine/connectors/sql-query-connector/src/database/sqlite.rs rename to query-engine/connectors/sql-query-connector/src/database/native/sqlite.rs index 6be9faeac54d..e38bccb861f4 100644 --- a/query-engine/connectors/sql-query-connector/src/database/sqlite.rs +++ b/query-engine/connectors/sql-query-connector/src/database/native/sqlite.rs @@ -1,4 +1,4 @@ -use super::connection::SqlConnection; +use crate::database::{catch, connection::SqlConnection}; use crate::{FromSource, SqlError}; use async_trait::async_trait; use connector_interface::{ @@ -80,7 +80,7 @@ fn invalid_file_path_error(file_path: &str, connection_info: &ConnectionInfo) -> #[async_trait] impl Connector for Sqlite { async fn get_connection<'a>(&'a self) -> connector::Result> { - super::catch(self.connection_info().clone(), async move { + catch(self.connection_info().clone(), async move { let conn = self.pool.check_out().await.map_err(SqlError::from)?; let conn = SqlConnection::new(conn, self.connection_info(), self.features); diff --git a/query-engine/connectors/sql-query-connector/src/database/operations/write.rs b/query-engine/connectors/sql-query-connector/src/database/operations/write.rs index 425f4ac1d4b3..611557c4f3ba 100644 --- a/query-engine/connectors/sql-query-connector/src/database/operations/write.rs +++ b/query-engine/connectors/sql-query-connector/src/database/operations/write.rs @@ -18,9 +18,28 @@ use std::{ ops::Deref, usize, }; -use tracing::log::trace; use user_facing_errors::query_engine::DatabaseConstraint; +#[cfg(target_arch = "wasm32")] +macro_rules! trace { + (target: $target:expr, $($arg:tt)+) => {{ + // No-op in WebAssembly + }}; + ($($arg:tt)+) => {{ + // No-op in WebAssembly + }}; +} + +#[cfg(not(target_arch = "wasm32"))] +macro_rules! trace { + (target: $target:expr, $($arg:tt)+) => { + tracing::log::trace!(target: $target, $($arg)+); + }; + ($($arg:tt)+) => { + tracing::log::trace!($($arg)+); + }; +} + async fn generate_id( conn: &dyn Queryable, id_field: &FieldSelection, diff --git a/query-engine/connectors/sql-query-connector/src/lib.rs b/query-engine/connectors/sql-query-connector/src/lib.rs index ed1528ded6b5..74c0a4aab5d3 100644 --- a/query-engine/connectors/sql-query-connector/src/lib.rs +++ b/query-engine/connectors/sql-query-connector/src/lib.rs @@ -22,9 +22,12 @@ mod value_ext; use self::{column_metadata::*, context::Context, query_ext::QueryExt, row::*}; use quaint::prelude::Queryable; +pub use database::FromSource; #[cfg(feature = "driver-adapters")] pub use database::{activate_driver_adapter, Js}; -pub use database::{FromSource, Mssql, Mysql, PostgreSql, Sqlite}; pub use error::SqlError; +#[cfg(not(target_arch = "wasm32"))] +pub use database::{Mssql, Mysql, PostgreSql, Sqlite}; + type Result = std::result::Result; diff --git a/query-engine/query-engine-wasm/Cargo.toml b/query-engine/query-engine-wasm/Cargo.toml index 148079f4b380..34ef69df467d 100644 --- a/query-engine/query-engine-wasm/Cargo.toml +++ b/query-engine/query-engine-wasm/Cargo.toml @@ -14,6 +14,9 @@ async-trait = "0.1" user-facing-errors = { path = "../../libs/user-facing-errors" } psl.workspace = true prisma-models = { path = "../prisma-models" } +quaint = { path = "../../quaint" } +connector = { path = "../connectors/query-connector", package = "query-connector" } +sql-query-connector = { path = "../connectors/sql-query-connector" } thiserror = "1" connection-string.workspace = true diff --git a/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/mssql.rs b/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/mssql.rs index 18a0b8e94b3c..51a8f5ef54be 100644 --- a/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/mssql.rs +++ b/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/mssql.rs @@ -23,7 +23,7 @@ impl SqlSchemaCalculatorFlavour for MssqlFlavour { } } - fn push_connector_data(&self, context: &mut super::super::Context<'_>) { + fn push_connector_data(&self, context: &mut crate::sql_schema_calculator::Context<'_>) { let mut data = MssqlSchemaExt::default(); for model in context.datamodel.db.walk_models() { diff --git a/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/postgres.rs b/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/postgres.rs index 40577d68a35d..656fe432a970 100644 --- a/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/postgres.rs +++ b/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator/sql_schema_calculator_flavour/postgres.rs @@ -37,7 +37,7 @@ impl SqlSchemaCalculatorFlavour for PostgresFlavour { } } - fn push_connector_data(&self, context: &mut super::super::Context<'_>) { + fn push_connector_data(&self, context: &mut crate::sql_schema_calculator::Context<'_>) { let mut postgres_ext = PostgresSchemaExt::default(); let db = &context.datamodel.db;