Skip to content

Commit

Permalink
feat(driver-adapters): DX & naming (#4174)
Browse files Browse the repository at this point in the history
* fix(js-connectors): [PlanetScale] enable event logs in transactions

* chore(js-connectors): [Neon / Pg] add skeleton for event logs in transactions

* chore(js-connectors): add "@prisma/client" smoke tests, fix LibraryEngine types

* feat(js-connectors): add "@prisma/client" mini test suite

* fix(js-connectors): [Neon / pg] transaction event logs

* chore(js-connectors): simplify transaction options

* chore(js-connectors): simplify startTransaction signature

* chore(js-connectors): turn smoke-test-js into an ESModule

* feat(js-connectors): use "jsConnectors" preview feature

* feat(driver-adapters): rename from js-connectors

* feat(driver-adapters): revert preview feature name change

* feat(driver-adapters): apply new DX to TypeScript packages

* feat(driver-adapters): apply new DX to smoke tests

* feat(driver-adapters): minor leftovers

* feat(driver-adapters): implement PR comments

* feat(driver-adapters): rename "@jkomyno/adapter-utils" into "@jkomyno/driver-adapter-utils"

* feat(driver-adapters): simplify tsconfig to use "moduleResolution": "Bundler", update outdated package name

* chore: update version of PlanetScale adapter

* [skip ci] chore(driver-adapters): rename "PrismaPostgres" -> "PrismaPg", bump versions

* [skip ci] chore(driver-adapters): update preview feature in schemas

* feat(driver-adapters): rename preview feature `jsConnectors` -> `driverAdapters` (#4201)

* Revert "feat(driver-adapters): revert preview feature name change"

This reverts commit 90dc3ec.

* feat(driver-adapters): update preview feature in schemas
  • Loading branch information
jkomyno authored Sep 5, 2023
1 parent 74f592b commit 3457e5d
Show file tree
Hide file tree
Showing 92 changed files with 513 additions and 713 deletions.
48 changes: 24 additions & 24 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ members = [
"query-engine/core-tests",
"query-engine/black-box-tests",
"query-engine/dmmf",
"query-engine/driver-adapters",
"query-engine/metrics",
"query-engine/js-connectors",
"query-engine/prisma-models",
"query-engine/query-engine",
"query-engine/query-engine-node-api",
Expand Down
4 changes: 2 additions & 2 deletions psl/psl-core/src/common/preview_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ features!(
NamedConstraints,
NApi,
NativeTypes,
JsConnectors,
DriverAdapters,
OrderByAggregateGroup,
OrderByNulls,
OrderByRelation,
Expand Down Expand Up @@ -124,7 +124,7 @@ pub const ALL_PREVIEW_FEATURES: FeatureMap = FeatureMap {
| UncheckedScalarInputs
}),
hidden: enumflags2::make_bitflags!(PreviewFeature::{
JsConnectors
DriverAdapters
}),
};

Expand Down
2 changes: 1 addition & 1 deletion query-engine/connectors/sql-query-connector/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ version = "0.1.0"

[features]
vendored-openssl = ["quaint/vendored-openssl"]
js-connectors = []
driver-adapters = []

[dependencies]
psl.workspace = true
Expand Down
32 changes: 16 additions & 16 deletions query-engine/connectors/sql-query-connector/src/database/js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,39 +16,39 @@ use std::{
sync::{Arc, Mutex},
};

/// Registry is the type for the global registry of Js connectors.
type Registry = HashMap<String, JsConnector>;
/// Registry is the type for the global registry of driver adapters.
type Registry = HashMap<String, DriverAdapter>;

/// REGISTRY is the global registry of JsConnectors
/// REGISTRY is the global registry of Driver Adapters.
static REGISTRY: Lazy<Mutex<Registry>> = Lazy::new(|| Mutex::new(HashMap::new()));

fn registered_js_connector(provider: &str) -> connector::Result<JsConnector> {
fn registered_driver_adapter(provider: &str) -> connector::Result<DriverAdapter> {
let lock = REGISTRY.lock().unwrap();
lock.get(provider)
.ok_or(ConnectorError::from_kind(ErrorKind::UnsupportedConnector(format!(
"A Javascript connector proxy for {} was not registered",
"A driver adapter for {} was not registered",
provider
))))
.map(|conn_ref| conn_ref.to_owned())
}

pub fn register_js_connector(provider: &str, connector: Arc<dyn TransactionCapable>) -> Result<(), String> {
pub fn register_driver_adapter(provider: &str, connector: Arc<dyn TransactionCapable>) -> Result<(), String> {
let mut lock = REGISTRY.lock().unwrap();
let entry = lock.entry(provider.to_string());
match entry {
Entry::Occupied(_) => Err(format!(
"A Javascript connector proxy for {} was already registered, and cannot be overridden.",
"A driver adapter for {} was already registered, and cannot be overridden.",
provider
)),
Entry::Vacant(v) => {
v.insert(JsConnector { connector });
v.insert(DriverAdapter { connector });
Ok(())
}
}
}

pub struct Js {
connector: JsConnector,
connector: DriverAdapter,
connection_info: ConnectionInfo,
features: psl::PreviewFeatures,
}
Expand All @@ -69,7 +69,7 @@ impl FromSource for Js {
url: &str,
features: psl::PreviewFeatures,
) -> connector_interface::Result<Js> {
let connector = registered_js_connector(source.active_provider)?;
let connector = registered_driver_adapter(source.active_provider)?;
let connection_info = get_connection_info(url)?;

Ok(Js {
Expand Down Expand Up @@ -102,11 +102,11 @@ impl Connector for Js {
// TODO: miguelff: I haven´t found a better way to do this, yet... please continue reading.
//
// There is a bug in NAPI-rs by wich compiling a binary crate that links code using napi-rs
// bindings breaks. We could have used a JsQueryable from the `js-connectors` crate directly, as the
// `connection` field of a `Js` connector, but that will imply using napi-rs transitively, and break
// bindings breaks. We could have used a JsQueryable from the `driver-adapters` crate directly, as the
// `connection` field of a driver adapter, but that will imply using napi-rs transitively, and break
// the tests (which are compiled as binary creates)
//
// To avoid the problem above I separated interface from implementation, making JsConnector
// To avoid the problem above I separated interface from implementation, making DriverAdapter
// independent on napi-rs. Initially, I tried having a field Arc<&dyn TransactionCabable> to hold
// JsQueryable at runtime. I did this, because TransactionCapable is the trait bounds required to
// create a value of `SqlConnection` (see [SqlConnection::new])) to actually performt the queries.
Expand All @@ -117,12 +117,12 @@ impl Connector for Js {
// declaration, so finally I couldn't come up with anything better then wrapping a QuaintQueryable
// in this object, and implementing TransactionCapable (and quaint::Queryable) explicitly for it.
#[derive(Clone)]
struct JsConnector {
struct DriverAdapter {
connector: Arc<dyn TransactionCapable>,
}

#[async_trait]
impl QuaintQueryable for JsConnector {
impl QuaintQueryable for DriverAdapter {
async fn query(&self, q: Query<'_>) -> quaint::Result<quaint::prelude::ResultSet> {
self.connector.query(q).await
}
Expand Down Expand Up @@ -174,7 +174,7 @@ impl QuaintQueryable for JsConnector {
}

#[async_trait]
impl TransactionCapable for JsConnector {
impl TransactionCapable for DriverAdapter {
async fn start_transaction<'a>(
&'a self,
isolation: Option<IsolationLevel>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
mod connection;
#[cfg(feature = "js-connectors")]
#[cfg(feature = "driver-adapters")]
mod js;
mod mssql;
mod mysql;
Expand All @@ -12,7 +12,7 @@ pub(crate) mod operations;
use async_trait::async_trait;
use connector_interface::{error::ConnectorError, Connector};

#[cfg(feature = "js-connectors")]
#[cfg(feature = "driver-adapters")]
pub use js::*;
pub use mssql::*;
pub use mysql::*;
Expand Down
4 changes: 2 additions & 2 deletions query-engine/connectors/sql-query-connector/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ mod value_ext;
use self::{column_metadata::*, context::Context, filter_conversion::*, query_ext::QueryExt, row::*};
use quaint::prelude::Queryable;

#[cfg(feature = "js-connectors")]
pub use database::{register_js_connector, Js};
#[cfg(feature = "driver-adapters")]
pub use database::{register_driver_adapter, Js};
pub use database::{FromSource, Mssql, Mysql, PostgreSql, Sqlite};
pub use error::SqlError;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[package]
name = "js-connectors"
name = "driver-adapters"
version = "0.1.0"
edition = "2021"

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
34 changes: 34 additions & 0 deletions query-engine/driver-adapters/js/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Prisma Driver Adapters

This TypeScript monorepo contains the following packages:
- `@jkomyno/prisma-driver-adapter-utils` (later: `@prisma/driver-adapter-utils`)
- Internal set of utilities and types for Prisma's driver adapters.
- `@jkomyno/prisma-adapter-neon` (later: `@prisma/adapter-neon`)
- Prisma's Driver Adapter that wraps the `@neondatabase/serverless` driver
- It uses `provider = "postgres"`
- It exposes debug logs via `DEBUG="prisma:driver-adapter:neon"`
- `@jkomyno/prisma-adapter-planetscale` (later: `@prisma/adapter-planetscale`)
- Prisma's Driver Adapter that wraps the `@planetscale/database` driver
- It uses `provider = "mysql"`
- It exposes debug logs via `DEBUG="prisma:driver-adapter:planetscale"`
- `@jkomyno/prisma-adapter-pg` (later: `@prisma/adapter-pg`)
- Prisma's Driver Adapter that wraps the `pg` driver
- It uses `provider = "postgres"`
- It exposes debug logs via `DEBUG="prisma:driver-adapter:pg"`

## Get Started

We assume Node.js `v18.16.1`+ is installed. If not, run `nvm use` in the current directory.
This is very important to double-check if you have multiple versions installed, as PlanetScale requires either Node.js `v18.16.1`+ or a custom `fetch` function.

Install `pnpm` via:

```sh
npm i -g pnpm
```

## Development

- Install Node.js dependencies via `pnpm i`
- Build and link TypeScript packages via `pnpm build`
- Publish packages to `npm` via `pnpm publish -r`
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# @prisma/neon-js-connector
# @prisma/adapter-neon

**INTERNAL PACKAGE, DO NOT USE**
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@jkomyno/prisma-neon-js-connector",
"version": "0.0.8",
"description": "Prisma's JS Connector for \"@neondatabase/serverless\"",
"name": "@jkomyno/prisma-adapter-neon",
"version": "0.2.1",
"description": "Prisma's driver adapter for \"@neondatabase/serverless\"",
"main": "dist/index.js",
"module": "dist/index.mjs",
"types": "dist/index.d.ts",
Expand All @@ -18,8 +18,12 @@
"license": "Apache-2.0",
"sideEffects": false,
"dependencies": {
"@jkomyno/prisma-js-connector-utils": "workspace:*",
"@neondatabase/serverless": "^0.6.0",
"ws": "^8.13.0"
"@jkomyno/prisma-driver-adapter-utils": "workspace:*"
},
"devDependencies": {
"@neondatabase/serverless": "^0.6.0"
},
"peerDependencies": {
"@neondatabase/serverless": "^0.6.0"
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-js-connector-utils'
import { ColumnTypeEnum, type ColumnType } from '@jkomyno/prisma-driver-adapter-utils'
import { types } from '@neondatabase/serverless'

const NeonColumnType = types.builtins
Expand Down
1 change: 1 addition & 0 deletions query-engine/driver-adapters/js/adapter-neon/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { PrismaNeon, PrismaNeonHTTP } from './neon'
Loading

0 comments on commit 3457e5d

Please sign in to comment.