Skip to content

Commit

Permalink
feat: add the ability to pass the driver into all database types (#8259)
Browse files Browse the repository at this point in the history
* feat: add the ability to pass the driver into all database types

* refactor: use this.options instead of through the connection
  • Loading branch information
dncrews committed Oct 22, 2021
1 parent 4ad3a61 commit 2133ffe
Show file tree
Hide file tree
Showing 28 changed files with 222 additions and 102 deletions.
Expand Up @@ -18,6 +18,12 @@ export interface AuroraDataApiPostgresConnectionOptions extends BaseConnectionOp

readonly database: string;

/**
* The driver object
* This defaults to require("typeorm-aurora-data-api-driver")
*/
readonly driver?: any;

/**
* The Postgres extension to use to generate UUID columns. Defaults to uuid-ossp.
* If pgcrypto is selected, TypeORM will use the gen_random_uuid() function from this extension.
Expand Down
11 changes: 6 additions & 5 deletions src/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver.ts
Expand Up @@ -115,27 +115,27 @@ export class AuroraDataApiPostgresDriver extends PostgresWrapper implements Driv
*/
preparePersistentValue(value: any, columnMetadata: ColumnMetadata): any {
if (this.options.formatOptions && this.options.formatOptions.castParameters === false) {
return super.preparePersistentValue(value, columnMetadata)
return super.preparePersistentValue(value, columnMetadata);
}

if (columnMetadata.transformer)
value = ApplyValueTransformers.transformTo(columnMetadata.transformer, value);

return this.client.preparePersistentValue(value, columnMetadata)
return this.client.preparePersistentValue(value, columnMetadata);
}

/**
* Prepares given value to a value to be persisted, based on its column type and metadata.
*/
prepareHydratedValue(value: any, columnMetadata: ColumnMetadata): any {
if (this.options.formatOptions && this.options.formatOptions.castParameters === false) {
return super.prepareHydratedValue(value, columnMetadata)
return super.prepareHydratedValue(value, columnMetadata);
}

if (columnMetadata.transformer)
value = ApplyValueTransformers.transformFrom(columnMetadata.transformer, value);

return this.client.prepareHydratedValue(value, columnMetadata)
return this.client.prepareHydratedValue(value, columnMetadata);
}

// -------------------------------------------------------------------------
Expand All @@ -146,7 +146,8 @@ export class AuroraDataApiPostgresDriver extends PostgresWrapper implements Driv
* If driver dependency is not given explicitly, then try to load it via "require".
*/
protected loadDependencies(): void {
const { pg } = PlatformTools.load("typeorm-aurora-data-api-driver");
const driver = this.options.driver || PlatformTools.load("typeorm-aurora-data-api-driver");
const { pg } = driver;

this.DataApiDriver = pg;
}
Expand Down
6 changes: 6 additions & 0 deletions src/driver/aurora-data-api/AuroraDataApiConnectionOptions.ts
Expand Up @@ -21,6 +21,12 @@ export interface AuroraDataApiConnectionOptions extends BaseConnectionOptions, A

readonly database: string;

/**
* The driver object
* This defaults to require("typeorm-aurora-data-api-driver")
*/
readonly driver?: any;

readonly serviceConfigOptions?: { [key: string]: any }; // pass optional AWS.ConfigurationOptions here

readonly formatOptions?: { [key: string]: any, castParameters: boolean };
Expand Down
21 changes: 11 additions & 10 deletions src/driver/aurora-data-api/AuroraDataApiDriver.ts
Expand Up @@ -440,7 +440,7 @@ export class AuroraDataApiDriver implements Driver {
tablePath.unshift(database);
}

return tablePath.join('.');
return tablePath.join(".");
}

/**
Expand Down Expand Up @@ -477,11 +477,11 @@ export class AuroraDataApiDriver implements Driver {
database: target.database || driverDatabase,
schema: target.schema || driverSchema,
tableName: target.tableName
}
};

}

const parts = target.split(".")
const parts = target.split(".");

return {
database: (parts.length > 1 ? parts[0] : undefined) || driverDatabase,
Expand All @@ -498,7 +498,7 @@ export class AuroraDataApiDriver implements Driver {
value = ApplyValueTransformers.transformTo(columnMetadata.transformer, value);

if (!this.options.formatOptions || this.options.formatOptions.castParameters !== false) {
return this.client.preparePersistentValue(value, columnMetadata)
return this.client.preparePersistentValue(value, columnMetadata);
}

if (value === null || value === undefined)
Expand Down Expand Up @@ -540,7 +540,7 @@ export class AuroraDataApiDriver implements Driver {
return columnMetadata.transformer ? ApplyValueTransformers.transformFrom(columnMetadata.transformer, value) : value;

if (!this.options.formatOptions || this.options.formatOptions.castParameters !== false) {
return this.client.prepareHydratedValue(value, columnMetadata)
return this.client.prepareHydratedValue(value, columnMetadata);
}

if (columnMetadata.type === Boolean || columnMetadata.type === "bool" || columnMetadata.type === "boolean") {
Expand Down Expand Up @@ -633,7 +633,7 @@ export class AuroraDataApiDriver implements Driver {
const defaultValue = columnMetadata.default;

if (defaultValue === null) {
return undefined
return undefined;
}

if ((columnMetadata.type === "enum" || columnMetadata.type === "simple-enum") && defaultValue !== undefined) {
Expand Down Expand Up @@ -880,7 +880,8 @@ export class AuroraDataApiDriver implements Driver {
* Loads all driver dependencies.
*/
protected loadDependencies(): void {
this.DataApiDriver = PlatformTools.load("typeorm-aurora-data-api-driver");
const DataApiDriver = this.options.driver || PlatformTools.load("typeorm-aurora-data-api-driver");
this.DataApiDriver = DataApiDriver;

// Driver uses rollup for publishing, which has issues when using typeorm in combination with webpack
// See https://github.com/webpack/webpack/issues/4742#issuecomment-295556787
Expand Down Expand Up @@ -925,9 +926,9 @@ export class AuroraDataApiDriver implements Driver {
*/
private prepareDbConnection(connection: any): any {
const { logger } = this.connection;
/*
Attaching an error handler to connection errors is essential, as, otherwise, errors raised will go unhandled and
cause the hosting app to crash.
/**
* Attaching an error handler to connection errors is essential, as, otherwise, errors raised will go unhandled and
* cause the hosting app to crash.
*/
if (connection.listeners("error").length === 0) {
connection.on("error", (error: any) => logger.log("warn", `MySQL connection raised an error. ${error}`));
Expand Down
8 changes: 7 additions & 1 deletion src/driver/better-sqlite3/BetterSqlite3ConnectionOptions.ts
Expand Up @@ -15,6 +15,12 @@ export interface BetterSqlite3ConnectionOptions extends BaseConnectionOptions {
*/
readonly database: string;

/**
* The driver object
* This defaults to require("better-sqlite3")
*/
readonly driver?: any;

/**
* Encryption key for for SQLCipher.
*/
Expand All @@ -29,7 +35,7 @@ export interface BetterSqlite3ConnectionOptions extends BaseConnectionOptions {
/**
* Function to run before a database is used in typeorm.
* You can set pragmas, register plugins or register
* functions or aggregates in this function.
* functions or aggregates in this function.
*/
readonly prepareDatabase?: (db: any) => void | Promise<void>;

Expand Down
7 changes: 4 additions & 3 deletions src/driver/better-sqlite3/BetterSqlite3Driver.ts
@@ -1,5 +1,5 @@
import mkdirp from 'mkdirp';
import path from 'path';
import mkdirp from "mkdirp";
import path from "path";
import { DriverPackageNotInstalledError } from "../../error/DriverPackageNotInstalledError";
import { DriverOptionNotSetError } from "../../error/DriverOptionNotSetError";
import { PlatformTools } from "../../platform/PlatformTools";
Expand Down Expand Up @@ -125,7 +125,8 @@ export class BetterSqlite3Driver extends AbstractSqliteDriver {
*/
protected loadDependencies(): void {
try {
this.sqlite = PlatformTools.load("better-sqlite3");
const sqlite = this.options.driver || PlatformTools.load("better-sqlite3");
this.sqlite = sqlite;

} catch (e) {
throw new DriverPackageNotInstalledError("SQLite", "better-sqlite3");
Expand Down
12 changes: 12 additions & 0 deletions src/driver/cockroachdb/CockroachConnectionOptions.ts
Expand Up @@ -16,6 +16,18 @@ export interface CockroachConnectionOptions extends BaseConnectionOptions, Cockr
*/
readonly schema?: string;

/**
* The driver object
* This defaults to `require("pg")`.
*/
readonly driver?: any;

/**
* The driver object
* This defaults to `require("pg-native")`.
*/
readonly nativeDriver?: any;

/**
* Replication setup.
*/
Expand Down
11 changes: 6 additions & 5 deletions src/driver/cockroachdb/CockroachDriver.ts
Expand Up @@ -464,7 +464,7 @@ export class CockroachDriver implements Driver {
tablePath.unshift(schema);
}

return tablePath.join('.');
return tablePath.join(".");
}

/**
Expand Down Expand Up @@ -503,11 +503,11 @@ export class CockroachDriver implements Driver {
database: target.database || driverDatabase,
schema: target.schema || driverSchema,
tableName: target.tableName
}
};

}

const parts = target.split(".")
const parts = target.split(".");

return {
database: driverDatabase,
Expand Down Expand Up @@ -795,9 +795,10 @@ export class CockroachDriver implements Driver {
*/
protected loadDependencies(): void {
try {
this.postgres = PlatformTools.load("pg");
const postgres = this.options.driver || PlatformTools.load("pg");
this.postgres = postgres;
try {
const pgNative = PlatformTools.load("pg-native");
const pgNative = this.options.nativeDriver || PlatformTools.load("pg-native");
if (pgNative && this.postgres.native) this.postgres = this.postgres.native;

} catch (e) { }
Expand Down
6 changes: 6 additions & 0 deletions src/driver/cordova/CordovaConnectionOptions.ts
Expand Up @@ -15,6 +15,12 @@ export interface CordovaConnectionOptions extends BaseConnectionOptions {
*/
readonly database: string;

/**
* The driver object
* This defaults to `window.sqlitePlugin`
*/
readonly driver?: any;

/**
* Storage Location
*/
Expand Down
5 changes: 3 additions & 2 deletions src/driver/cordova/CordovaDriver.ts
Expand Up @@ -12,7 +12,7 @@ interface Window {
sqlitePlugin: any;
}

declare var window: Window;
declare let window: Window;

export class CordovaDriver extends AbstractSqliteDriver {
options: CordovaConnectionOptions;
Expand Down Expand Up @@ -99,7 +99,8 @@ export class CordovaDriver extends AbstractSqliteDriver {
*/
protected loadDependencies(): void {
try {
this.sqlite = window.sqlitePlugin;
const sqlite = this.options.driver || window.sqlitePlugin;
this.sqlite = sqlite;

} catch (e) {
throw new DriverPackageNotInstalledError("Cordova-SQLite", "cordova-sqlite-storage");
Expand Down
10 changes: 8 additions & 2 deletions src/driver/mongodb/MongoConnectionOptions.ts
Expand Up @@ -21,7 +21,7 @@ export interface MongoConnectionOptions extends BaseConnectionOptions {
* Database host.
*/
readonly host?: string;

/**
* Database host replica set.
*/
Expand All @@ -47,6 +47,12 @@ export interface MongoConnectionOptions extends BaseConnectionOptions {
*/
readonly database?: string;

/**
* The driver object
* This defaults to require("mongodb")
*/
readonly driver?: any;

/**
* Set the maximum poolSize for each individual server or proxy connection.
*/
Expand Down Expand Up @@ -332,7 +338,7 @@ export interface MongoConnectionOptions extends BaseConnectionOptions {
* https://github.com/mongodb/node-mongodb-native/releases/tag/v3.2.1
*/
readonly useUnifiedTopology?: boolean;

/**
* Automatic Client-Side Field Level Encryption configuration.
*/
Expand Down
7 changes: 4 additions & 3 deletions src/driver/mongodb/MongoDriver.ts
Expand Up @@ -462,7 +462,8 @@ export class MongoDriver implements Driver {
*/
protected loadDependencies(): any {
try {
this.mongodb = PlatformTools.load("mongodb"); // try to load native driver dynamically
const mongodb = this.options.driver || PlatformTools.load("mongodb");
this.mongodb = mongodb;

} catch (e) {
throw new DriverPackageNotInstalledError("MongoDB", "mongodb");
Expand All @@ -473,8 +474,8 @@ export class MongoDriver implements Driver {
* Builds connection url that is passed to underlying driver to perform connection to the mongodb database.
*/
protected buildConnectionUrl(options: { [key: string]: any }): string {
const schemaUrlPart = options.type.toLowerCase();
const credentialsUrlPart = (options.username && options.password)
const schemaUrlPart = options.type.toLowerCase();
const credentialsUrlPart = (options.username && options.password)
? `${options.username}:${options.password}@`
: "";

Expand Down
9 changes: 8 additions & 1 deletion src/driver/mysql/MysqlConnectionOptions.ts
Expand Up @@ -13,6 +13,13 @@ export interface MysqlConnectionOptions extends BaseConnectionOptions, MysqlConn
*/
readonly type: "mysql"|"mariadb";

/**
* The driver object
* This defaults to require("mysql").
* Falls back to require("mysql2")
*/
readonly driver?: any;

/**
* The charset for the connection. This is called "collation" in the SQL-level of MySQL (like utf8_general_ci).
* If a SQL-level charset is specified (like utf8mb4) then the default collation for that charset is used.
Expand All @@ -36,7 +43,7 @@ export interface MysqlConnectionOptions extends BaseConnectionOptions, MysqlConn
* The milliseconds before a timeout occurs during the initial connection to the MySQL server. (Default: 10000)
* This difference between connectTimeout and acquireTimeout is subtle and is described in the mysqljs/mysql docs
* https://github.com/mysqljs/mysql/tree/master#pool-options
*/
*/
readonly acquireTimeout?: number;

/**
Expand Down

0 comments on commit 2133ffe

Please sign in to comment.