Skip to content

Commit

Permalink
feat: introduced a new configuration option "formatOptions.castParame…
Browse files Browse the repository at this point in the history
…ters" to delegate the prepare/hydrate parameters to the driver which will result in casting the parameters to their respective column type (#7483)
  • Loading branch information
ArsenyYankovsky committed Mar 29, 2021
1 parent 240c6c0 commit 7793b3f
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 11 deletions.
24 changes: 16 additions & 8 deletions package-lock.json

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

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
"sql.js": "^1.4.0",
"sqlite3": "^5.0.2",
"ts-node": "^9.1.1",
"typeorm-aurora-data-api-driver": "^1.4.0",
"typeorm-aurora-data-api-driver": "^2.0.0",
"typescript": "^4.2.2"
},
"dependencies": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export interface AuroraDataApiPostgresConnectionOptions extends BaseConnectionOp
*/
readonly uuidExtension?: "pgcrypto" | "uuid-ossp";

readonly transformParameters?: boolean;

/*
* Function handling errors thrown by drivers pool.
Expand All @@ -34,5 +35,5 @@ export interface AuroraDataApiPostgresConnectionOptions extends BaseConnectionOp

readonly serviceConfigOptions?: { [key: string]: any };

readonly formatOptions?: { [key: string]: any };
readonly formatOptions?: { [key: string]: any, castParameters: boolean };
}
42 changes: 42 additions & 0 deletions src/driver/aurora-data-api-pg/AuroraDataApiPostgresDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import {Connection} from "../../connection/Connection";
import {AuroraDataApiPostgresConnectionOptions} from "../aurora-data-api-pg/AuroraDataApiPostgresConnectionOptions";
import {AuroraDataApiPostgresQueryRunner} from "../aurora-data-api-pg/AuroraDataApiPostgresQueryRunner";
import {ReplicationMode} from "../types/ReplicationMode";
import {ColumnMetadata} from "../../metadata/ColumnMetadata";
import {ApplyValueTransformers} from "../../util/ApplyValueTransformers";

abstract class PostgresWrapper extends PostgresDriver {
options: any;
Expand All @@ -28,6 +30,8 @@ export class AuroraDataApiPostgresDriver extends PostgresWrapper implements Driv
*/
DataApiDriver: any;

client: any;

// -------------------------------------------------------------------------
// Public Implemented Properties
// -------------------------------------------------------------------------
Expand All @@ -54,6 +58,16 @@ export class AuroraDataApiPostgresDriver extends PostgresWrapper implements Driv

// load data-api package
this.loadDependencies();

this.client = new this.DataApiDriver(
this.options.region,
this.options.secretArn,
this.options.resourceArn,
this.options.database,
(query: string, parameters?: any[]) => this.connection.logger.logQuery(query, parameters),
this.options.serviceConfigOptions,
this.options.formatOptions,
);
}

// -------------------------------------------------------------------------
Expand Down Expand Up @@ -93,6 +107,34 @@ export class AuroraDataApiPostgresDriver extends PostgresWrapper implements Driv
);
}

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

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

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)
}

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

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

// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export interface AuroraDataApiConnectionOptions extends BaseConnectionOptions, A

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

readonly formatOptions?: { [key: string]: any };
readonly formatOptions?: { [key: string]: any, castParameters: boolean };

/**
* Use spatial functions like GeomFromText and AsText which are removed in MySQL 8.
Expand Down
20 changes: 20 additions & 0 deletions src/driver/aurora-data-api/AuroraDataApiDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ export class AuroraDataApiDriver implements Driver {
*/
DataApiDriver: any;

client: any;

/**
* Connection pool.
* Used in non-replication mode.
Expand Down Expand Up @@ -299,6 +301,16 @@ export class AuroraDataApiDriver implements Driver {
// load mysql package
this.loadDependencies();

this.client = new this.DataApiDriver(
this.options.region,
this.options.secretArn,
this.options.resourceArn,
this.options.database,
(query: string, parameters?: any[]) => this.connection.logger.logQuery(query, parameters),
this.options.serviceConfigOptions,
this.options.formatOptions,
);

// validate options to make sure everything is set
// todo: revisit validation with replication in mind
// if (!(this.options.host || (this.options.extra && this.options.extra.socketPath)) && !this.options.socketPath)
Expand Down Expand Up @@ -407,6 +419,10 @@ export class AuroraDataApiDriver implements Driver {
if (columnMetadata.transformer)
value = ApplyValueTransformers.transformTo(columnMetadata.transformer, value);

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

if (value === null || value === undefined)
return value;

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

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

if (columnMetadata.type === Boolean || columnMetadata.type === "bool" || columnMetadata.type === "boolean") {
value = value ? true : false;

Expand Down

0 comments on commit 7793b3f

Please sign in to comment.