j7/db.js
2022-03-15 13:15:30 +08:00

156 lines
3.4 KiB
JavaScript

const util = require("util");
const log = require("./log");
class DB {
constructor(conn) {
this.conn = conn;
}
execQuery(sql, params) {
return new Promise((resolve) => {
const ret = {
err: null,
rows: null,
};
this.conn.query(sql, params, (err, rows) => {
try {
if (err) {
ret.err = err;
resolve(ret);
log.error(util.format(
'sql:%s err:%s',
sql, err
));
} else {
ret.err = err;
ret.rows = rows;
resolve(ret);
}
} finally {
//this.conn.release();
}
});
});
}
async execQueryOne(sql, params) {
const {err, rows} = await this.execQuery(sql, params);
return {
'err': err,
'row': rows && rows.length > 0 ? rows[0] : null
};
}
async execScript(sql, params) {
const {err, rows} = await this.execQuery(sql, params);
return err;
}
async update(tblName, whereList, fieldList) {
const params = [];
let sql = 'UPDATE `' + tblName + '` SET ';
fieldList.forEach((item, index) => {
const suffix = (index + 1 < fieldList.length ? ',': '');
sql += ' `' + item[0] + '`=?' + suffix;
params.push(item[1]);
});
sql += ' WHERE 1=1';
whereList.forEach((item, index) => {
sql += ' AND ' + item[0] + '=?';
params.push(item[1]);
});
this.execScript(sql, params);
}
async insert(tblName, fieldList) {
const params = [];
let sql = 'INSERT INTO `' + tblName + '` (';
fieldList.forEach((item, index) => {
const suffix = (index + 1 < fieldList.length ? ',': '');
sql += '`' + item[0] + '`' + suffix;
});
sql += ') VALUES (';
fieldList.forEach((item, index) => {
const suffix = (index + 1 < fieldList.length ? ',': '');
sql += '?' + suffix;
params.push(item[1]);
});
sql += ')';
this.execScript(sql, params);
}
async upsert(tblName, whereList, updateList, insertList, opts = null) {
const params = [];
let sql = 'SELECT * FROM `' + tblName + '` ';
{
sql += ' WHERE 1=1';
whereList.forEach((item, index) => {
sql += ' AND ' + item[0] + '=?';
params.push(item[1]);
});
sql += ' LIMIT 1;'
}
const {err, row} = await this.execQueryOne
(
sql,
params
);
if (err) {
return;
}
if (row) {
if (opts && utils.getVal(opts, 'onQueryOk')) {
opts['onQueryOk'](row);
}
await this.update(tblName, whereList, updateList);
} else {
await this.insert(tblName, insertList);
}
}
async _delete(tblName, whereList) {
const params = [];
let sql = 'DELETE FROM `' + tblName + '` ';
sql += ' WHERE 1=1';
whereList.forEach((item, index) => {
sql += ' AND ' + item[0] + '=?';
params.push(item[1]);
});
this.execScript(sql, params);
}
async ormSelect(tblName, whereList) {
const params = [];
let sql = 'SELECT * FROM `' + tblName + '` ';
sql += ' WHERE 1=1';
whereList.forEach((item, index) => {
sql += ' AND ' + item[0] + '=?';
params.push(item[1]);
});
return this.execQuery(sql, params);
}
async ormSelectOne(tblName, whereList) {
const {err, rows} = await this.ormSelect(tblName, whereList);
return {
'err': err,
'row': rows.length > 0 ? rows[0] : null
};
}
}
module.exports = DB;