typeorm 0.2.43-dev.a5493fb → 0.2.44-dev.5a71803

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/browser/driver/Driver.d.ts +2 -1
  2. package/browser/driver/Driver.js.map +1 -1
  3. package/browser/driver/expo/ExpoQueryRunner.js +69 -45
  4. package/browser/driver/expo/ExpoQueryRunner.js.map +1 -1
  5. package/browser/driver/mysql/MysqlDriver.d.ts +6 -2
  6. package/browser/driver/mysql/MysqlDriver.js +42 -6
  7. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  8. package/browser/driver/sap/SapQueryRunner.js +12 -0
  9. package/browser/driver/sap/SapQueryRunner.js.map +1 -1
  10. package/browser/entity-manager/EntityManager.js +3 -1
  11. package/browser/entity-manager/EntityManager.js.map +1 -1
  12. package/browser/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  13. package/browser/entity-schema/EntitySchemaEmbeddedColumnOptions.d.ts +18 -0
  14. package/browser/entity-schema/EntitySchemaEmbeddedColumnOptions.js +8 -0
  15. package/browser/entity-schema/EntitySchemaEmbeddedColumnOptions.js.map +1 -0
  16. package/browser/entity-schema/EntitySchemaEmbeddedError.d.ts +6 -0
  17. package/browser/entity-schema/EntitySchemaEmbeddedError.js +18 -0
  18. package/browser/entity-schema/EntitySchemaEmbeddedError.js.map +1 -0
  19. package/browser/entity-schema/EntitySchemaOptions.d.ts +7 -1
  20. package/browser/entity-schema/EntitySchemaOptions.js.map +1 -1
  21. package/browser/entity-schema/EntitySchemaTransformer.d.ts +1 -0
  22. package/browser/entity-schema/EntitySchemaTransformer.js +217 -191
  23. package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
  24. package/browser/error/ReturningStatementNotSupportedError.js +1 -1
  25. package/browser/error/ReturningStatementNotSupportedError.js.map +1 -1
  26. package/browser/index.d.ts +1 -0
  27. package/browser/index.js +1 -0
  28. package/browser/index.js.map +1 -1
  29. package/browser/metadata/EmbeddedMetadata.d.ts +1 -1
  30. package/browser/metadata/EmbeddedMetadata.js +3 -0
  31. package/browser/metadata/EmbeddedMetadata.js.map +1 -1
  32. package/browser/metadata-args/EmbeddedMetadataArgs.d.ts +2 -2
  33. package/browser/metadata-args/EmbeddedMetadataArgs.js.map +1 -1
  34. package/browser/metadata-builder/EntityMetadataBuilder.js +3 -1
  35. package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  36. package/browser/persistence/SubjectExecutor.d.ts +0 -2
  37. package/browser/persistence/SubjectExecutor.js +9 -100
  38. package/browser/persistence/SubjectExecutor.js.map +1 -1
  39. package/browser/query-builder/DeleteQueryBuilder.js +7 -10
  40. package/browser/query-builder/DeleteQueryBuilder.js.map +1 -1
  41. package/browser/query-builder/InsertOrUpdateOptions.d.ts +3 -0
  42. package/browser/query-builder/InsertOrUpdateOptions.js +3 -0
  43. package/browser/query-builder/InsertOrUpdateOptions.js.map +1 -0
  44. package/browser/query-builder/InsertQueryBuilder.d.ts +2 -1
  45. package/browser/query-builder/InsertQueryBuilder.js +19 -5
  46. package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
  47. package/browser/query-builder/QueryBuilder.d.ts +2 -1
  48. package/browser/query-builder/QueryBuilder.js +2 -2
  49. package/browser/query-builder/QueryBuilder.js.map +1 -1
  50. package/browser/query-builder/QueryExpressionMap.d.ts +1 -0
  51. package/browser/query-builder/QueryExpressionMap.js.map +1 -1
  52. package/browser/query-builder/RelationLoader.js +1 -1
  53. package/browser/query-builder/RelationLoader.js.map +1 -1
  54. package/browser/query-builder/ReturningResultsEntityUpdator.js +4 -3
  55. package/browser/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
  56. package/browser/query-builder/SoftDeleteQueryBuilder.js +7 -12
  57. package/browser/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
  58. package/browser/query-builder/UpdateQueryBuilder.js +7 -11
  59. package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
  60. package/browser/repository/UpsertOptions.d.ts +4 -0
  61. package/browser/repository/UpsertOptions.js.map +1 -1
  62. package/browser/util/ImportUtils.js +2 -1
  63. package/browser/util/ImportUtils.js.map +1 -1
  64. package/driver/Driver.d.ts +2 -1
  65. package/driver/Driver.js.map +1 -1
  66. package/driver/expo/ExpoQueryRunner.js +69 -45
  67. package/driver/expo/ExpoQueryRunner.js.map +1 -1
  68. package/driver/mysql/MysqlDriver.d.ts +6 -2
  69. package/driver/mysql/MysqlDriver.js +42 -6
  70. package/driver/mysql/MysqlDriver.js.map +1 -1
  71. package/driver/sap/SapQueryRunner.js +12 -0
  72. package/driver/sap/SapQueryRunner.js.map +1 -1
  73. package/entity-manager/EntityManager.js +3 -1
  74. package/entity-manager/EntityManager.js.map +1 -1
  75. package/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  76. package/entity-schema/EntitySchemaEmbeddedColumnOptions.d.ts +18 -0
  77. package/entity-schema/EntitySchemaEmbeddedColumnOptions.js +11 -0
  78. package/entity-schema/EntitySchemaEmbeddedColumnOptions.js.map +1 -0
  79. package/entity-schema/EntitySchemaEmbeddedError.d.ts +6 -0
  80. package/entity-schema/EntitySchemaEmbeddedError.js +21 -0
  81. package/entity-schema/EntitySchemaEmbeddedError.js.map +1 -0
  82. package/entity-schema/EntitySchemaOptions.d.ts +7 -1
  83. package/entity-schema/EntitySchemaOptions.js.map +1 -1
  84. package/entity-schema/EntitySchemaTransformer.d.ts +1 -0
  85. package/entity-schema/EntitySchemaTransformer.js +217 -191
  86. package/entity-schema/EntitySchemaTransformer.js.map +1 -1
  87. package/error/ReturningStatementNotSupportedError.js +1 -1
  88. package/error/ReturningStatementNotSupportedError.js.map +1 -1
  89. package/index.d.ts +1 -0
  90. package/index.js +3 -1
  91. package/index.js.map +1 -1
  92. package/index.mjs +2 -0
  93. package/metadata/EmbeddedMetadata.d.ts +1 -1
  94. package/metadata/EmbeddedMetadata.js +3 -0
  95. package/metadata/EmbeddedMetadata.js.map +1 -1
  96. package/metadata-args/EmbeddedMetadataArgs.d.ts +2 -2
  97. package/metadata-args/EmbeddedMetadataArgs.js.map +1 -1
  98. package/metadata-builder/EntityMetadataBuilder.js +3 -1
  99. package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
  100. package/package.json +1 -1
  101. package/persistence/SubjectExecutor.d.ts +0 -2
  102. package/persistence/SubjectExecutor.js +9 -100
  103. package/persistence/SubjectExecutor.js.map +1 -1
  104. package/query-builder/DeleteQueryBuilder.js +7 -10
  105. package/query-builder/DeleteQueryBuilder.js.map +1 -1
  106. package/query-builder/InsertOrUpdateOptions.d.ts +3 -0
  107. package/query-builder/InsertOrUpdateOptions.js +4 -0
  108. package/query-builder/InsertOrUpdateOptions.js.map +1 -0
  109. package/query-builder/InsertQueryBuilder.d.ts +2 -1
  110. package/query-builder/InsertQueryBuilder.js +19 -5
  111. package/query-builder/InsertQueryBuilder.js.map +1 -1
  112. package/query-builder/QueryBuilder.d.ts +2 -1
  113. package/query-builder/QueryBuilder.js +2 -2
  114. package/query-builder/QueryBuilder.js.map +1 -1
  115. package/query-builder/QueryExpressionMap.d.ts +1 -0
  116. package/query-builder/QueryExpressionMap.js.map +1 -1
  117. package/query-builder/RelationLoader.js +5 -5
  118. package/query-builder/RelationLoader.js.map +1 -1
  119. package/query-builder/ReturningResultsEntityUpdator.js +4 -3
  120. package/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
  121. package/query-builder/SoftDeleteQueryBuilder.js +7 -12
  122. package/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
  123. package/query-builder/UpdateQueryBuilder.js +7 -11
  124. package/query-builder/UpdateQueryBuilder.js.map +1 -1
  125. package/repository/UpsertOptions.d.ts +4 -0
  126. package/repository/UpsertOptions.js.map +1 -1
  127. package/util/ImportUtils.js +2 -1
  128. package/util/ImportUtils.js.map +1 -1
@@ -13,6 +13,7 @@ import { Table } from "../schema-builder/table/Table";
13
13
  import { View } from "../schema-builder/view/View";
14
14
  import { TableForeignKey } from "../schema-builder/table/TableForeignKey";
15
15
  import { UpsertType } from "./types/UpsertType";
16
+ export declare type ReturningType = "insert" | "update" | "delete";
16
17
  /**
17
18
  * Driver organizes TypeORM communication with specific database management system.
18
19
  */
@@ -180,7 +181,7 @@ export interface Driver {
180
181
  /**
181
182
  * Returns true if driver supports RETURNING / OUTPUT statement.
182
183
  */
183
- isReturningSqlSupported(): boolean;
184
+ isReturningSqlSupported(returningType: ReturningType): boolean;
184
185
  /**
185
186
  * Returns true if driver supports uuid values generation on its own.
186
187
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../browser/src/driver/Driver.ts"],"names":[],"mappings":"","file":"Driver.js","sourcesContent":["import {QueryRunner} from \"../query-runner/QueryRunner\";\nimport {ColumnMetadata} from \"../metadata/ColumnMetadata\";\nimport {ObjectLiteral} from \"../common/ObjectLiteral\";\nimport {ColumnType} from \"./types/ColumnTypes\";\nimport {MappedColumnTypes} from \"./types/MappedColumnTypes\";\nimport {SchemaBuilder} from \"../schema-builder/SchemaBuilder\";\nimport {DataTypeDefaults} from \"./types/DataTypeDefaults\";\nimport {BaseConnectionOptions} from \"../connection/BaseConnectionOptions\";\nimport {TableColumn} from \"../schema-builder/table/TableColumn\";\nimport {EntityMetadata} from \"../metadata/EntityMetadata\";\nimport {ReplicationMode} from \"./types/ReplicationMode\";\nimport { Table } from \"../schema-builder/table/Table\";\nimport { View } from \"../schema-builder/view/View\";\nimport { TableForeignKey } from \"../schema-builder/table/TableForeignKey\";\nimport { UpsertType } from \"./types/UpsertType\";\n\n/**\n * Driver organizes TypeORM communication with specific database management system.\n */\nexport interface Driver {\n\n /**\n * Connection options.\n */\n options: BaseConnectionOptions;\n\n /**\n * Database name used to perform all write queries.\n *\n * todo: probably move into query runner.\n */\n database?: string;\n\n /**\n * Schema name used to perform all write queries.\n */\n schema?: string;\n\n /**\n * Indicates if replication is enabled.\n */\n isReplicated: boolean;\n\n /**\n * Indicates if tree tables are supported by this driver.\n */\n treeSupport: boolean;\n\n /**\n * Gets list of supported column data types by a driver.\n */\n supportedDataTypes: ColumnType[];\n\n /**\n * Returns type of upsert supported by driver if any\n */\n supportedUpsertType?: UpsertType;\n\n /**\n * Default values of length, precision and scale depends on column data type.\n * Used in the cases when length/precision/scale is not specified by user.\n */\n dataTypeDefaults: DataTypeDefaults;\n\n /**\n * Gets list of spatial column data types.\n */\n spatialTypes: ColumnType[];\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withLengthColumnTypes: ColumnType[];\n\n /**\n * Gets list of column data types that support precision by a driver.\n */\n withPrecisionColumnTypes: ColumnType[];\n\n /**\n * Gets list of column data types that support scale by a driver.\n */\n withScaleColumnTypes: ColumnType[];\n\n /**\n * Orm has special columns and we need to know what database column types should be for those types.\n * Column types are driver dependant.\n */\n mappedDataTypes: MappedColumnTypes;\n\n /**\n * Max length allowed by the DBMS for aliases (execution of queries).\n */\n maxAliasLength?: number;\n\n /**\n * Performs connection to the database.\n * Depend on driver type it may create a connection pool.\n */\n connect(): Promise<void>;\n\n /**\n * Makes any action after connection (e.g. create extensions in Postgres driver).\n */\n afterConnect(): Promise<void>;\n\n /**\n * Closes connection with database and releases all resources.\n */\n disconnect(): Promise<void>;\n\n /**\n * Synchronizes database schema (creates tables, indices, etc).\n */\n createSchemaBuilder(): SchemaBuilder;\n\n /**\n * Creates a query runner used for common queries.\n */\n createQueryRunner(mode: ReplicationMode): QueryRunner;\n\n /**\n * Replaces parameters in the given sql with special escaping character\n * and an array of parameter names to be passed to a query.\n */\n escapeQueryWithParameters(sql: string, parameters: ObjectLiteral, nativeParameters: ObjectLiteral): [string, any[]];\n\n /**\n * Escapes a table name, column name or an alias.\n *\n * todo: probably escape should be able to handle dots in the names and automatically escape them\n */\n escape(name: string): string;\n\n /**\n * Build full table name with database name, schema name and table name.\n * E.g. myDB.mySchema.myTable\n */\n buildTableName(tableName: string, schema?: string, database?: string): string;\n\n /**\n * Parse a target table name or other types and return a normalized table definition.\n */\n parseTableName(target: EntityMetadata | Table | View | TableForeignKey | string): { tableName: string, schema?: string, database?: string };\n\n /**\n * Prepares given value to a value to be persisted, based on its column type and metadata.\n */\n preparePersistentValue(value: any, column: ColumnMetadata): any;\n\n /**\n * Prepares given value to a value to be persisted, based on its column type.\n */\n prepareHydratedValue(value: any, column: ColumnMetadata): any;\n\n /**\n * Transforms type of the given column to a database column type.\n */\n normalizeType(column: { type?: ColumnType|string, length?: number|string, precision?: number|null, scale?: number, isArray?: boolean }): string;\n\n /**\n * Normalizes \"default\" value of the column.\n */\n normalizeDefault(columnMetadata: ColumnMetadata): string | undefined;\n\n /**\n * Normalizes \"isUnique\" value of the column.\n */\n normalizeIsUnique(column: ColumnMetadata): boolean;\n\n /**\n * Calculates column length taking into account the default length values.\n */\n getColumnLength(column: ColumnMetadata): string;\n\n /**\n * Normalizes \"default\" value of the column.\n */\n createFullType(column: TableColumn): string;\n\n /**\n * Obtains a new database connection to a master server.\n * Used for replication.\n * If replication is not setup then returns default connection's database connection.\n */\n obtainMasterConnection(): Promise<any>;\n\n /**\n * Obtains a new database connection to a slave server.\n * Used for replication.\n * If replication is not setup then returns master (default) connection's database connection.\n */\n obtainSlaveConnection(): Promise<any>;\n\n /**\n * Creates generated map of values generated or returned by database after INSERT query.\n */\n createGeneratedMap(metadata: EntityMetadata, insertResult: any, entityIndex?: number, entityNum?: number): ObjectLiteral|undefined;\n\n /**\n * Differentiate columns of this table and columns from the given column metadatas columns\n * and returns only changed.\n */\n findChangedColumns(tableColumns: TableColumn[], columnMetadatas: ColumnMetadata[]): ColumnMetadata[];\n\n /**\n * Returns true if driver supports RETURNING / OUTPUT statement.\n */\n isReturningSqlSupported(): boolean;\n\n /**\n * Returns true if driver supports uuid values generation on its own.\n */\n isUUIDGenerationSupported(): boolean;\n\n /**\n * Returns true if driver supports fulltext indices.\n */\n isFullTextColumnTypeSupported(): boolean;\n\n /**\n * Creates an escaped parameter.\n */\n createParameter(parameterName: string, index: number): string;\n\n}\n"],"sourceRoot":".."}
1
+ {"version":3,"sources":["../browser/src/driver/Driver.ts"],"names":[],"mappings":"","file":"Driver.js","sourcesContent":["import {QueryRunner} from \"../query-runner/QueryRunner\";\nimport {ColumnMetadata} from \"../metadata/ColumnMetadata\";\nimport {ObjectLiteral} from \"../common/ObjectLiteral\";\nimport {ColumnType} from \"./types/ColumnTypes\";\nimport {MappedColumnTypes} from \"./types/MappedColumnTypes\";\nimport {SchemaBuilder} from \"../schema-builder/SchemaBuilder\";\nimport {DataTypeDefaults} from \"./types/DataTypeDefaults\";\nimport {BaseConnectionOptions} from \"../connection/BaseConnectionOptions\";\nimport {TableColumn} from \"../schema-builder/table/TableColumn\";\nimport {EntityMetadata} from \"../metadata/EntityMetadata\";\nimport {ReplicationMode} from \"./types/ReplicationMode\";\nimport {Table} from \"../schema-builder/table/Table\";\nimport {View} from \"../schema-builder/view/View\";\nimport {TableForeignKey} from \"../schema-builder/table/TableForeignKey\";\nimport {UpsertType} from \"./types/UpsertType\";\n\nexport type ReturningType = \"insert\" | \"update\" | \"delete\";\n\n/**\n * Driver organizes TypeORM communication with specific database management system.\n */\nexport interface Driver {\n\n /**\n * Connection options.\n */\n options: BaseConnectionOptions;\n\n /**\n * Database name used to perform all write queries.\n *\n * todo: probably move into query runner.\n */\n database?: string;\n\n /**\n * Schema name used to perform all write queries.\n */\n schema?: string;\n\n /**\n * Indicates if replication is enabled.\n */\n isReplicated: boolean;\n\n /**\n * Indicates if tree tables are supported by this driver.\n */\n treeSupport: boolean;\n\n /**\n * Gets list of supported column data types by a driver.\n */\n supportedDataTypes: ColumnType[];\n\n /**\n * Returns type of upsert supported by driver if any\n */\n supportedUpsertType?: UpsertType;\n\n /**\n * Default values of length, precision and scale depends on column data type.\n * Used in the cases when length/precision/scale is not specified by user.\n */\n dataTypeDefaults: DataTypeDefaults;\n\n /**\n * Gets list of spatial column data types.\n */\n spatialTypes: ColumnType[];\n\n /**\n * Gets list of column data types that support length by a driver.\n */\n withLengthColumnTypes: ColumnType[];\n\n /**\n * Gets list of column data types that support precision by a driver.\n */\n withPrecisionColumnTypes: ColumnType[];\n\n /**\n * Gets list of column data types that support scale by a driver.\n */\n withScaleColumnTypes: ColumnType[];\n\n /**\n * Orm has special columns and we need to know what database column types should be for those types.\n * Column types are driver dependant.\n */\n mappedDataTypes: MappedColumnTypes;\n\n /**\n * Max length allowed by the DBMS for aliases (execution of queries).\n */\n maxAliasLength?: number;\n\n /**\n * Performs connection to the database.\n * Depend on driver type it may create a connection pool.\n */\n connect(): Promise<void>;\n\n /**\n * Makes any action after connection (e.g. create extensions in Postgres driver).\n */\n afterConnect(): Promise<void>;\n\n /**\n * Closes connection with database and releases all resources.\n */\n disconnect(): Promise<void>;\n\n /**\n * Synchronizes database schema (creates tables, indices, etc).\n */\n createSchemaBuilder(): SchemaBuilder;\n\n /**\n * Creates a query runner used for common queries.\n */\n createQueryRunner(mode: ReplicationMode): QueryRunner;\n\n /**\n * Replaces parameters in the given sql with special escaping character\n * and an array of parameter names to be passed to a query.\n */\n escapeQueryWithParameters(sql: string, parameters: ObjectLiteral, nativeParameters: ObjectLiteral): [string, any[]];\n\n /**\n * Escapes a table name, column name or an alias.\n *\n * todo: probably escape should be able to handle dots in the names and automatically escape them\n */\n escape(name: string): string;\n\n /**\n * Build full table name with database name, schema name and table name.\n * E.g. myDB.mySchema.myTable\n */\n buildTableName(tableName: string, schema?: string, database?: string): string;\n\n /**\n * Parse a target table name or other types and return a normalized table definition.\n */\n parseTableName(target: EntityMetadata | Table | View | TableForeignKey | string): { tableName: string, schema?: string, database?: string };\n\n /**\n * Prepares given value to a value to be persisted, based on its column type and metadata.\n */\n preparePersistentValue(value: any, column: ColumnMetadata): any;\n\n /**\n * Prepares given value to a value to be persisted, based on its column type.\n */\n prepareHydratedValue(value: any, column: ColumnMetadata): any;\n\n /**\n * Transforms type of the given column to a database column type.\n */\n normalizeType(column: { type?: ColumnType|string, length?: number|string, precision?: number|null, scale?: number, isArray?: boolean }): string;\n\n /**\n * Normalizes \"default\" value of the column.\n */\n normalizeDefault(columnMetadata: ColumnMetadata): string | undefined;\n\n /**\n * Normalizes \"isUnique\" value of the column.\n */\n normalizeIsUnique(column: ColumnMetadata): boolean;\n\n /**\n * Calculates column length taking into account the default length values.\n */\n getColumnLength(column: ColumnMetadata): string;\n\n /**\n * Normalizes \"default\" value of the column.\n */\n createFullType(column: TableColumn): string;\n\n /**\n * Obtains a new database connection to a master server.\n * Used for replication.\n * If replication is not setup then returns default connection's database connection.\n */\n obtainMasterConnection(): Promise<any>;\n\n /**\n * Obtains a new database connection to a slave server.\n * Used for replication.\n * If replication is not setup then returns master (default) connection's database connection.\n */\n obtainSlaveConnection(): Promise<any>;\n\n /**\n * Creates generated map of values generated or returned by database after INSERT query.\n */\n createGeneratedMap(metadata: EntityMetadata, insertResult: any, entityIndex?: number, entityNum?: number): ObjectLiteral|undefined;\n\n /**\n * Differentiate columns of this table and columns from the given column metadatas columns\n * and returns only changed.\n */\n findChangedColumns(tableColumns: TableColumn[], columnMetadatas: ColumnMetadata[]): ColumnMetadata[];\n\n /**\n * Returns true if driver supports RETURNING / OUTPUT statement.\n */\n isReturningSqlSupported(returningType: ReturningType): boolean;\n\n /**\n * Returns true if driver supports uuid values generation on its own.\n */\n isUUIDGenerationSupported(): boolean;\n\n /**\n * Returns true if driver supports fulltext indices.\n */\n isFullTextColumnTypeSupported(): boolean;\n\n /**\n * Creates an escaped parameter.\n */\n createParameter(parameterName: string, index: number): string;\n\n}\n"],"sourceRoot":".."}
@@ -111,12 +111,15 @@ var ExpoQueryRunner = /** @class */ (function (_super) {
111
111
  */
112
112
  ExpoQueryRunner.prototype.beforeMigration = function () {
113
113
  return __awaiter(this, void 0, void 0, function () {
114
+ var databaseConnection;
114
115
  return __generator(this, function (_a) {
115
116
  switch (_a.label) {
116
- case 0: return [4 /*yield*/, this.query("PRAGMA foreign_keys = OFF")];
117
+ case 0: return [4 /*yield*/, this.connect()];
117
118
  case 1:
118
- _a.sent();
119
- return [2 /*return*/];
119
+ databaseConnection = _a.sent();
120
+ return [2 /*return*/, new Promise(function (ok, fail) {
121
+ databaseConnection.exec([{ sql: 'PRAGMA foreign_keys = OFF;', args: [] }], false, function (err) { return err ? fail(err) : ok(); });
122
+ })];
120
123
  }
121
124
  });
122
125
  });
@@ -126,12 +129,15 @@ var ExpoQueryRunner = /** @class */ (function (_super) {
126
129
  */
127
130
  ExpoQueryRunner.prototype.afterMigration = function () {
128
131
  return __awaiter(this, void 0, void 0, function () {
132
+ var databaseConnection;
129
133
  return __generator(this, function (_a) {
130
134
  switch (_a.label) {
131
- case 0: return [4 /*yield*/, this.query("PRAGMA foreign_keys = ON")];
135
+ case 0: return [4 /*yield*/, this.connect()];
132
136
  case 1:
133
- _a.sent();
134
- return [2 /*return*/];
137
+ databaseConnection = _a.sent();
138
+ return [2 /*return*/, new Promise(function (ok, fail) {
139
+ databaseConnection.exec([{ sql: 'PRAGMA foreign_keys = ON;', args: [] }], false, function (err) { return err ? fail(err) : ok(); });
140
+ })];
135
141
  }
136
142
  });
137
143
  });
@@ -157,48 +163,66 @@ var ExpoQueryRunner = /** @class */ (function (_super) {
157
163
  this.driver.connection.logger.logQuery(query, parameters, this);
158
164
  queryStartTime = +new Date();
159
165
  // All Expo SQL queries are executed in a transaction context
160
- databaseConnection.transaction(function (transaction) {
161
- if (typeof _this.transaction === "undefined") {
162
- _this.startTransaction();
163
- _this.transaction = transaction;
164
- }
165
- _this.transaction.executeSql(query, parameters, function (t, raw) {
166
- // log slow queries if maxQueryExecution time is set
167
- var maxQueryExecutionTime = _this.driver.options.maxQueryExecutionTime;
168
- var queryEndTime = +new Date();
169
- var queryExecutionTime = queryEndTime - queryStartTime;
170
- if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime) {
171
- _this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, _this);
172
- }
173
- var result = new QueryResult();
174
- // return id of inserted row, if query was insert statement.
175
- if (query.substr(0, 11) === "INSERT INTO") {
176
- result.raw = raw.insertId;
166
+ databaseConnection.transaction(function (transaction) { return __awaiter(_this, void 0, void 0, function () {
167
+ var _this = this;
168
+ return __generator(this, function (_a) {
169
+ switch (_a.label) {
170
+ case 0:
171
+ if (!(typeof this.transaction === "undefined")) return [3 /*break*/, 2];
172
+ return [4 /*yield*/, this.startTransaction()];
173
+ case 1:
174
+ _a.sent();
175
+ this.transaction = transaction;
176
+ _a.label = 2;
177
+ case 2:
178
+ this.transaction.executeSql(query, parameters, function (t, raw) {
179
+ // log slow queries if maxQueryExecution time is set
180
+ var maxQueryExecutionTime = _this.driver.options.maxQueryExecutionTime;
181
+ var queryEndTime = +new Date();
182
+ var queryExecutionTime = queryEndTime - queryStartTime;
183
+ if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime) {
184
+ _this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, _this);
185
+ }
186
+ var result = new QueryResult();
187
+ // return id of inserted row, if query was insert statement.
188
+ if (query.substr(0, 11) === "INSERT INTO") {
189
+ result.raw = raw.insertId;
190
+ }
191
+ if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rowsAffected')) {
192
+ result.affected = raw.rowsAffected;
193
+ }
194
+ if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rows')) {
195
+ var resultSet = [];
196
+ for (var i = 0; i < raw.rows.length; i++) {
197
+ resultSet.push(raw.rows.item(i));
198
+ }
199
+ result.raw = resultSet;
200
+ result.records = resultSet;
201
+ }
202
+ if (useStructuredResult) {
203
+ ok(result);
204
+ }
205
+ else {
206
+ ok(result.raw);
207
+ }
208
+ }, function (t, err) {
209
+ _this.driver.connection.logger.logQueryError(err, query, parameters, _this);
210
+ fail(new QueryFailedError(query, parameters, err));
211
+ });
212
+ return [2 /*return*/];
177
213
  }
178
- if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rowsAffected')) {
179
- result.affected = raw.rowsAffected;
180
- }
181
- if (raw === null || raw === void 0 ? void 0 : raw.hasOwnProperty('rows')) {
182
- var resultSet = [];
183
- for (var i = 0; i < raw.rows.length; i++) {
184
- resultSet.push(raw.rows.item(i));
185
- }
186
- result.raw = resultSet;
187
- result.records = resultSet;
188
- }
189
- if (useStructuredResult) {
190
- ok(result);
191
- }
192
- else {
193
- ok(result.raw);
214
+ });
215
+ }); }, function (err) { return __awaiter(_this, void 0, void 0, function () {
216
+ return __generator(this, function (_a) {
217
+ switch (_a.label) {
218
+ case 0: return [4 /*yield*/, this.rollbackTransaction()];
219
+ case 1:
220
+ _a.sent();
221
+ fail(err);
222
+ return [2 /*return*/];
194
223
  }
195
- }, function (t, err) {
196
- _this.driver.connection.logger.logQueryError(err, query, parameters, _this);
197
- fail(new QueryFailedError(query, parameters, err));
198
224
  });
199
- }, function (err) {
200
- _this.rollbackTransaction();
201
- }, function () {
225
+ }); }, function () {
202
226
  _this.isTransactionActive = false;
203
227
  _this.transaction = undefined;
204
228
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../browser/src/driver/expo/ExpoQueryRunner.ts"],"names":[],"mappings":"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","file":"ExpoQueryRunner.js","sourcesContent":["import {QueryRunnerAlreadyReleasedError} from \"../../error/QueryRunnerAlreadyReleasedError\";\nimport {QueryFailedError} from \"../../error/QueryFailedError\";\nimport {AbstractSqliteQueryRunner} from \"../sqlite-abstract/AbstractSqliteQueryRunner\";\nimport {TransactionAlreadyStartedError} from \"../../error/TransactionAlreadyStartedError\";\nimport {TransactionNotStartedError} from \"../../error/TransactionNotStartedError\";\nimport {ExpoDriver} from \"./ExpoDriver\";\nimport {Broadcaster} from \"../../subscriber/Broadcaster\";\nimport { QueryResult } from \"../../query-runner/QueryResult\";\n\n// Needed to satisfy the Typescript compiler\ninterface IResultSet {\n insertId: number | undefined;\n rowsAffected: number;\n rows: {\n length: number;\n item: (idx: number) => any;\n _array: any[];\n };\n}\ninterface ITransaction {\n executeSql: (\n sql: string,\n args: any[] | undefined,\n ok: (tsx: ITransaction, resultSet: IResultSet) => void,\n fail: (tsx: ITransaction, err: any) => void\n ) => void;\n}\n\n/**\n * Runs queries on a single sqlite database connection.\n */\nexport class ExpoQueryRunner extends AbstractSqliteQueryRunner {\n\n /**\n * Database driver used by connection.\n */\n driver: ExpoDriver;\n\n /**\n * Database transaction object\n */\n private transaction?: ITransaction;\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(driver: ExpoDriver) {\n super();\n this.driver = driver;\n this.connection = driver.connection;\n this.broadcaster = new Broadcaster(this);\n }\n\n /**\n * Starts transaction. Within Expo, all database operations happen in a\n * transaction context, so issuing a `BEGIN TRANSACTION` command is\n * redundant and will result in the following error:\n *\n * `Error: Error code 1: cannot start a transaction within a transaction`\n *\n * Instead, we keep track of a `Transaction` object in `this.transaction`\n * and continue using the same object until we wish to commit the\n * transaction.\n */\n async startTransaction(): Promise<void> {\n if (this.isTransactionActive && typeof this.transaction !== \"undefined\")\n throw new TransactionAlreadyStartedError();\n\n await this.broadcaster.broadcast('BeforeTransactionStart');\n\n this.isTransactionActive = true;\n\n await this.broadcaster.broadcast('AfterTransactionStart');\n }\n\n /**\n * Commits transaction.\n * Error will be thrown if transaction was not started.\n * Since Expo will automatically commit the transaction once all the\n * callbacks of the transaction object have been completed, \"committing\" a\n * transaction in this driver's context means that we delete the transaction\n * object and set the stage for the next transaction.\n */\n async commitTransaction(): Promise<void> {\n if (!this.isTransactionActive && typeof this.transaction === \"undefined\")\n throw new TransactionNotStartedError();\n\n await this.broadcaster.broadcast('BeforeTransactionCommit');\n\n this.isTransactionActive = false;\n this.transaction = undefined;\n\n await this.broadcaster.broadcast('AfterTransactionCommit');\n }\n\n /**\n * Rollbacks transaction.\n * Error will be thrown if transaction was not started.\n * This method's functionality is identical to `commitTransaction()` because\n * the transaction lifecycle is handled within the Expo transaction object.\n * Issuing separate statements for `COMMIT` or `ROLLBACK` aren't necessary.\n */\n async rollbackTransaction(): Promise<void> {\n if (!this.isTransactionActive && typeof this.transaction === \"undefined\")\n throw new TransactionNotStartedError();\n\n await this.broadcaster.broadcast('BeforeTransactionRollback');\n\n this.isTransactionActive = false;\n this.transaction = undefined;\n\n await this.broadcaster.broadcast('AfterTransactionRollback');\n }\n\n /**\n * Called before migrations are run.\n */\n async beforeMigration(): Promise<void> {\n await this.query(`PRAGMA foreign_keys = OFF`);\n }\n\n /**\n * Called after migrations are run.\n */\n async afterMigration(): Promise<void> {\n await this.query(`PRAGMA foreign_keys = ON`);\n }\n\n /**\n * Executes a given SQL query.\n */\n async query(query: string, parameters?: any[], useStructuredResult = false): Promise<any> {\n if (this.isReleased)\n throw new QueryRunnerAlreadyReleasedError();\n\n return new Promise<any>(async (ok, fail) => {\n const databaseConnection = await this.connect();\n this.driver.connection.logger.logQuery(query, parameters, this);\n const queryStartTime = +new Date();\n // All Expo SQL queries are executed in a transaction context\n databaseConnection.transaction((transaction: ITransaction) => {\n if (typeof this.transaction === \"undefined\") {\n this.startTransaction();\n this.transaction = transaction;\n }\n this.transaction.executeSql(query, parameters, (t: ITransaction, raw: IResultSet) => {\n // log slow queries if maxQueryExecution time is set\n const maxQueryExecutionTime = this.driver.options.maxQueryExecutionTime;\n const queryEndTime = +new Date();\n const queryExecutionTime = queryEndTime - queryStartTime;\n if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime) {\n this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, this);\n }\n\n const result = new QueryResult();\n\n // return id of inserted row, if query was insert statement.\n if (query.substr(0, 11) === \"INSERT INTO\") {\n result.raw = raw.insertId;\n }\n\n if (raw?.hasOwnProperty('rowsAffected')) {\n result.affected = raw.rowsAffected;\n }\n\n if (raw?.hasOwnProperty('rows')) {\n let resultSet = [];\n for (let i = 0; i < raw.rows.length; i++) {\n resultSet.push(raw.rows.item(i));\n }\n\n result.raw = resultSet;\n result.records = resultSet;\n }\n\n if (useStructuredResult) {\n ok(result);\n } else {\n ok(result.raw);\n }\n }, (t: ITransaction, err: any) => {\n this.driver.connection.logger.logQueryError(err, query, parameters, this);\n fail(new QueryFailedError(query, parameters, err));\n });\n }, (err: any) => {\n this.rollbackTransaction();\n }, () => {\n this.isTransactionActive = false;\n this.transaction = undefined;\n });\n });\n }\n}\n"],"sourceRoot":"../.."}
1
+ {"version":3,"sources":["../browser/src/driver/expo/ExpoQueryRunner.ts"],"names":[],"mappings":"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","file":"ExpoQueryRunner.js","sourcesContent":["import {QueryRunnerAlreadyReleasedError} from \"../../error/QueryRunnerAlreadyReleasedError\";\nimport {QueryFailedError} from \"../../error/QueryFailedError\";\nimport {AbstractSqliteQueryRunner} from \"../sqlite-abstract/AbstractSqliteQueryRunner\";\nimport {TransactionAlreadyStartedError} from \"../../error/TransactionAlreadyStartedError\";\nimport {TransactionNotStartedError} from \"../../error/TransactionNotStartedError\";\nimport {ExpoDriver} from \"./ExpoDriver\";\nimport {Broadcaster} from \"../../subscriber/Broadcaster\";\nimport { QueryResult } from \"../../query-runner/QueryResult\";\n\n// Needed to satisfy the Typescript compiler\ninterface IResultSet {\n insertId: number | undefined;\n rowsAffected: number;\n rows: {\n length: number;\n item: (idx: number) => any;\n _array: any[];\n };\n}\ninterface ITransaction {\n executeSql: (\n sql: string,\n args: any[] | undefined,\n ok: (tsx: ITransaction, resultSet: IResultSet) => void,\n fail: (tsx: ITransaction, err: any) => void\n ) => void;\n}\n\n/**\n * Runs queries on a single sqlite database connection.\n */\nexport class ExpoQueryRunner extends AbstractSqliteQueryRunner {\n\n /**\n * Database driver used by connection.\n */\n driver: ExpoDriver;\n\n /**\n * Database transaction object\n */\n private transaction?: ITransaction;\n\n // -------------------------------------------------------------------------\n // Constructor\n // -------------------------------------------------------------------------\n\n constructor(driver: ExpoDriver) {\n super();\n this.driver = driver;\n this.connection = driver.connection;\n this.broadcaster = new Broadcaster(this);\n }\n\n /**\n * Starts transaction. Within Expo, all database operations happen in a\n * transaction context, so issuing a `BEGIN TRANSACTION` command is\n * redundant and will result in the following error:\n *\n * `Error: Error code 1: cannot start a transaction within a transaction`\n *\n * Instead, we keep track of a `Transaction` object in `this.transaction`\n * and continue using the same object until we wish to commit the\n * transaction.\n */\n async startTransaction(): Promise<void> {\n if (this.isTransactionActive && typeof this.transaction !== \"undefined\")\n throw new TransactionAlreadyStartedError();\n\n await this.broadcaster.broadcast('BeforeTransactionStart');\n\n this.isTransactionActive = true;\n\n await this.broadcaster.broadcast('AfterTransactionStart');\n }\n\n /**\n * Commits transaction.\n * Error will be thrown if transaction was not started.\n * Since Expo will automatically commit the transaction once all the\n * callbacks of the transaction object have been completed, \"committing\" a\n * transaction in this driver's context means that we delete the transaction\n * object and set the stage for the next transaction.\n */\n async commitTransaction(): Promise<void> {\n if (!this.isTransactionActive && typeof this.transaction === \"undefined\")\n throw new TransactionNotStartedError();\n\n await this.broadcaster.broadcast('BeforeTransactionCommit');\n\n this.isTransactionActive = false;\n this.transaction = undefined;\n\n await this.broadcaster.broadcast('AfterTransactionCommit');\n }\n\n /**\n * Rollbacks transaction.\n * Error will be thrown if transaction was not started.\n * This method's functionality is identical to `commitTransaction()` because\n * the transaction lifecycle is handled within the Expo transaction object.\n * Issuing separate statements for `COMMIT` or `ROLLBACK` aren't necessary.\n */\n async rollbackTransaction(): Promise<void> {\n if (!this.isTransactionActive && typeof this.transaction === \"undefined\")\n throw new TransactionNotStartedError();\n\n await this.broadcaster.broadcast('BeforeTransactionRollback');\n\n this.isTransactionActive = false;\n this.transaction = undefined;\n\n await this.broadcaster.broadcast('AfterTransactionRollback');\n }\n\n /**\n * Called before migrations are run.\n */\n async beforeMigration(): Promise<void> {\n const databaseConnection = await this.connect();\n return new Promise((ok, fail) => {\n databaseConnection.exec(\n [{ sql: 'PRAGMA foreign_keys = OFF;', args: [] }],\n false,\n (err: any) => err ? fail(err) : ok()\n );\n })\n }\n\n /**\n * Called after migrations are run.\n */\n async afterMigration(): Promise<void> {\n const databaseConnection = await this.connect();\n return new Promise((ok, fail) => {\n databaseConnection.exec(\n [{ sql: 'PRAGMA foreign_keys = ON;', args: [] }],\n false,\n (err: any) => err ? fail(err) : ok()\n );\n })\n }\n\n /**\n * Executes a given SQL query.\n */\n async query(query: string, parameters?: any[], useStructuredResult = false): Promise<any> {\n if (this.isReleased)\n throw new QueryRunnerAlreadyReleasedError();\n\n return new Promise<any>(async (ok, fail) => {\n const databaseConnection = await this.connect();\n this.driver.connection.logger.logQuery(query, parameters, this);\n const queryStartTime = +new Date();\n // All Expo SQL queries are executed in a transaction context\n databaseConnection.transaction(async (transaction: ITransaction) => {\n if (typeof this.transaction === \"undefined\") {\n await this.startTransaction();\n this.transaction = transaction;\n }\n this.transaction.executeSql(query, parameters, (t: ITransaction, raw: IResultSet) => {\n // log slow queries if maxQueryExecution time is set\n const maxQueryExecutionTime = this.driver.options.maxQueryExecutionTime;\n const queryEndTime = +new Date();\n const queryExecutionTime = queryEndTime - queryStartTime;\n if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime) {\n this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, this);\n }\n\n const result = new QueryResult();\n\n // return id of inserted row, if query was insert statement.\n if (query.substr(0, 11) === \"INSERT INTO\") {\n result.raw = raw.insertId;\n }\n\n if (raw?.hasOwnProperty('rowsAffected')) {\n result.affected = raw.rowsAffected;\n }\n\n if (raw?.hasOwnProperty('rows')) {\n let resultSet = [];\n for (let i = 0; i < raw.rows.length; i++) {\n resultSet.push(raw.rows.item(i));\n }\n\n result.raw = resultSet;\n result.records = resultSet;\n }\n\n if (useStructuredResult) {\n ok(result);\n } else {\n ok(result.raw);\n }\n }, (t: ITransaction, err: any) => {\n this.driver.connection.logger.logQueryError(err, query, parameters, this);\n fail(new QueryFailedError(query, parameters, err));\n });\n }, async (err: any) => {\n await this.rollbackTransaction();\n fail(err)\n }, () => {\n this.isTransactionActive = false;\n this.transaction = undefined;\n });\n });\n }\n}\n"],"sourceRoot":"../.."}
@@ -1,4 +1,4 @@
1
- import { Driver } from "../Driver";
1
+ import { Driver, ReturningType } from "../Driver";
2
2
  import { MysqlQueryRunner } from "./MysqlQueryRunner";
3
3
  import { ObjectLiteral } from "../../common/ObjectLiteral";
4
4
  import { ColumnMetadata } from "../../metadata/ColumnMetadata";
@@ -102,6 +102,10 @@ export declare class MysqlDriver implements Driver {
102
102
  * @see https://dev.mysql.com/doc/refman/5.5/en/identifiers.html
103
103
  */
104
104
  maxAliasLength: number;
105
+ /**
106
+ * Supported returning types
107
+ */
108
+ private readonly _isReturningSqlSupported;
105
109
  constructor(connection: Connection);
106
110
  /**
107
111
  * Performs connection to the database.
@@ -202,7 +206,7 @@ export declare class MysqlDriver implements Driver {
202
206
  /**
203
207
  * Returns true if driver supports RETURNING / OUTPUT statement.
204
208
  */
205
- isReturningSqlSupported(): boolean;
209
+ isReturningSqlSupported(returningType: ReturningType): boolean;
206
210
  /**
207
211
  * Returns true if driver supports uuid values generation on its own.
208
212
  */
@@ -13,6 +13,7 @@ import { TypeORMError } from "../../error";
13
13
  import { Table } from "../../schema-builder/table/Table";
14
14
  import { View } from "../../schema-builder/view/View";
15
15
  import { TableForeignKey } from "../../schema-builder/table/TableForeignKey";
16
+ import { VersionUtils } from "../../util/VersionUtils";
16
17
  /**
17
18
  * Organizes communication with MySQL DBMS.
18
19
  */
@@ -243,6 +244,14 @@ var MysqlDriver = /** @class */ (function () {
243
244
  * @see https://dev.mysql.com/doc/refman/5.5/en/identifiers.html
244
245
  */
245
246
  this.maxAliasLength = 63;
247
+ /**
248
+ * Supported returning types
249
+ */
250
+ this._isReturningSqlSupported = {
251
+ delete: false,
252
+ insert: false,
253
+ update: false,
254
+ };
246
255
  this.connection = connection;
247
256
  this.options = __assign({ legacySpatialSupport: true }, connection.options);
248
257
  this.isReplicated = this.options.replication ? true : false;
@@ -268,7 +277,7 @@ var MysqlDriver = /** @class */ (function () {
268
277
  */
269
278
  MysqlDriver.prototype.connect = function () {
270
279
  return __awaiter(this, void 0, void 0, function () {
271
- var _a, queryRunner, _b;
280
+ var _a, queryRunner, _b, result, dbVersion;
272
281
  var _this = this;
273
282
  return __generator(this, function (_c) {
274
283
  switch (_c.label) {
@@ -299,7 +308,21 @@ var MysqlDriver = /** @class */ (function () {
299
308
  case 6:
300
309
  _c.sent();
301
310
  _c.label = 7;
302
- case 7: return [2 /*return*/];
311
+ case 7:
312
+ if (!(this.options.type === "mariadb")) return [3 /*break*/, 9];
313
+ return [4 /*yield*/, this.createQueryRunner("master")
314
+ .query("SELECT VERSION() AS `version`")];
315
+ case 8:
316
+ result = _c.sent();
317
+ dbVersion = result[0].version;
318
+ if (VersionUtils.isGreaterOrEqual(dbVersion, "10.0.5")) {
319
+ this._isReturningSqlSupported.delete = true;
320
+ }
321
+ if (VersionUtils.isGreaterOrEqual(dbVersion, "10.5.0")) {
322
+ this._isReturningSqlSupported.insert = true;
323
+ }
324
+ _c.label = 9;
325
+ case 9: return [2 /*return*/];
303
326
  }
304
327
  });
305
328
  });
@@ -692,6 +715,19 @@ var MysqlDriver = /** @class */ (function () {
692
715
  * Creates generated map of values generated or returned by database after INSERT query.
693
716
  */
694
717
  MysqlDriver.prototype.createGeneratedMap = function (metadata, insertResult, entityIndex) {
718
+ if (!insertResult) {
719
+ return undefined;
720
+ }
721
+ if (insertResult.insertId === undefined) {
722
+ return Object.keys(insertResult).reduce(function (map, key) {
723
+ var column = metadata.findColumnWithDatabaseName(key);
724
+ if (column) {
725
+ OrmUtils.mergeDeep(map, column.createValueMap(insertResult[key]));
726
+ // OrmUtils.mergeDeep(map, column.createValueMap(this.prepareHydratedValue(insertResult[key], column))); // TODO: probably should be like there, but fails on enums, fix later
727
+ }
728
+ return map;
729
+ }, {});
730
+ }
695
731
  var generatedMap = metadata.generatedColumns.reduce(function (map, generatedColumn) {
696
732
  var value;
697
733
  if (generatedColumn.generationStrategy === "increment" && insertResult.insertId) {
@@ -765,8 +801,8 @@ var MysqlDriver = /** @class */ (function () {
765
801
  /**
766
802
  * Returns true if driver supports RETURNING / OUTPUT statement.
767
803
  */
768
- MysqlDriver.prototype.isReturningSqlSupported = function () {
769
- return false;
804
+ MysqlDriver.prototype.isReturningSqlSupported = function (returningType) {
805
+ return this._isReturningSqlSupported[returningType];
770
806
  };
771
807
  /**
772
808
  * Returns true if driver supports uuid values generation on its own.
@@ -871,8 +907,8 @@ var MysqlDriver = /** @class */ (function () {
871
907
  MysqlDriver.prototype.prepareDbConnection = function (connection) {
872
908
  var logger = this.connection.logger;
873
909
  /*
874
- Attaching an error handler to connection errors is essential, as, otherwise, errors raised will go unhandled and
875
- cause the hosting app to crash.
910
+ * Attaching an error handler to connection errors is essential, as, otherwise, errors raised will go unhandled and
911
+ * cause the hosting app to crash.
876
912
  */
877
913
  if (connection.listeners("error").length === 0) {
878
914
  connection.on("error", function (error) { return logger.log("warn", "MySQL connection raised an error. " + error); });