tspace-mysql
Version:
Tspace MySQL is a promise-based ORM for Node.js, designed with modern TypeScript and providing type safety for schema databases.
204 lines • 7.79 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MysqlDriver = void 0;
const __1 = require("..");
const MysqlQueryBuilder_1 = require("./MysqlQueryBuilder");
class MysqlDriver extends __1.BaseDriver {
constructor(options) {
super();
this.options = options;
}
connect() {
const options = this.options;
const mysql = this.import("mysql2");
this.pool = mysql.createPool({
host: options.host,
port: options.port,
database: options.database,
user: options.user || options.username,
password: options.password,
connectionLimit: options.connectionLimit ?? 20,
connectTimeout: options.connectTimeout ?? 1000 * 60,
dateStrings: options.dateStrings ?? false,
waitForConnections: true,
queueLimit: 0,
enableKeepAlive: true,
keepAliveInitialDelay: 1000 * 20,
maxIdle: Math.max(2, Math.floor((options.connectionLimit ?? 20) / 3)),
idleTimeout: 1000 * 60,
charset: 'utf8mb4',
});
this.pool.getConnection((err, connection) => {
if (err) {
const message = this._messageError.bind(this);
process.nextTick(() => {
if (String(err.message).includes('Pool is close')) {
return;
}
console.log(message(err.message == null || err.message === '' ? err.code : err.message));
if (this.options.CONNECTION_ERROR)
return process.exit();
});
return;
}
if (this.options.CONNECTION_SUCCESS) {
connection.query(`SHOW VARIABLES LIKE 'version%'`, (err, results) => {
connection.release();
if (err)
return;
const message = [
results.find(v => v?.Variable_name === 'version'),
results.find(v => v?.Variable_name === 'version_comment')
].map(v => v?.Value).join(' - ');
console.log(this._messageConnected.bind(this)(`${message}`));
});
}
});
this.pool.on("release", (connection) => {
this.emit("release", connection);
});
return {
database: () => options.database,
on: (event, data) => this.on(event, data),
queryBuilder: MysqlQueryBuilder_1.MysqlQueryBuilder,
query: (sql) => this._query(sql),
connection: () => this._connection(),
end: () => this._end()
};
}
disconnect(pool) {
if (pool == null)
return;
pool?.end(() => {
pool = undefined;
});
}
_query(sql) {
const start = Date.now();
return new Promise((resolve, reject) => {
return this.pool.query(sql, (err, results) => {
if (err)
return reject(err);
this._detectEventQuery({ start, sql });
this.meta(results, sql);
return resolve(this.returning(results));
});
});
}
_connection() {
let closeTransaction = false;
return new Promise((resolve, reject) => {
this.pool.getConnection((err, connection) => {
if (err)
return reject(err);
const query = (sql) => {
const start = Date.now();
return new Promise((ok, fail) => {
if (closeTransaction) {
return fail(new Error(this.MESSAGE_TRX_CLOSED));
}
connection.query(sql, (err, results) => {
connection.release();
if (err) {
return fail(err);
}
this._detectEventQuery({ start, sql });
this.meta(results, sql);
return ok(this.returning(results));
});
});
};
const startTransaction = async () => {
if (closeTransaction) {
throw new Error(this.MESSAGE_TRX_CLOSED);
}
await query("START TRANSACTION").catch((err) => reject(err));
return;
};
const commit = async () => {
if (closeTransaction) {
throw new Error(this.MESSAGE_TRX_CLOSED);
}
await query("COMMIT").catch((err) => reject(err));
await end();
return;
};
const rollback = async () => {
if (closeTransaction) {
throw new Error(this.MESSAGE_TRX_CLOSED);
}
await query("ROLLBACK").catch((err) => reject(err));
// when rollback will end of transction
await end();
return;
};
const end = async () => {
await new Promise((resolve) => setTimeout(() => {
if (!closeTransaction) {
closeTransaction = true;
// After commit the transaction, you can't perform any actions with this transaction.
connection.destroy();
// After destroying the connection, it will be removed from the connection this.pool.
this.pool.end();
}
return resolve();
}, 500));
return;
};
return resolve({
on: (event, data) => this.on(event, data),
query,
queryBuilder: MysqlQueryBuilder_1.MysqlQueryBuilder,
startTransaction,
commit,
rollback,
end,
});
});
});
}
async _end() {
return new Promise((resolve, reject) => {
return this.pool.end((err) => {
if (err)
return reject(err);
this.pool = undefined;
return resolve();
});
});
}
meta(results, sql) {
if (Array.isArray(results))
return;
if (results.$meta == null)
results.$meta = {};
const command = this._detectQueryType(sql);
results.$meta = {
command
};
if (command === "INSERT") {
const insertIds = results.affectedRows <= 1
? [results.insertId]
: [...Array(results.affectedRows)].map((_, i) => results.insertId + i);
results.$meta = {
...results.$meta,
insertIds,
affected: true,
};
}
if (command === "UPDATE" || command === "DELETE") {
results.$meta = {
...results.$meta,
insertIds: [],
affected: Boolean(results.affectedRows),
};
}
}
returning(results) {
if (Array.isArray(results))
return results;
return results;
}
}
exports.MysqlDriver = MysqlDriver;
//# sourceMappingURL=MysqlDriver.js.map