UNPKG

ts-api-core

Version:

Nodejs api framework core

322 lines 12.5 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DBManager = void 0; const model_helper_1 = require("../utils/model.helper"); const db_connection_manager_1 = require("./db.connection.manager"); const db_script_1 = require("./db.script"); /** * 数据库管理器 */ class DBManager { /** * 构造函数 * @param sqlModel 传入SQL模型 * @param dataSyncWorker 连接服务 */ constructor(config) { this._trans = false; this.config = config; } /** 销毁连接 */ destroy() { if (this.conn) { this.conn.destroy(); } this.conn = undefined; } /** 释放连接 */ release() { if (this.conn) { this.conn.release(); } this.conn = undefined; } /** * 初始化数据库连接 (每次访问con之前都应该调用一下) */ initConnection() { return __awaiter(this, void 0, void 0, function* () { if (this.conn && (this.conn.state === 'connected' || this.conn.state === 'authenticated')) { return [false, this.conn]; } this.destroy(); this.conn = yield db_connection_manager_1.DBConnectionManager.getConnection(this.config); return [true, this.conn]; }); } doRawResult(results, onRaw) { if (Array.isArray(results)) { onRaw(results, 0, 0, results); } else { onRaw(results, results.insertId, results.affectedRows, undefined); } } /** * 执行SQL, 返回真实的数据 * @param sql * @param params */ query(sql, values, onRaw) { return __awaiter(this, void 0, void 0, function* () { const [acquire, conn] = yield this.initConnection(); return new Promise((resolve, reject) => { conn.query(sql, values, (err, results, fields) => { if (err) { reject(err); } else { if (onRaw) { this.doRawResult(results, onRaw); } resolve(results); } if (acquire) { this.release(); } }); }); }); } /** * 执行SQL, 返回第1行数据指定字段或第1个字段的值 * @param sql * @param values * @param fieldName */ queryValue(sql, values, fieldName = '', defaultValue, onRaw) { return __awaiter(this, void 0, void 0, function* () { const [acquire, conn] = yield this.initConnection(); return new Promise((resolve, reject) => { conn.query(sql, values, (err, results, fields) => { if (err) { reject(err); } else { if (onRaw) { this.doRawResult(results, onRaw); } if (results && results.length > 0 && fields) { const data = results[0]; resolve(data[fieldName ? fieldName : fields[0].name]); } else { resolve(defaultValue); } } if (acquire) { this.release(); } }); }); }); } /** * 执行SQL, 返回指定字段的值的数组 * @param sql * @param values * @param fieldName 字段名称,或需要的字段数量(从第1个字段开始算) */ queryValues(sql, values, fieldName, defaultValue, onRaw) { return __awaiter(this, void 0, void 0, function* () { const [acquire, conn] = yield this.initConnection(); return new Promise((resolve, reject) => { conn.query(sql, values, (err, results, fields) => { if (err) { reject(err); } else { if (onRaw) { this.doRawResult(results, onRaw); } if (results && results.length > 0 && fields) { const data = results[0]; const result = []; if (fieldName !== undefined) { if (typeof fieldName === 'number') { fields.forEach((v, idx) => { if (idx < fieldName) { result.push(data[v.name]); } }); } else { fieldName.forEach((v, idx) => { result.push(data[v ? v : fields[idx].name]); }); } } resolve(result); } else { resolve(defaultValue !== null && defaultValue !== void 0 ? defaultValue : []); } } if (acquire) { this.release(); } }); }); }); } /** * 执行SQL查询 * @param sql * @param values */ queryData(classType, sql, values, onRaw) { return __awaiter(this, void 0, void 0, function* () { const data = yield this.query(sql, values, onRaw); return data && data.length > 0 ? (classType === undefined ? data[0] : model_helper_1.ModelHelper.toModel(data[0], classType)) : undefined; }); } /** * 执行查询, 返回 Array * @param sql sql 语句 * @param values 查询参数 */ queryDatas(classType, sql, values, onRaw) { return __awaiter(this, void 0, void 0, function* () { let result = []; const data = yield this.query(sql, values, onRaw); if (data && data.length > 0) { result = model_helper_1.ModelHelper.toArrayModel(data, classType); } return result; }); } /** * 执行查询, 返回 [Array, Count] * @param sql sql 语句 * @param values 查询参数 * @param countSql 获取总行数的 sql (不设置会自动生成,但某些复杂或特殊情况可能会出错,比如字段列表中中带子查询等),总行数字段名 `rowCount` */ queryDatasAndCount(classType, sql, values, countSql, onRaw) { return __awaiter(this, void 0, void 0, function* () { const _countSql = countSql ? countSql : db_script_1.DBScript.rowCountSql(sql, 1); const v = yield this.transaction((db) => __awaiter(this, void 0, void 0, function* () { let result = [[], 0]; let data = yield this.query(_countSql, values); if (data && data.length === 1) { result[1] = Number(data[0].rowCount); } result[0] = yield this.query(sql, values, onRaw); return result; })); return [v[0] && v[0].length > 0 ? model_helper_1.ModelHelper.toArrayModel(v[0], classType) : [], v[1]]; }); } /** * 执行SQL语句,返回受影响的行数 * @param sql * @param values * @returns 返回值 < 0 说明更新失败, = 0 说明没有更改任何数据 */ execute(sql, values, onRaw) { return __awaiter(this, void 0, void 0, function* () { const result = yield this.query(sql, values, onRaw); return result ? result.affectedRows : -1; }); } /** * 执行SQL插入语句,返回插入成功后的主键ID * @param sql * @param values 插入失败返回 `undefined` */ insert(sql, values, onRaw) { return __awaiter(this, void 0, void 0, function* () { const result = yield this.query(sql, values, onRaw); return result ? result.insertId : undefined; }); } /** * 开启事务,在回调中执行 query ,出错自动回滚,正确执行时自动提交事务 * @param callback 事务回调 * @param onFinish 事务执行完成回调 */ transaction(callback, onFinish) { return __awaiter(this, void 0, void 0, function* () { const [acquire, conn] = yield this.initConnection(); const startTime = new Date().getTime(); const doFinish = (value, flag = true) => { if (onFinish) { onFinish(value, new Date().getTime() - startTime, flag); } }; const doBeginTransaction = (resolve, reject, err) => __awaiter(this, void 0, void 0, function* () { if (err) { try { conn.rollback(); } catch (e) { } if (acquire) { this.release(); } doFinish(undefined); reject(err); } else { this._trans = true; try { if (callback) { const result = yield callback(this); conn.commit(); doFinish(result); resolve(result); } else { doFinish(undefined); resolve(undefined); } } catch (e) { conn.rollback(); if (acquire) { this.release(); } doFinish(undefined); reject(e); } finally { this._trans = false; if (acquire) { this.release(); } } } }); return new Promise((resolve, reject) => { if (this._trans) { if (callback) { const result = callback(this); result.then(v => { doFinish(v, false); }); resolve(result); } else { doFinish(undefined, false); resolve(undefined); } return; } conn.beginTransaction((err) => { void doBeginTransaction(resolve, reject, err); }); }); }); } } exports.DBManager = DBManager; //# sourceMappingURL=db.manager.js.map