Skip to content

Commit b9842e3

Browse files
TanguyPolyalumni
andauthored
fix: beforeQuery promises not awaited before query execution (typeorm#11086)
* fix: beforeQuery promises not awaited before query execution Closes: typeorm#11085 * fix: run format Closes: typeorm#11085 * fix: apply same beforeQuery & afterQuery logic to all drivers * fix: use a different broadcaster for BeforeQuery / AfterQuery * fix: BeforeQuery / AfterQuery event types * fix: move broadCasterResult.wait in finally block * fix: remove duplicated broadcasterResult.wait in ReactNativeQueryRunner * fix: fix prettier issue * fix: implemented requested changes * fix: broken sqlite tests * Revert "fix: broken sqlite tests" This reverts commit 4bacd5f. * Revert "fix: implemented requested changes" This reverts commit 1d2f59b. * review: undefined type at the end * fix: move database connection logic outside of the promise bloc --------- Co-authored-by: Lucian Mocanu <[email protected]>
1 parent 9464e65 commit b9842e3

17 files changed

+324
-273
lines changed

src/driver/cockroachdb/CockroachQueryRunner.ts

+21-25
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
import { QueryResult } from "../../query-runner/QueryResult"
2-
import { QueryRunner } from "../../query-runner/QueryRunner"
31
import { ObjectLiteral } from "../../common/ObjectLiteral"
2+
import { TypeORMError } from "../../error"
3+
import { QueryFailedError } from "../../error/QueryFailedError"
4+
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
45
import { TransactionNotStartedError } from "../../error/TransactionNotStartedError"
5-
import { TableColumn } from "../../schema-builder/table/TableColumn"
6+
import { ReadStream } from "../../platform/PlatformTools"
7+
import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner"
8+
import { QueryResult } from "../../query-runner/QueryResult"
9+
import { QueryRunner } from "../../query-runner/QueryRunner"
10+
import { TableIndexOptions } from "../../schema-builder/options/TableIndexOptions"
611
import { Table } from "../../schema-builder/table/Table"
7-
import { TableIndex } from "../../schema-builder/table/TableIndex"
12+
import { TableCheck } from "../../schema-builder/table/TableCheck"
13+
import { TableColumn } from "../../schema-builder/table/TableColumn"
14+
import { TableExclusion } from "../../schema-builder/table/TableExclusion"
815
import { TableForeignKey } from "../../schema-builder/table/TableForeignKey"
9-
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
16+
import { TableIndex } from "../../schema-builder/table/TableIndex"
17+
import { TableUnique } from "../../schema-builder/table/TableUnique"
1018
import { View } from "../../schema-builder/view/View"
11-
import { Query } from "../Query"
12-
import { CockroachDriver } from "./CockroachDriver"
13-
import { ReadStream } from "../../platform/PlatformTools"
14-
import { QueryFailedError } from "../../error/QueryFailedError"
1519
import { Broadcaster } from "../../subscriber/Broadcaster"
16-
import { TableIndexOptions } from "../../schema-builder/options/TableIndexOptions"
17-
import { TableUnique } from "../../schema-builder/table/TableUnique"
18-
import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner"
20+
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
21+
import { InstanceChecker } from "../../util/InstanceChecker"
1922
import { OrmUtils } from "../../util/OrmUtils"
20-
import { TableCheck } from "../../schema-builder/table/TableCheck"
23+
import { VersionUtils } from "../../util/VersionUtils"
24+
import { Query } from "../Query"
2125
import { ColumnType } from "../types/ColumnTypes"
2226
import { IsolationLevel } from "../types/IsolationLevel"
23-
import { TableExclusion } from "../../schema-builder/table/TableExclusion"
24-
import { ReplicationMode } from "../types/ReplicationMode"
25-
import { TypeORMError } from "../../error"
2627
import { MetadataTableType } from "../types/MetadataTableType"
27-
import { InstanceChecker } from "../../util/InstanceChecker"
28-
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
29-
import { VersionUtils } from "../../util/VersionUtils"
28+
import { ReplicationMode } from "../types/ReplicationMode"
29+
import { CockroachDriver } from "./CockroachDriver"
3030

3131
/**
3232
* Runs queries on a single postgres database connection.
@@ -270,15 +270,11 @@ export class CockroachQueryRunner
270270
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()
271271

272272
const databaseConnection = await this.connect()
273-
const broadcasterResult = new BroadcasterResult()
274273

275274
this.driver.connection.logger.logQuery(query, parameters, this)
276-
this.broadcaster.broadcastBeforeQueryEvent(
277-
broadcasterResult,
278-
query,
279-
parameters,
280-
)
275+
await this.broadcaster.broadcast("BeforeQuery", query, parameters)
281276

277+
const broadcasterResult = new BroadcasterResult()
282278
const queryStartTime = Date.now()
283279

284280
if (this.isTransactionActive && this.storeQueries) {

src/driver/cordova/CordovaQueryRunner.ts

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { ObjectLiteral } from "../../common/ObjectLiteral"
2-
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
3-
import { QueryFailedError } from "../../error/QueryFailedError"
4-
import { AbstractSqliteQueryRunner } from "../sqlite-abstract/AbstractSqliteQueryRunner"
5-
import { CordovaDriver } from "./CordovaDriver"
6-
import { Broadcaster } from "../../subscriber/Broadcaster"
72
import { TypeORMError } from "../../error"
3+
import { QueryFailedError } from "../../error/QueryFailedError"
4+
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
85
import { QueryResult } from "../../query-runner/QueryResult"
6+
import { Broadcaster } from "../../subscriber/Broadcaster"
97
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
8+
import { AbstractSqliteQueryRunner } from "../sqlite-abstract/AbstractSqliteQueryRunner"
9+
import { CordovaDriver } from "./CordovaDriver"
1010

1111
/**
1212
* Runs queries on a single sqlite database connection.
@@ -53,15 +53,11 @@ export class CordovaQueryRunner extends AbstractSqliteQueryRunner {
5353
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()
5454

5555
const databaseConnection = await this.connect()
56-
const broadcasterResult = new BroadcasterResult()
5756

5857
this.driver.connection.logger.logQuery(query, parameters, this)
59-
this.broadcaster.broadcastBeforeQueryEvent(
60-
broadcasterResult,
61-
query,
62-
parameters,
63-
)
58+
await this.broadcaster.broadcast("BeforeQuery", query, parameters)
6459

60+
const broadcasterResult = new BroadcasterResult()
6561
const queryStartTime = Date.now()
6662

6763
try {

src/driver/expo/ExpoQueryRunner.ts

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
21
import { QueryFailedError } from "../../error/QueryFailedError"
3-
import { AbstractSqliteQueryRunner } from "../sqlite-abstract/AbstractSqliteQueryRunner"
4-
import { ExpoDriver } from "./ExpoDriver"
5-
import { Broadcaster } from "../../subscriber/Broadcaster"
2+
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
63
import { QueryResult } from "../../query-runner/QueryResult"
4+
import { Broadcaster } from "../../subscriber/Broadcaster"
75
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
6+
import { AbstractSqliteQueryRunner } from "../sqlite-abstract/AbstractSqliteQueryRunner"
7+
import { ExpoDriver } from "./ExpoDriver"
88

99
export class ExpoQueryRunner extends AbstractSqliteQueryRunner {
1010
driver: ExpoDriver
@@ -35,11 +35,7 @@ export class ExpoQueryRunner extends AbstractSqliteQueryRunner {
3535
const broadcasterResult = new BroadcasterResult()
3636

3737
this.driver.connection.logger.logQuery(query, parameters, this)
38-
this.broadcaster.broadcastBeforeQueryEvent(
39-
broadcasterResult,
40-
query,
41-
parameters,
42-
)
38+
await this.broadcaster.broadcast("BeforeQuery", query, parameters)
4339

4440
const queryStartTime = Date.now()
4541

@@ -103,6 +99,7 @@ export class ExpoQueryRunner extends AbstractSqliteQueryRunner {
10399

104100
throw new QueryFailedError(query, parameters, err)
105101
} finally {
102+
await broadcasterResult.wait()
106103
await statement.finalizeAsync()
107104
}
108105
}

src/driver/mysql/MysqlQueryRunner.ts

+27-30
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
import { QueryResult } from "../../query-runner/QueryResult"
2-
import { QueryRunner } from "../../query-runner/QueryRunner"
31
import { ObjectLiteral } from "../../common/ObjectLiteral"
2+
import { TypeORMError } from "../../error"
3+
import { QueryFailedError } from "../../error/QueryFailedError"
4+
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
45
import { TransactionNotStartedError } from "../../error/TransactionNotStartedError"
5-
import { TableColumn } from "../../schema-builder/table/TableColumn"
6+
import { ReadStream } from "../../platform/PlatformTools"
7+
import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner"
8+
import { QueryResult } from "../../query-runner/QueryResult"
9+
import { QueryRunner } from "../../query-runner/QueryRunner"
10+
import { TableIndexOptions } from "../../schema-builder/options/TableIndexOptions"
611
import { Table } from "../../schema-builder/table/Table"
12+
import { TableCheck } from "../../schema-builder/table/TableCheck"
13+
import { TableColumn } from "../../schema-builder/table/TableColumn"
14+
import { TableExclusion } from "../../schema-builder/table/TableExclusion"
715
import { TableForeignKey } from "../../schema-builder/table/TableForeignKey"
816
import { TableIndex } from "../../schema-builder/table/TableIndex"
9-
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
10-
import { View } from "../../schema-builder/view/View"
11-
import { Query } from "../Query"
12-
import { MysqlDriver } from "./MysqlDriver"
13-
import { ReadStream } from "../../platform/PlatformTools"
14-
import { OrmUtils } from "../../util/OrmUtils"
15-
import { QueryFailedError } from "../../error/QueryFailedError"
16-
import { TableIndexOptions } from "../../schema-builder/options/TableIndexOptions"
1717
import { TableUnique } from "../../schema-builder/table/TableUnique"
18-
import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner"
18+
import { View } from "../../schema-builder/view/View"
1919
import { Broadcaster } from "../../subscriber/Broadcaster"
20+
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
21+
import { InstanceChecker } from "../../util/InstanceChecker"
22+
import { OrmUtils } from "../../util/OrmUtils"
23+
import { VersionUtils } from "../../util/VersionUtils"
24+
import { Query } from "../Query"
2025
import { ColumnType } from "../types/ColumnTypes"
21-
import { TableCheck } from "../../schema-builder/table/TableCheck"
2226
import { IsolationLevel } from "../types/IsolationLevel"
23-
import { TableExclusion } from "../../schema-builder/table/TableExclusion"
24-
import { VersionUtils } from "../../util/VersionUtils"
25-
import { ReplicationMode } from "../types/ReplicationMode"
26-
import { TypeORMError } from "../../error"
2727
import { MetadataTableType } from "../types/MetadataTableType"
28-
import { InstanceChecker } from "../../util/InstanceChecker"
29-
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
28+
import { ReplicationMode } from "../types/ReplicationMode"
29+
import { MysqlDriver } from "./MysqlDriver"
3030

3131
/**
3232
* Runs queries on a single mysql database connection.
@@ -187,18 +187,16 @@ export class MysqlQueryRunner extends BaseQueryRunner implements QueryRunner {
187187
): Promise<any> {
188188
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()
189189

190-
return new Promise(async (ok, fail) => {
191-
const broadcasterResult = new BroadcasterResult()
190+
const databaseConnection = await this.connect()
192191

193-
try {
194-
const databaseConnection = await this.connect()
192+
this.driver.connection.logger.logQuery(query, parameters, this)
193+
await this.broadcaster.broadcast("BeforeQuery", query, parameters)
195194

196-
this.driver.connection.logger.logQuery(query, parameters, this)
197-
this.broadcaster.broadcastBeforeQueryEvent(
198-
broadcasterResult,
199-
query,
200-
parameters,
201-
)
195+
const broadcasterResult = new BroadcasterResult()
196+
const queryStartTime = Date.now()
197+
198+
return new Promise(async (ok, fail) => {
199+
try {
202200
const enableQueryTimeout =
203201
this.driver.options.enableQueryTimeout
204202
const maxQueryExecutionTime =
@@ -207,7 +205,6 @@ export class MysqlQueryRunner extends BaseQueryRunner implements QueryRunner {
207205
enableQueryTimeout && maxQueryExecutionTime
208206
? { sql: query, timeout: maxQueryExecutionTime }
209207
: query
210-
const queryStartTime = Date.now()
211208
databaseConnection.query(
212209
queryPayload,
213210
parameters,

src/driver/nativescript/NativescriptQueryRunner.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { ObjectLiteral } from "../../common/ObjectLiteral"
2-
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
32
import { QueryFailedError } from "../../error/QueryFailedError"
3+
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
4+
import { QueryResult } from "../../query-runner/QueryResult"
5+
import { Broadcaster } from "../../subscriber/Broadcaster"
46
import { AbstractSqliteQueryRunner } from "../sqlite-abstract/AbstractSqliteQueryRunner"
57
import { NativescriptDriver } from "./NativescriptDriver"
6-
import { Broadcaster } from "../../subscriber/Broadcaster"
7-
import { QueryResult } from "../../query-runner/QueryResult"
88

99
/**
1010
* Runs queries on a single sqlite database connection.
@@ -54,8 +54,9 @@ export class NativescriptQueryRunner extends AbstractSqliteQueryRunner {
5454

5555
const connection = this.driver.connection
5656

57+
const databaseConnection = await this.connect()
58+
5759
return new Promise(async (ok, fail) => {
58-
const databaseConnection = await this.connect()
5960
const isInsertQuery = query.substr(0, 11) === "INSERT INTO"
6061
connection.logger.logQuery(query, parameters, this)
6162

src/driver/oracle/OracleQueryRunner.ts

+18-22
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
import { QueryRunner } from "../../query-runner/QueryRunner"
21
import { ObjectLiteral } from "../../common/ObjectLiteral"
2+
import { TypeORMError } from "../../error"
3+
import { QueryFailedError } from "../../error/QueryFailedError"
4+
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
35
import { TransactionNotStartedError } from "../../error/TransactionNotStartedError"
4-
import { TableColumn } from "../../schema-builder/table/TableColumn"
6+
import { ReadStream } from "../../platform/PlatformTools"
7+
import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner"
8+
import { QueryResult } from "../../query-runner/QueryResult"
9+
import { QueryRunner } from "../../query-runner/QueryRunner"
510
import { Table } from "../../schema-builder/table/Table"
11+
import { TableCheck } from "../../schema-builder/table/TableCheck"
12+
import { TableColumn } from "../../schema-builder/table/TableColumn"
13+
import { TableExclusion } from "../../schema-builder/table/TableExclusion"
614
import { TableForeignKey } from "../../schema-builder/table/TableForeignKey"
715
import { TableIndex } from "../../schema-builder/table/TableIndex"
8-
import { QueryRunnerAlreadyReleasedError } from "../../error/QueryRunnerAlreadyReleasedError"
9-
import { View } from "../../schema-builder/view/View"
10-
import { Query } from "../Query"
11-
import { OracleDriver } from "./OracleDriver"
12-
import { ReadStream } from "../../platform/PlatformTools"
13-
import { QueryFailedError } from "../../error/QueryFailedError"
1416
import { TableUnique } from "../../schema-builder/table/TableUnique"
17+
import { View } from "../../schema-builder/view/View"
1518
import { Broadcaster } from "../../subscriber/Broadcaster"
16-
import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner"
19+
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
20+
import { InstanceChecker } from "../../util/InstanceChecker"
1721
import { OrmUtils } from "../../util/OrmUtils"
18-
import { TableCheck } from "../../schema-builder/table/TableCheck"
22+
import { Query } from "../Query"
1923
import { ColumnType } from "../types/ColumnTypes"
2024
import { IsolationLevel } from "../types/IsolationLevel"
21-
import { TableExclusion } from "../../schema-builder/table/TableExclusion"
22-
import { ReplicationMode } from "../types/ReplicationMode"
23-
import { TypeORMError } from "../../error"
24-
import { QueryResult } from "../../query-runner/QueryResult"
2525
import { MetadataTableType } from "../types/MetadataTableType"
26-
import { InstanceChecker } from "../../util/InstanceChecker"
27-
import { BroadcasterResult } from "../../subscriber/BroadcasterResult"
26+
import { ReplicationMode } from "../types/ReplicationMode"
27+
import { OracleDriver } from "./OracleDriver"
2828

2929
/**
3030
* Runs queries on a single oracle database connection.
@@ -198,15 +198,11 @@ export class OracleQueryRunner extends BaseQueryRunner implements QueryRunner {
198198
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()
199199

200200
const databaseConnection = await this.connect()
201-
const broadcasterResult = new BroadcasterResult()
202201

203202
this.driver.connection.logger.logQuery(query, parameters, this)
204-
this.broadcaster.broadcastBeforeQueryEvent(
205-
broadcasterResult,
206-
query,
207-
parameters,
208-
)
203+
await this.broadcaster.broadcast("BeforeQuery", query, parameters)
209204

205+
const broadcasterResult = new BroadcasterResult()
210206
const queryStartTime = Date.now()
211207

212208
try {

src/driver/postgres/PostgresQueryRunner.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,11 @@ export class PostgresQueryRunner
243243
if (this.isReleased) throw new QueryRunnerAlreadyReleasedError()
244244

245245
const databaseConnection = await this.connect()
246-
const broadcasterResult = new BroadcasterResult()
247246

248247
this.driver.connection.logger.logQuery(query, parameters, this)
249-
this.broadcaster.broadcastBeforeQueryEvent(
250-
broadcasterResult,
251-
query,
252-
parameters,
253-
)
248+
await this.broadcaster.broadcast("BeforeQuery", query, parameters)
249+
250+
const broadcasterResult = new BroadcasterResult()
254251

255252
try {
256253
const queryStartTime = Date.now()

0 commit comments

Comments
 (0)