From 95ce643e92a6bfc1e38ea8d9360a84175dd82bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=20Houl=C3=A9?= Date: Thu, 7 Sep 2023 10:08:52 +0200 Subject: [PATCH] fix build after https://github.com/prisma/prisma-engines/pull/4201 --- .../driver-adapters/js/adapter-pg/src/pg.ts | 166 +++++++++--------- .../connector-test-kit-executor/package.json | 6 +- .../connector-test-kit-executor/src/index.ts | 12 +- .../js/connector-test-kit-executor/src/qe.ts | 9 +- .../driver-adapters/js/pnpm-lock.yaml | 15 +- 5 files changed, 104 insertions(+), 104 deletions(-) diff --git a/query-engine/driver-adapters/js/adapter-pg/src/pg.ts b/query-engine/driver-adapters/js/adapter-pg/src/pg.ts index d4bb10715445..a6a4ba4b58d9 100644 --- a/query-engine/driver-adapters/js/adapter-pg/src/pg.ts +++ b/query-engine/driver-adapters/js/adapter-pg/src/pg.ts @@ -9,100 +9,104 @@ type StdClient = pg.Pool type TransactionClient = pg.PoolClient class PgQueryable - implements Queryable { - readonly flavour = 'postgres' - - constructor(protected readonly client: ClientT) { + implements Queryable { + readonly flavour = 'postgres' + + constructor(protected readonly client: ClientT) { + } + + /** + * Execute a query given as SQL, interpolating the given parameters. + */ + async queryRaw(query: Query): Promise> { + const tag = '[js::query_raw]' + debug(`${tag} %O`, query) + + const { fields, rows: results } = await this.performIO(query) + + const columns = fields.map((field) => field.name) + const resultSet: ResultSet = { + columnNames: columns, + columnTypes: fields.map((field) => fieldToColumnType(field.dataTypeID)), + rows: results.map((result) => columns.map((column) => result[column])), } - /** - * Execute a query given as SQL, interpolating the given parameters. - */ - async queryRaw(query: Query): Promise> { - const tag = '[js::query_raw]' - debug(`${tag} %O`, query) - - const { fields, rows: results } = await this.performIO(query) - - const columns = fields.map((field) => field.name) - const resultSet: ResultSet = { - columnNames: columns, - columnTypes: fields.map((field) => fieldToColumnType(field.dataTypeID)), - rows: results.map((result) => columns.map((column) => result[column])), - } - - return { ok: true, value: resultSet } - } - - /** - * Execute a query given as SQL, interpolating the given parameters and - * returning the number of affected rows. - * Note: Queryable expects a u64, but napi.rs only supports u32. - */ - async executeRaw(query: Query): Promise> { - const tag = '[js::execute_raw]' - debug(`${tag} %O`, query) - - const { rowCount: rowsAffected } = await this.performIO(query) - - // Note: `rowsAffected` can sometimes be null (e.g., when executing `"BEGIN"`) - return { ok: true, value: rowsAffected ?? 0 } - } - - /** - * Run a query against the database, returning the result set. - * Should the query fail due to a connection error, the connection is - * marked as unhealthy. - */ - private async performIO(query: Query) { - const { sql, args: values } = query - - try { - const result = await this.client.query(sql, values) - return result - } catch (e) { - const error = e as Error - debug('Error in performIO: %O', error) - throw error - } + return { ok: true, value: resultSet } + } + + /** + * Execute a query given as SQL, interpolating the given parameters and + * returning the number of affected rows. + * Note: Queryable expects a u64, but napi.rs only supports u32. + */ + async executeRaw(query: Query): Promise> { + const tag = '[js::execute_raw]' + debug(`${tag} %O`, query) + + const { rowCount: rowsAffected } = await this.performIO(query) + + // Note: `rowsAffected` can sometimes be null (e.g., when executing `"BEGIN"`) + return { ok: true, value: rowsAffected ?? 0 } + } + + /** + * Run a query against the database, returning the result set. + * Should the query fail due to a connection error, the connection is + * marked as unhealthy. + */ + private async performIO(query: Query) { + const { sql, args: values } = query + + try { + const result = await this.client.query(sql, values) + return result + } catch (e) { + const error = e as Error + debug('Error in performIO: %O', error) + throw error } + } } class PgTransaction extends PgQueryable - implements Transaction { - constructor(client: pg.PoolClient, readonly options: TransactionOptions) { - super(client) - } + implements Transaction { + constructor(client: pg.PoolClient, readonly options: TransactionOptions) { + super(client) + } - async commit(): Promise> { - debug(`[js::commit]`) + async commit(): Promise> { + debug(`[js::commit]`) - this.client.release() - return Promise.resolve({ ok: true, value: undefined }) - } + this.client.release() + return Promise.resolve({ ok: true, value: undefined }) + } - async rollback(): Promise> { - debug(`[js::rollback]`) + async rollback(): Promise> { + debug(`[js::rollback]`) - this.client.release() - return Promise.resolve({ ok: true, value: undefined }) - } + this.client.release() + return Promise.resolve({ ok: true, value: undefined }) + } } -export class PrismaPg extends PgQueryable implements Connector { - async startTransaction(): Promise> { - const options: TransactionOptions = { - usePhantomQuery: false, - } +export class PrismaPg extends PgQueryable implements DriverAdapter { + constructor(client: pg.Pool) { + super(client) + } - const tag = '[js::startTransaction]' - debug(`${tag} options: %O`, options) - - const connection = await this.client.connect() - return { ok: true, value: new PgTransaction(connection, options) } + async startTransaction(): Promise> { + const options: TransactionOptions = { + usePhantomQuery: false, } - async close() { - return { ok: true as const, value: undefined } - } + const tag = '[js::startTransaction]' + debug(`${tag} options: %O`, options) + + const connection = await this.client.connect() + return { ok: true, value: new PgTransaction(connection, options) } + } + + async close() { + return { ok: true as const, value: undefined } + } } diff --git a/query-engine/driver-adapters/js/connector-test-kit-executor/package.json b/query-engine/driver-adapters/js/connector-test-kit-executor/package.json index 81b8226f7e5d..0786db62a7bc 100644 --- a/query-engine/driver-adapters/js/connector-test-kit-executor/package.json +++ b/query-engine/driver-adapters/js/connector-test-kit-executor/package.json @@ -11,5 +11,9 @@ "author": "", "sideEffects": false, "license": "Apache-2.0", - "dependencies": { "@jkomyno/prisma-adapter-pg": "workspace:*" } + "dependencies": { + "@jkomyno/prisma-adapter-pg": "workspace:*", + "pg": "^8.11.3", + "@types/pg": "^8.10.2" + } } diff --git a/query-engine/driver-adapters/js/connector-test-kit-executor/src/index.ts b/query-engine/driver-adapters/js/connector-test-kit-executor/src/index.ts index 5e74ccb0e702..cb8623a1d24b 100644 --- a/query-engine/driver-adapters/js/connector-test-kit-executor/src/index.ts +++ b/query-engine/driver-adapters/js/connector-test-kit-executor/src/index.ts @@ -1,9 +1,9 @@ -import * as pg from '@jkomyno/prisma-pg-js-connector' +import * as pgDriver from 'pg' +import * as pg from '@jkomyno/prisma-adapter-pg' import * as qe from './qe' import * as engines from './engines/Library' import * as readline from 'node:readline' import * as jsonRpc from './jsonRpc' -import * as tempy from 'tempy' async function main(): Promise { const iface = readline.createInterface({ @@ -97,11 +97,9 @@ function respondOk(requestId: number, payload: unknown) { } async function initQe(url: string, prismaSchema: string): Promise { - const connector = pg.createPgConnector({ - url, - }); - const schemaPath: string = await tempy.temporaryWrite(prismaSchema); - return qe.initQueryEngine(connector, schemaPath) + const pool = new pgDriver.Pool({ connectionString: url }) + const adapter = new pg.PrismaPg(pool) + return qe.initQueryEngine(adapter, prismaSchema) } main().catch(console.error) diff --git a/query-engine/driver-adapters/js/connector-test-kit-executor/src/qe.ts b/query-engine/driver-adapters/js/connector-test-kit-executor/src/qe.ts index ec5491cf49d7..8db4ef67cdeb 100644 --- a/query-engine/driver-adapters/js/connector-test-kit-executor/src/qe.ts +++ b/query-engine/driver-adapters/js/connector-test-kit-executor/src/qe.ts @@ -1,18 +1,15 @@ -import * as pg from '@jkomyno/prisma-pg-js-connector' +import * as pg from '@jkomyno/prisma-adapter-pg' import * as lib from './engines/Library' import * as os from 'node:os' import * as path from 'node:path' -import * as fs from 'node:fs' -export function initQueryEngine(driver: pg.Connector, schemaPath: string): lib.QueryEngineInstance { +export function initQueryEngine(driver: pg.PrismaPg, datamodel: string): lib.QueryEngineInstance { // I assume nobody will run this on Windows ¯\_(ツ)_/¯ const libExt = os.platform() === 'darwin' ? 'dylib' : 'so' const dirname = path.dirname(new URL(import.meta.url).pathname) const libQueryEnginePath = path.join(dirname, `../../../../../target/debug/libquery_engine.${libExt}`) - console.log('[nodejs] read Prisma schema from', schemaPath) - const libqueryEngine = { exports: {} as unknown as lib.Library } // @ts-ignore process.dlopen(libqueryEngine, libQueryEnginePath) @@ -20,7 +17,7 @@ export function initQueryEngine(driver: pg.Connector, schemaPath: string): lib.Q const QueryEngine = libqueryEngine.exports.QueryEngine const queryEngineOptions = { - datamodel: fs.readFileSync(schemaPath, 'utf-8'), + datamodel, configDir: '.', engineProtocol: 'json' as const, logLevel: 'info' as const, diff --git a/query-engine/driver-adapters/js/pnpm-lock.yaml b/query-engine/driver-adapters/js/pnpm-lock.yaml index 66d2c4455f90..e81d5a5b6b18 100644 --- a/query-engine/driver-adapters/js/pnpm-lock.yaml +++ b/query-engine/driver-adapters/js/pnpm-lock.yaml @@ -56,6 +56,12 @@ importers: '@jkomyno/prisma-adapter-pg': specifier: workspace:* version: link:../adapter-pg + '@types/pg': + specifier: ^8.10.2 + version: 8.10.2 + pg: + specifier: ^8.11.3 + version: 8.11.3 driver-adapter-utils: dependencies: @@ -442,7 +448,6 @@ packages: '@types/node': 20.5.9 pg-protocol: 1.6.0 pg-types: 4.0.1 - dev: true /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} @@ -849,7 +854,6 @@ packages: /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -897,7 +901,6 @@ packages: /pg-numeric@1.0.2: resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} engines: {node: '>=4'} - dev: true /pg-pool@3.6.1(pg@8.11.3): resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} @@ -930,7 +933,6 @@ packages: postgres-date: 2.0.1 postgres-interval: 3.0.0 postgres-range: 1.1.3 - dev: true /pg@8.11.3: resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} @@ -989,7 +991,6 @@ packages: /postgres-array@3.0.2: resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} engines: {node: '>=12'} - dev: true /postgres-bytea@1.0.0: resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} @@ -1000,7 +1001,6 @@ packages: engines: {node: '>= 6'} dependencies: obuf: 1.1.2 - dev: true /postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} @@ -1009,7 +1009,6 @@ packages: /postgres-date@2.0.1: resolution: {integrity: sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==} engines: {node: '>=12'} - dev: true /postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} @@ -1020,11 +1019,9 @@ packages: /postgres-interval@3.0.0: resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} engines: {node: '>=12'} - dev: true /postgres-range@1.1.3: resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==} - dev: true /prisma@5.3.0-integration-feat-driver-adapters-in-client.1: resolution: {integrity: sha512-M5EjBFZ3P3mjgYOfRBLqg5wKKeXq/VTv2wF9Ft4YCMMsHlcIJJ9IMV1UkzZLmP1yTdMxougJcLeDA9QGmdpsMA==}