ts-api-core
Version:
Nodejs api framework core
322 lines • 12.5 kB
JavaScript
"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