typeorm 0.2.44-dev.8742e33 → 0.2.44-dev.948d328
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.
- package/browser/driver/Driver.d.ts +2 -1
- package/browser/driver/Driver.js.map +1 -1
- package/browser/driver/expo/ExpoQueryRunner.js +69 -45
- package/browser/driver/expo/ExpoQueryRunner.js.map +1 -1
- package/browser/driver/mysql/MysqlDriver.d.ts +6 -2
- package/browser/driver/mysql/MysqlDriver.js +42 -6
- package/browser/driver/mysql/MysqlDriver.js.map +1 -1
- package/browser/driver/sap/SapQueryRunner.js +12 -0
- package/browser/driver/sap/SapQueryRunner.js.map +1 -1
- package/browser/entity-manager/EntityManager.js +3 -1
- package/browser/entity-manager/EntityManager.js.map +1 -1
- package/browser/entity-schema/EntitySchemaTransformer.js +8 -8
- package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/browser/error/ReturningStatementNotSupportedError.js +1 -1
- package/browser/error/ReturningStatementNotSupportedError.js.map +1 -1
- package/browser/persistence/SubjectExecutor.js +2 -1
- package/browser/persistence/SubjectExecutor.js.map +1 -1
- package/browser/query-builder/DeleteQueryBuilder.js +7 -10
- package/browser/query-builder/DeleteQueryBuilder.js.map +1 -1
- package/browser/query-builder/InsertOrUpdateOptions.d.ts +3 -0
- package/browser/query-builder/InsertOrUpdateOptions.js +3 -0
- package/browser/query-builder/InsertOrUpdateOptions.js.map +1 -0
- package/browser/query-builder/InsertQueryBuilder.d.ts +2 -1
- package/browser/query-builder/InsertQueryBuilder.js +19 -5
- package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
- package/browser/query-builder/QueryBuilder.d.ts +2 -1
- package/browser/query-builder/QueryBuilder.js +2 -2
- package/browser/query-builder/QueryBuilder.js.map +1 -1
- package/browser/query-builder/QueryExpressionMap.d.ts +1 -0
- package/browser/query-builder/QueryExpressionMap.js.map +1 -1
- package/browser/query-builder/RelationLoader.js +1 -1
- package/browser/query-builder/RelationLoader.js.map +1 -1
- package/browser/query-builder/ReturningResultsEntityUpdator.js +4 -3
- package/browser/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
- package/browser/query-builder/SoftDeleteQueryBuilder.js +7 -12
- package/browser/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
- package/browser/query-builder/UpdateQueryBuilder.js +7 -11
- package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/browser/repository/UpsertOptions.d.ts +4 -0
- package/browser/repository/UpsertOptions.js.map +1 -1
- package/browser/util/ImportUtils.js +2 -1
- package/browser/util/ImportUtils.js.map +1 -1
- package/driver/Driver.d.ts +2 -1
- package/driver/Driver.js.map +1 -1
- package/driver/expo/ExpoQueryRunner.js +69 -45
- package/driver/expo/ExpoQueryRunner.js.map +1 -1
- package/driver/mysql/MysqlDriver.d.ts +6 -2
- package/driver/mysql/MysqlDriver.js +42 -6
- package/driver/mysql/MysqlDriver.js.map +1 -1
- package/driver/sap/SapQueryRunner.js +12 -0
- package/driver/sap/SapQueryRunner.js.map +1 -1
- package/entity-manager/EntityManager.js +3 -1
- package/entity-manager/EntityManager.js.map +1 -1
- package/entity-schema/EntitySchemaTransformer.js +8 -8
- package/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/error/ReturningStatementNotSupportedError.js +1 -1
- package/error/ReturningStatementNotSupportedError.js.map +1 -1
- package/package.json +1 -1
- package/persistence/SubjectExecutor.js +2 -1
- package/persistence/SubjectExecutor.js.map +1 -1
- package/query-builder/DeleteQueryBuilder.js +7 -10
- package/query-builder/DeleteQueryBuilder.js.map +1 -1
- package/query-builder/InsertOrUpdateOptions.d.ts +3 -0
- package/query-builder/InsertOrUpdateOptions.js +4 -0
- package/query-builder/InsertOrUpdateOptions.js.map +1 -0
- package/query-builder/InsertQueryBuilder.d.ts +2 -1
- package/query-builder/InsertQueryBuilder.js +19 -5
- package/query-builder/InsertQueryBuilder.js.map +1 -1
- package/query-builder/QueryBuilder.d.ts +2 -1
- package/query-builder/QueryBuilder.js +2 -2
- package/query-builder/QueryBuilder.js.map +1 -1
- package/query-builder/QueryExpressionMap.d.ts +1 -0
- package/query-builder/QueryExpressionMap.js.map +1 -1
- package/query-builder/RelationLoader.js +5 -5
- package/query-builder/RelationLoader.js.map +1 -1
- package/query-builder/ReturningResultsEntityUpdator.js +4 -3
- package/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
- package/query-builder/SoftDeleteQueryBuilder.js +7 -12
- package/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
- package/query-builder/UpdateQueryBuilder.js +7 -11
- package/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/repository/UpsertOptions.d.ts +4 -0
- package/repository/UpsertOptions.js.map +1 -1
- package/util/ImportUtils.js +2 -1
- 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 {
|
|
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.
|
|
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.
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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 (
|
|
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":";AAAA,OAAO,EAAC,+BAA+B,EAAC,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAC,gBAAgB,EAAC,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAC,yBAAyB,EAAC,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAC,8BAA8B,EAAC,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAC,0BAA0B,EAAC,MAAM,wCAAwC,CAAC;AAElF,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAqB7D;;GAEG;AACH;IAAqC,mCAAyB;IAY1D,4EAA4E;IAC5E,cAAc;IACd,4EAA4E;IAE5E,yBAAY,MAAkB;QAA9B,YACI,iBAAO,SAIV;QAHG,KAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,KAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,KAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,KAAI,CAAC,CAAC;;IAC7C,CAAC;IAED;;;;;;;;;;OAUG;IACG,0CAAgB,GAAtB;;;;;wBACI,IAAI,IAAI,CAAC,mBAAmB,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW;4BACnE,MAAM,IAAI,8BAA8B,EAAE,CAAC;wBAE/C,qBAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAAA;;wBAA1D,SAA0D,CAAC;wBAE3D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;wBAEhC,qBAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAA;;wBAAzD,SAAyD,CAAC;;;;;KAC7D;IAED;;;;;;;OAOG;IACG,2CAAiB,GAAvB;;;;;wBACI,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW;4BACpE,MAAM,IAAI,0BAA0B,EAAE,CAAC;wBAE3C,qBAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,yBAAyB,CAAC,EAAA;;wBAA3D,SAA2D,CAAC;wBAE5D,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;wBACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;wBAE7B,qBAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,wBAAwB,CAAC,EAAA;;wBAA1D,SAA0D,CAAC;;;;;KAC9D;IAED;;;;;;OAMG;IACG,6CAAmB,GAAzB;;;;;wBACI,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,WAAW;4BACpE,MAAM,IAAI,0BAA0B,EAAE,CAAC;wBAE3C,qBAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,2BAA2B,CAAC,EAAA;;wBAA7D,SAA6D,CAAC;wBAE9D,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;wBACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;wBAE7B,qBAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,0BAA0B,CAAC,EAAA;;wBAA5D,SAA4D,CAAC;;;;;KAChE;IAED;;OAEG;IACG,yCAAe,GAArB;;;;4BACI,qBAAM,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAA;;wBAA7C,SAA6C,CAAC;;;;;KACjD;IAED;;OAEG;IACG,wCAAc,GAApB;;;;4BACI,qBAAM,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAA;;wBAA5C,SAA4C,CAAC;;;;;KAChD;IAED;;OAEG;IACG,+BAAK,GAAX,UAAY,KAAa,EAAE,UAAkB,EAAE,mBAA2B;QAA3B,oCAAA,EAAA,2BAA2B;;;;gBACtE,IAAI,IAAI,CAAC,UAAU;oBACf,MAAM,IAAI,+BAA+B,EAAE,CAAC;gBAEhD,sBAAO,IAAI,OAAO,CAAM,UAAO,EAAE,EAAE,IAAI;;;;;wCACR,qBAAM,IAAI,CAAC,OAAO,EAAE,EAAA;;oCAAzC,kBAAkB,GAAG,SAAoB;oCAC/C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;oCAC1D,cAAc,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;oCACnC,6DAA6D;oCAC7D,kBAAkB,CAAC,WAAW,CAAC,UAAC,WAAyB;wCACrD,IAAI,OAAO,KAAI,CAAC,WAAW,KAAK,WAAW,EAAE;4CACzC,KAAI,CAAC,gBAAgB,EAAE,CAAC;4CACxB,KAAI,CAAC,WAAW,GAAG,WAAW,CAAC;yCAClC;wCACD,KAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,UAAC,CAAe,EAAE,GAAe;4CAC5E,oDAAoD;4CACpD,IAAM,qBAAqB,GAAG,KAAI,CAAC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC;4CACxE,IAAM,YAAY,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;4CACjC,IAAM,kBAAkB,GAAG,YAAY,GAAG,cAAc,CAAC;4CACzD,IAAI,qBAAqB,IAAI,kBAAkB,GAAG,qBAAqB,EAAE;gDACrE,KAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAI,CAAC,CAAC;6CAC3F;4CAED,IAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;4CAEjC,4DAA4D;4CAC5D,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,aAAa,EAAE;gDACvC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC;6CAC7B;4CAED,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,cAAc,CAAC,cAAc,CAAC,EAAE;gDACrC,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;6CACtC;4CAED,IAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,cAAc,CAAC,MAAM,CAAC,EAAE;gDAC7B,IAAI,SAAS,GAAG,EAAE,CAAC;gDACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oDACtC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iDACpC;gDAED,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;gDACvB,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;6CAC9B;4CAED,IAAI,mBAAmB,EAAE;gDACrB,EAAE,CAAC,MAAM,CAAC,CAAC;6CACd;iDAAM;gDACH,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;6CAClB;wCACL,CAAC,EAAE,UAAC,CAAe,EAAE,GAAQ;4CACzB,KAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAI,CAAC,CAAC;4CAC1E,IAAI,CAAC,IAAI,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;wCACvD,CAAC,CAAC,CAAC;oCACP,CAAC,EAAE,UAAC,GAAQ;wCACR,KAAI,CAAC,mBAAmB,EAAE,CAAC;oCAC/B,CAAC,EAAE;wCACC,KAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;wCACjC,KAAI,CAAC,WAAW,GAAG,SAAS,CAAC;oCACjC,CAAC,CAAC,CAAC;;;;yBACN,CAAC,EAAC;;;KACN;IACL,sBAAC;AAAD,CAlKA,AAkKC,CAlKoC,yBAAyB,GAkK7D","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:
|
|
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
|
|
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
|
-
|
|
875
|
-
|
|
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); });
|