forked from typeorm/typeorm
/
SqljsQueryRunner.ts
83 lines (70 loc) · 2.97 KB
/
SqljsQueryRunner.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import {QueryRunnerAlreadyReleasedError} from "../../error/QueryRunnerAlreadyReleasedError";
import {AbstractSqliteQueryRunner} from "../sqlite-abstract/AbstractSqliteQueryRunner";
import {SqljsDriver} from "./SqljsDriver";
import {Broadcaster} from "../../subscriber/Broadcaster";
import {QueryFailedError} from "../../error/QueryFailedError";
/**
* Runs queries on a single sqlite database connection.
*/
export class SqljsQueryRunner extends AbstractSqliteQueryRunner {
/**
* Database driver used by connection.
*/
driver: SqljsDriver;
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
constructor(driver: SqljsDriver) {
super();
this.driver = driver;
this.connection = driver.connection;
this.broadcaster = new Broadcaster(this);
}
// -------------------------------------------------------------------------
// Public methods
// -------------------------------------------------------------------------
/**
* Commits transaction.
* Error will be thrown if transaction was not started.
*/
async commitTransaction(): Promise<void> {
await super.commitTransaction();
await this.driver.autoSave();
}
/**
* Executes a given SQL query.
*/
query(query: string, parameters: any[] = []): Promise<any> {
if (this.isReleased)
throw new QueryRunnerAlreadyReleasedError();
return new Promise<any[]>(async (ok, fail) => {
const databaseConnection = this.driver.databaseConnection;
this.driver.connection.logger.logQuery(query, parameters, this);
const queryStartTime = +new Date();
let statement: any;
try {
statement = databaseConnection.prepare(query);
statement.bind(parameters);
// log slow queries if maxQueryExecution time is set
const maxQueryExecutionTime = this.driver.connection.options.maxQueryExecutionTime;
const queryEndTime = +new Date();
const queryExecutionTime = queryEndTime - queryStartTime;
if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime)
this.driver.connection.logger.logQuerySlow(queryExecutionTime, query, parameters, this);
const result: any[] = [];
while (statement.step()) {
result.push(statement.getAsObject());
}
statement.free();
ok(result);
}
catch (e) {
if (statement) {
statement.free();
}
this.driver.connection.logger.logQueryError(e, query, parameters, this);
fail(new QueryFailedError(query, parameters, e));
}
});
}
}