From e42911704d4916db132d9a87b3b5a34c7ca36d5f Mon Sep 17 00:00:00 2001 From: MuFa117 Date: Wed, 23 Aug 2023 16:31:56 -0700 Subject: [PATCH 1/2] Add Session Pool Options to the Spanner connection --- package-lock.json | 4 +- package.json | 2 +- .../spanner/SpannerConnectionOptions.ts | 5 +- src/driver/spanner/SpannerDriver.ts | 8 +- src/driver/spanner/SpannerQueryRunner.ts | 79 +++++++++---------- .../spanner/SpannerSessionPoolOptions.ts | 38 +++++++++ 6 files changed, 86 insertions(+), 50 deletions(-) create mode 100644 src/driver/spanner/SpannerSessionPoolOptions.ts diff --git a/package-lock.json b/package-lock.json index b14943d1db0..30c0663c553 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@streamyard/typeorm", - "version": "0.3.16-2", + "version": "0.3.16-3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@streamyard/typeorm", - "version": "0.3.16-2", + "version": "0.3.16-3", "license": "MIT", "dependencies": { "@sqltools/formatter": "^1.2.5", diff --git a/package.json b/package.json index 7826c9f120f..1f866d64b18 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@streamyard/typeorm", "private": true, - "version": "0.3.16-2", + "version": "0.3.16-3", "description": "Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB, Spanner databases.", "license": "MIT", "readmeFilename": "README.md", diff --git a/src/driver/spanner/SpannerConnectionOptions.ts b/src/driver/spanner/SpannerConnectionOptions.ts index a4ab000cf03..ce3b304fcb6 100644 --- a/src/driver/spanner/SpannerConnectionOptions.ts +++ b/src/driver/spanner/SpannerConnectionOptions.ts @@ -1,12 +1,13 @@ import { BaseConnectionOptions } from "../../connection/BaseConnectionOptions" import { SpannerConnectionCredentialsOptions } from "./SpannerConnectionCredentialsOptions" +import { SpannerSessionPoolOptions } from "./SpannerSessionPoolOptions" /** * Spanner specific connection options. */ export interface SpannerConnectionOptions extends BaseConnectionOptions, - SpannerConnectionCredentialsOptions { + SpannerConnectionCredentialsOptions { /** * Database type. */ @@ -146,4 +147,6 @@ export interface SpannerConnectionOptions } readonly poolSize?: never + + readonly sessionPool?: SpannerSessionPoolOptions } diff --git a/src/driver/spanner/SpannerDriver.ts b/src/driver/spanner/SpannerDriver.ts index 025812c47b6..a21c50c85b6 100644 --- a/src/driver/spanner/SpannerDriver.ts +++ b/src/driver/spanner/SpannerDriver.ts @@ -205,7 +205,7 @@ export class SpannerDriver implements Driver { */ async connect(): Promise { this.instance = this.spanner.instance(this.options.instanceId) - this.instanceDatabase = this.instance.database(this.options.databaseId) + this.instanceDatabase = this.instance.database(this.options.databaseId, this.options.sessionPool ?? {}) } /** @@ -422,9 +422,9 @@ export class SpannerDriver implements Driver { if (value === null || value === undefined) return columnMetadata.transformer ? ApplyValueTransformers.transformFrom( - columnMetadata.transformer, - value, - ) + columnMetadata.transformer, + value, + ) : value if (columnMetadata.type === Boolean || columnMetadata.type === "bool") { diff --git a/src/driver/spanner/SpannerQueryRunner.ts b/src/driver/spanner/SpannerQueryRunner.ts index 183782a8870..79a36310cc0 100644 --- a/src/driver/spanner/SpannerQueryRunner.ts +++ b/src/driver/spanner/SpannerQueryRunner.ts @@ -160,15 +160,15 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { await this.connect() let rawResult: | [ - any[], - { - queryPlan: null - queryStats: null - rowCountExact: string - rowCount: string - }, - { rowType: { fields: [] }; transaction: null }, - ] + any[], + { + queryPlan: null + queryStats: null + rowCountExact: string + rowCount: string + }, + { rowType: { fields: [] }; transaction: null }, + ] | undefined = undefined const isSelect = query.startsWith("SELECT") const executor = @@ -186,9 +186,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { sql: query, params: parameters ? parameters.reduce((params, value, index) => { - params["param" + index] = value - return params - }, {} as ObjectLiteral) + params["param" + index] = value + return params + }, {} as ObjectLiteral) : undefined, json: true, }) @@ -200,7 +200,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { // we throw original error even if rollback thrown an error if (!this.isTransactionActive && !isSelect) await this.sessionTransaction.rollback() - } catch (rollbackError) {} + } catch (rollbackError) { } throw error } @@ -304,9 +304,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { sql: query, params: parameters ? parameters.reduce((params, value, index) => { - params["param" + index] = value - return params - }, {} as ObjectLiteral) + params["param" + index] = value + return params + }, {} as ObjectLiteral) : undefined, json: true, } @@ -785,8 +785,8 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { oldTableColumnOrName instanceof TableColumn ? oldTableColumnOrName : table.columns.find( - (column) => column.name === oldTableColumnOrName, - ) + (column) => column.name === oldTableColumnOrName, + ) if (!oldColumn) throw new TypeORMError( `Column "${oldTableColumnOrName}" was not found in the "${table.name}" table.`, @@ -813,15 +813,13 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { ) { upQueries.push( new Query( - `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${ - newColumn.name + `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name }" TYPE ${this.driver.createFullType(newColumn)}`, ), ) downQueries.push( new Query( - `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${ - newColumn.name + `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name }" TYPE ${this.driver.createFullType(oldColumn)}`, ), ) @@ -1471,7 +1469,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { // we throw original error even if rollback thrown an error if (!isAnotherTransactionActive) await this.rollbackTransaction() - } catch (rollbackError) {} + } catch (rollbackError) { } throw error } } @@ -1656,9 +1654,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { (dbIndex) => { return ( dbIndex["TABLE_NAME"] === - dbTable["TABLE_NAME"] && + dbTable["TABLE_NAME"] && dbIndex["COLUMN_NAME"] === - dbColumn["COLUMN_NAME"] && + dbColumn["COLUMN_NAME"] && dbIndex["IS_UNIQUE"] === true ) }, @@ -1678,7 +1676,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { (uniqueIndex) => { return ( index.name === - uniqueIndex["INDEX_NAME"] && + uniqueIndex["INDEX_NAME"] && index.synchronize === false ) }, @@ -1690,9 +1688,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { return dbIndices.some( (dbIndex) => dbIndex["INDEX_NAME"] === - uniqueIndex["INDEX_NAME"] && + uniqueIndex["INDEX_NAME"] && dbIndex["COLUMN_NAME"] !== - dbColumn["COLUMN_NAME"], + dbColumn["COLUMN_NAME"], ) }) @@ -1764,9 +1762,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { (dbPrimaryKey) => { return ( dbPrimaryKey["TABLE_NAME"] === - dbColumn["TABLE_NAME"] && + dbColumn["TABLE_NAME"] && dbPrimaryKey["COLUMN_NAME"] === - dbColumn["COLUMN_NAME"] + dbColumn["COLUMN_NAME"] ) }, ) @@ -1923,9 +1921,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { const checkName = check.name ? check.name : this.connection.namingStrategy.checkConstraintName( - table, - check.expression!, - ) + table, + check.expression!, + ) return `CONSTRAINT \`${checkName}\` CHECK (${check.expression})` }) .join(", ") @@ -1950,11 +1948,10 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { .map((columnName) => `\`${columnName}\``) .join(", ") - return `CONSTRAINT \`${ - fk.name - }\` FOREIGN KEY (${columnNames}) REFERENCES ${this.escapePath( - this.getTablePath(fk), - )} (${referencedColumnNames})` + return `CONSTRAINT \`${fk.name + }\` FOREIGN KEY (${columnNames}) REFERENCES ${this.escapePath( + this.getTablePath(fk), + )} (${referencedColumnNames})` }) .join(", ") @@ -2074,8 +2071,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { checkConstraint: TableCheck, ): Query { return new Query( - `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${ - checkConstraint.name + `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${checkConstraint.name }\` CHECK (${checkConstraint.expression})`, ) } @@ -2110,8 +2106,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { .map((column) => this.driver.escape(column)) .join(",") let sql = - `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${ - foreignKey.name + `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${foreignKey.name }\` FOREIGN KEY (${columnNames}) ` + `REFERENCES ${this.escapePath( this.getTablePath(foreignKey), diff --git a/src/driver/spanner/SpannerSessionPoolOptions.ts b/src/driver/spanner/SpannerSessionPoolOptions.ts new file mode 100644 index 00000000000..d9291905abd --- /dev/null +++ b/src/driver/spanner/SpannerSessionPoolOptions.ts @@ -0,0 +1,38 @@ +/** + * Spanner specific SessionPool options + * more: https://github.com/ko3a4ok/nodejs-spanner/blob/aa8e8becf74d41d0de68253c17ebab188b5c7620/src/session-pool.ts#L149 + */ +export interface SpannerSessionPoolOptions { + acquireTimeout?: number; + concurrency?: number; + fail?: boolean; + idlesAfter?: number; + keepAlive?: number; + labels?: { [label: string]: string }; + max?: number; + maxIdle?: number; + min?: number; + /** + * @deprecated. Starting from v6.5.0 the same session can be reused for + * different types of transactions. + */ + writes?: number; + incStep?: number; + databaseRole?: string | null; +} + +/* Defaults: + const DEFAULTS: SessionPoolOptions = { + acquireTimeout: Infinity, + concurrency: Infinity, + fail: false, + idlesAfter: 10, + keepAlive: 30, + labels: {}, + max: 100, + maxIdle: 1, + min: 25, + incStep: 25, + databaseRole: null, + }; +*/ From aab3807926a3a3770ea196307f5e1902d4608b92 Mon Sep 17 00:00:00 2001 From: MuFa117 Date: Wed, 23 Aug 2023 16:35:07 -0700 Subject: [PATCH 2/2] One formatting too much --- src/driver/spanner/SpannerQueryRunner.ts | 79 +++++++++++++----------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/src/driver/spanner/SpannerQueryRunner.ts b/src/driver/spanner/SpannerQueryRunner.ts index 79a36310cc0..183782a8870 100644 --- a/src/driver/spanner/SpannerQueryRunner.ts +++ b/src/driver/spanner/SpannerQueryRunner.ts @@ -160,15 +160,15 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { await this.connect() let rawResult: | [ - any[], - { - queryPlan: null - queryStats: null - rowCountExact: string - rowCount: string - }, - { rowType: { fields: [] }; transaction: null }, - ] + any[], + { + queryPlan: null + queryStats: null + rowCountExact: string + rowCount: string + }, + { rowType: { fields: [] }; transaction: null }, + ] | undefined = undefined const isSelect = query.startsWith("SELECT") const executor = @@ -186,9 +186,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { sql: query, params: parameters ? parameters.reduce((params, value, index) => { - params["param" + index] = value - return params - }, {} as ObjectLiteral) + params["param" + index] = value + return params + }, {} as ObjectLiteral) : undefined, json: true, }) @@ -200,7 +200,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { // we throw original error even if rollback thrown an error if (!this.isTransactionActive && !isSelect) await this.sessionTransaction.rollback() - } catch (rollbackError) { } + } catch (rollbackError) {} throw error } @@ -304,9 +304,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { sql: query, params: parameters ? parameters.reduce((params, value, index) => { - params["param" + index] = value - return params - }, {} as ObjectLiteral) + params["param" + index] = value + return params + }, {} as ObjectLiteral) : undefined, json: true, } @@ -785,8 +785,8 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { oldTableColumnOrName instanceof TableColumn ? oldTableColumnOrName : table.columns.find( - (column) => column.name === oldTableColumnOrName, - ) + (column) => column.name === oldTableColumnOrName, + ) if (!oldColumn) throw new TypeORMError( `Column "${oldTableColumnOrName}" was not found in the "${table.name}" table.`, @@ -813,13 +813,15 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { ) { upQueries.push( new Query( - `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name + `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${ + newColumn.name }" TYPE ${this.driver.createFullType(newColumn)}`, ), ) downQueries.push( new Query( - `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${newColumn.name + `ALTER TABLE ${this.escapePath(table)} ALTER COLUMN "${ + newColumn.name }" TYPE ${this.driver.createFullType(oldColumn)}`, ), ) @@ -1469,7 +1471,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { // we throw original error even if rollback thrown an error if (!isAnotherTransactionActive) await this.rollbackTransaction() - } catch (rollbackError) { } + } catch (rollbackError) {} throw error } } @@ -1654,9 +1656,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { (dbIndex) => { return ( dbIndex["TABLE_NAME"] === - dbTable["TABLE_NAME"] && + dbTable["TABLE_NAME"] && dbIndex["COLUMN_NAME"] === - dbColumn["COLUMN_NAME"] && + dbColumn["COLUMN_NAME"] && dbIndex["IS_UNIQUE"] === true ) }, @@ -1676,7 +1678,7 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { (uniqueIndex) => { return ( index.name === - uniqueIndex["INDEX_NAME"] && + uniqueIndex["INDEX_NAME"] && index.synchronize === false ) }, @@ -1688,9 +1690,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { return dbIndices.some( (dbIndex) => dbIndex["INDEX_NAME"] === - uniqueIndex["INDEX_NAME"] && + uniqueIndex["INDEX_NAME"] && dbIndex["COLUMN_NAME"] !== - dbColumn["COLUMN_NAME"], + dbColumn["COLUMN_NAME"], ) }) @@ -1762,9 +1764,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { (dbPrimaryKey) => { return ( dbPrimaryKey["TABLE_NAME"] === - dbColumn["TABLE_NAME"] && + dbColumn["TABLE_NAME"] && dbPrimaryKey["COLUMN_NAME"] === - dbColumn["COLUMN_NAME"] + dbColumn["COLUMN_NAME"] ) }, ) @@ -1921,9 +1923,9 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { const checkName = check.name ? check.name : this.connection.namingStrategy.checkConstraintName( - table, - check.expression!, - ) + table, + check.expression!, + ) return `CONSTRAINT \`${checkName}\` CHECK (${check.expression})` }) .join(", ") @@ -1948,10 +1950,11 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { .map((columnName) => `\`${columnName}\``) .join(", ") - return `CONSTRAINT \`${fk.name - }\` FOREIGN KEY (${columnNames}) REFERENCES ${this.escapePath( - this.getTablePath(fk), - )} (${referencedColumnNames})` + return `CONSTRAINT \`${ + fk.name + }\` FOREIGN KEY (${columnNames}) REFERENCES ${this.escapePath( + this.getTablePath(fk), + )} (${referencedColumnNames})` }) .join(", ") @@ -2071,7 +2074,8 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { checkConstraint: TableCheck, ): Query { return new Query( - `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${checkConstraint.name + `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${ + checkConstraint.name }\` CHECK (${checkConstraint.expression})`, ) } @@ -2106,7 +2110,8 @@ export class SpannerQueryRunner extends BaseQueryRunner implements QueryRunner { .map((column) => this.driver.escape(column)) .join(",") let sql = - `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${foreignKey.name + `ALTER TABLE ${this.escapePath(table)} ADD CONSTRAINT \`${ + foreignKey.name }\` FOREIGN KEY (${columnNames}) ` + `REFERENCES ${this.escapePath( this.getTablePath(foreignKey),