typeorm
Version:
Data-Mapper ORM for TypeScript, ES7, ES6, ES5. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, MongoDB databases.
125 lines (123 loc) • 6.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BetterSqlite3QueryRunner = void 0;
var tslib_1 = require("tslib");
var QueryRunnerAlreadyReleasedError_1 = require("../../error/QueryRunnerAlreadyReleasedError");
var QueryFailedError_1 = require("../../error/QueryFailedError");
var AbstractSqliteQueryRunner_1 = require("../sqlite-abstract/AbstractSqliteQueryRunner");
var Broadcaster_1 = require("../../subscriber/Broadcaster");
var QueryResult_1 = require("../../query-runner/QueryResult");
/**
* Runs queries on a single sqlite database connection.
*
* Does not support compose primary keys with autoincrement field.
* todo: need to throw exception for this case.
*/
var BetterSqlite3QueryRunner = /** @class */ (function (_super) {
tslib_1.__extends(BetterSqlite3QueryRunner, _super);
// -------------------------------------------------------------------------
// Constructor
// -------------------------------------------------------------------------
function BetterSqlite3QueryRunner(driver) {
var _this = _super.call(this) || this;
_this.stmtCache = new Map();
_this.driver = driver;
_this.connection = driver.connection;
_this.broadcaster = new Broadcaster_1.Broadcaster(_this);
if (typeof _this.driver.options.statementCacheSize === "number") {
_this.cacheSize = _this.driver.options.statementCacheSize;
}
else {
_this.cacheSize = 100;
}
return _this;
}
BetterSqlite3QueryRunner.prototype.getStmt = function (query) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var stmt, databaseConnection, key, databaseConnection;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!(this.cacheSize > 0)) return [3 /*break*/, 3];
stmt = this.stmtCache.get(query);
if (!!stmt) return [3 /*break*/, 2];
return [4 /*yield*/, this.connect()];
case 1:
databaseConnection = _a.sent();
stmt = databaseConnection.prepare(query);
this.stmtCache.set(query, stmt);
while (this.stmtCache.size > this.cacheSize) {
key = this.stmtCache.keys().next().value;
this.stmtCache.delete(key);
}
_a.label = 2;
case 2: return [2 /*return*/, stmt];
case 3: return [4 /*yield*/, this.connect()];
case 4:
databaseConnection = _a.sent();
return [2 /*return*/, databaseConnection.prepare(query)];
}
});
});
};
/**
* Executes a given SQL query.
*/
BetterSqlite3QueryRunner.prototype.query = function (query, parameters, useStructuredResult) {
if (useStructuredResult === void 0) { useStructuredResult = false; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var connection, i, queryStartTime, stmt, result, raw, raw, maxQueryExecutionTime, queryEndTime, queryExecutionTime;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (this.isReleased)
throw new QueryRunnerAlreadyReleasedError_1.QueryRunnerAlreadyReleasedError();
connection = this.driver.connection;
parameters = parameters || [];
for (i = 0; i < parameters.length; i++) {
// in "where" clauses the parameters are not escaped by the driver
if (typeof parameters[i] === "boolean")
parameters[i] = +parameters[i];
}
this.driver.connection.logger.logQuery(query, parameters, this);
queryStartTime = +new Date();
return [4 /*yield*/, this.getStmt(query)];
case 1:
stmt = _a.sent();
try {
result = new QueryResult_1.QueryResult();
if (stmt.reader) {
raw = stmt.all.apply(stmt, parameters);
result.raw = raw;
if (Array.isArray(raw)) {
result.records = raw;
}
}
else {
raw = stmt.run.apply(stmt, parameters);
result.affected = raw.changes;
result.raw = raw.lastInsertRowid;
}
maxQueryExecutionTime = this.driver.options.maxQueryExecutionTime;
queryEndTime = +new Date();
queryExecutionTime = queryEndTime - queryStartTime;
if (maxQueryExecutionTime && queryExecutionTime > maxQueryExecutionTime)
connection.logger.logQuerySlow(queryExecutionTime, query, parameters, this);
if (!useStructuredResult) {
return [2 /*return*/, result.raw];
}
return [2 /*return*/, result];
}
catch (err) {
connection.logger.logQueryError(err, query, parameters, this);
throw new QueryFailedError_1.QueryFailedError(query, parameters, err);
}
return [2 /*return*/];
}
});
});
};
return BetterSqlite3QueryRunner;
}(AbstractSqliteQueryRunner_1.AbstractSqliteQueryRunner));
exports.BetterSqlite3QueryRunner = BetterSqlite3QueryRunner;
//# sourceMappingURL=BetterSqlite3QueryRunner.js.map