Skip to content

Commit

Permalink
refactor: move the sqljs autosave hook into the queryrunner (#7855)
Browse files Browse the repository at this point in the history
the autosave callback should always be called & shouldn't be peppered
throughout our codebase
  • Loading branch information
imnotjames committed Jul 7, 2021
1 parent dffd125 commit 88fb441
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 27 deletions.
38 changes: 31 additions & 7 deletions src/driver/sqljs/SqljsQueryRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,17 @@ import {QueryFailedError} from "../../error/QueryFailedError";
* Runs queries on a single sqlite database connection.
*/
export class SqljsQueryRunner extends AbstractSqliteQueryRunner {


/**
* Flag to determine if a modification has happened since the last time this query runner has requested a save.
*/
private isDirty = false;

/**
* Database driver used by connection.
*/
driver: SqljsDriver;

// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
Expand All @@ -28,14 +33,26 @@ export class SqljsQueryRunner extends AbstractSqliteQueryRunner {
// -------------------------------------------------------------------------
// Public methods
// -------------------------------------------------------------------------


private async flush() {
if (this.isDirty) {
await this.driver.autoSave();
this.isDirty = false;
}
}

async release(): Promise<void> {
await this.flush();
return super.release();
}

/**
* Commits transaction.
* Error will be thrown if transaction was not started.
*/
async commitTransaction(): Promise<void> {
await super.commitTransaction();
await this.driver.autoSave();
await this.flush();
}

/**
Expand All @@ -45,6 +62,8 @@ export class SqljsQueryRunner extends AbstractSqliteQueryRunner {
if (this.isReleased)
throw new QueryRunnerAlreadyReleasedError();

const command = query.trim().split(" ", 1)[0];

return new Promise<any[]>(async (ok, fail) => {
const databaseConnection = this.driver.databaseConnection;
this.driver.connection.logger.logQuery(query, parameters, this);
Expand All @@ -57,7 +76,7 @@ export class SqljsQueryRunner extends AbstractSqliteQueryRunner {

statement.bind(parameters);
}

// log slow queries if maxQueryExecution time is set
const maxQueryExecutionTime = this.driver.connection.options.maxQueryExecutionTime;
const queryEndTime = +new Date();
Expand All @@ -70,8 +89,13 @@ export class SqljsQueryRunner extends AbstractSqliteQueryRunner {
while (statement.step()) {
result.push(statement.getAsObject());
}

statement.free();

if (command !== "SELECT") {
this.isDirty = true;
}

ok(result);
}
catch (e) {
Expand All @@ -84,4 +108,4 @@ export class SqljsQueryRunner extends AbstractSqliteQueryRunner {
}
});
}
}
}
4 changes: 0 additions & 4 deletions src/query-builder/DeleteQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {WhereExpression} from "./WhereExpression";
import {Brackets} from "./Brackets";
import {DeleteResult} from "./result/DeleteResult";
import {ReturningStatementNotSupportedError} from "../error/ReturningStatementNotSupportedError";
import {SqljsDriver} from "../driver/sqljs/SqljsDriver";
import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {BroadcasterResult} from "../subscriber/BroadcasterResult";
import {EntitySchema} from "../entity-schema/EntitySchema";
Expand Down Expand Up @@ -124,9 +123,6 @@ export class DeleteQueryBuilder<Entity> extends QueryBuilder<Entity> implements
if (queryRunner !== this.queryRunner) { // means we created our own query runner
await queryRunner.release();
}
if (this.connection.driver instanceof SqljsDriver && !queryRunner.isTransactionActive) {
await this.connection.driver.autoSave();
}
}
}

Expand Down
4 changes: 0 additions & 4 deletions src/query-builder/InsertQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {InsertValuesMissingError} from "../error/InsertValuesMissingError";
import {ColumnMetadata} from "../metadata/ColumnMetadata";
import {ReturningResultsEntityUpdator} from "./ReturningResultsEntityUpdator";
import {AbstractSqliteDriver} from "../driver/sqlite-abstract/AbstractSqliteDriver";
import {SqljsDriver} from "../driver/sqljs/SqljsDriver";
import {BroadcasterResult} from "../subscriber/BroadcasterResult";
import {EntitySchema} from "../entity-schema/EntitySchema";
import {OracleDriver} from "../driver/oracle/OracleDriver";
Expand Down Expand Up @@ -151,9 +150,6 @@ export class InsertQueryBuilder<Entity> extends QueryBuilder<Entity> {
if (queryRunner !== this.queryRunner) { // means we created our own query runner
await queryRunner.release();
}
if (this.connection.driver instanceof SqljsDriver && !queryRunner.isTransactionActive) {
await this.connection.driver.autoSave();
}
// console.timeEnd(".releasing connection");
// console.timeEnd("QueryBuilder.execute");
}
Expand Down
4 changes: 0 additions & 4 deletions src/query-builder/QueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {Brackets} from "./Brackets";
import {QueryDeepPartialEntity} from "./QueryPartialEntity";
import {EntityMetadata} from "../metadata/EntityMetadata";
import {ColumnMetadata} from "../metadata/ColumnMetadata";
import {SqljsDriver} from "../driver/sqljs/SqljsDriver";
import {PostgresDriver} from "../driver/postgres/PostgresDriver";
import {CockroachDriver} from "../driver/cockroachdb/CockroachDriver";
import {SqlServerDriver} from "../driver/sqlserver/SqlServerDriver";
Expand Down Expand Up @@ -455,9 +454,6 @@ export abstract class QueryBuilder<Entity> {
if (queryRunner !== this.queryRunner) { // means we created our own query runner
await queryRunner.release();
}
if (this.connection.driver instanceof SqljsDriver) {
await this.connection.driver.autoSave();
}
}
}

Expand Down
4 changes: 0 additions & 4 deletions src/query-builder/SoftDeleteQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {Brackets} from "./Brackets";
import {UpdateResult} from "./result/UpdateResult";
import {ReturningStatementNotSupportedError} from "../error/ReturningStatementNotSupportedError";
import {ReturningResultsEntityUpdator} from "./ReturningResultsEntityUpdator";
import {SqljsDriver} from "../driver/sqljs/SqljsDriver";
import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {BroadcasterResult} from "../subscriber/BroadcasterResult";
import {OrderByCondition} from "../find-options/OrderByCondition";
Expand Down Expand Up @@ -128,9 +127,6 @@ export class SoftDeleteQueryBuilder<Entity> extends QueryBuilder<Entity> impleme
if (queryRunner !== this.queryRunner) { // means we created our own query runner
await queryRunner.release();
}
if (this.connection.driver instanceof SqljsDriver && !queryRunner.isTransactionActive) {
await this.connection.driver.autoSave();
}
}
}

Expand Down
4 changes: 0 additions & 4 deletions src/query-builder/UpdateQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {Brackets} from "./Brackets";
import {UpdateResult} from "./result/UpdateResult";
import {ReturningStatementNotSupportedError} from "../error/ReturningStatementNotSupportedError";
import {ReturningResultsEntityUpdator} from "./ReturningResultsEntityUpdator";
import {SqljsDriver} from "../driver/sqljs/SqljsDriver";
import {MysqlDriver} from "../driver/mysql/MysqlDriver";
import {BroadcasterResult} from "../subscriber/BroadcasterResult";
import {OrderByCondition} from "../find-options/OrderByCondition";
Expand Down Expand Up @@ -155,9 +154,6 @@ export class UpdateQueryBuilder<Entity> extends QueryBuilder<Entity> implements
if (queryRunner !== this.queryRunner) { // means we created our own query runner
await queryRunner.release();
}
if (this.connection.driver instanceof SqljsDriver && !queryRunner.isTransactionActive) {
await this.connection.driver.autoSave();
}
}
}

Expand Down

0 comments on commit 88fb441

Please sign in to comment.