UNPKG

ts-sql-query

Version:

Type-safe SQL query builder like QueryDSL or JOOQ in Java or Linq in .Net for TypeScript with MariaDB, MySql, Oracle, PostgreSql, Sqlite and SqlServer support.

132 lines (131 loc) 4.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MySql2QueryRunner = void 0; const PromiseBasedQueryRunner_1 = require("./PromiseBasedQueryRunner"); class MySql2QueryRunner extends PromiseBasedQueryRunner_1.PromiseBasedQueryRunner { constructor(connection, database = 'mySql') { super(); this.transactionLevel = 0; this.connection = connection; this.database = database; } useDatabase(database) { if (database !== 'mariaDB' && database !== 'mySql') { throw new Error('Unsupported database: ' + database + '. MySql2QueryRunner only supports mySql or mariaDB databases'); } else { // @ts-ignore this.database = database; } } getNativeRunner() { return this.connection; } getCurrentNativeTransaction() { return undefined; } execute(fn) { return fn(this.connection); } executeQueryReturning(query, params) { return new Promise((resolve, reject) => { this.connection.query(query, params, (error, results) => { if (error) { reject(error); } else { resolve(results); } }); }); } executeMutation(query, params) { return new Promise((resolve, reject) => { this.connection.query(query, params, (error, results) => { if (error) { reject(error); } else { resolve(results.affectedRows); } }); }); } executeInsertReturningLastInsertedId(query, params = []) { if (this.containsInsertReturningClause(query, params)) { return super.executeInsertReturningLastInsertedId(query, params); } return new Promise((resolve, reject) => { this.connection.query(query, params, (error, results) => { if (error) { reject(error); } else { resolve(results.insertId); } }); }); } executeBeginTransaction() { if (this.transactionLevel >= 1) { throw new Error("MySql doesn't support nested transactions. This error is thrown to avoid MariaDB silently finishing the previous transaction"); } return new Promise((resolve, reject) => { this.connection.beginTransaction((error) => { if (error) { reject(error); } else { this.transactionLevel++; if (this.transactionLevel >= 2) { reject(new Error("MySql doesn't support nested transactions. The previous transaction was silently finished")); } else { resolve(); } } }); }); } executeCommit() { return new Promise((resolve, reject) => { this.connection.commit((error) => { if (error) { // Transaction count only modified when commit successful, in case of error there is still an open transaction reject(error); } else { this.transactionLevel--; if (this.transactionLevel < 0) { this.transactionLevel = 0; } resolve(); } }); }); } executeRollback() { return new Promise((resolve, reject) => { this.connection.rollback((error) => { this.transactionLevel--; if (this.transactionLevel < 0) { this.transactionLevel = 0; } if (error) { reject(error); } else { resolve(); } }); }); } isTransactionActive() { return this.transactionLevel > 0; } addParam(params, value) { params.push(value); return '?'; } } exports.MySql2QueryRunner = MySql2QueryRunner;