2017-12-14 16:36:39 +08:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @authors yutent (yutent@doui.cc)
|
|
|
|
* @date 2017-12-14 14:01:03
|
|
|
|
* @version $Id$
|
|
|
|
*/
|
|
|
|
|
|
|
|
const { escape } = require('mysql')
|
|
|
|
const parser = require('./parser')
|
|
|
|
|
|
|
|
class Method {
|
2018-03-06 20:48:41 +08:00
|
|
|
constructor(pool, slave, db) {
|
|
|
|
this.pool = pool
|
|
|
|
this.slave = slave
|
|
|
|
this.db = db
|
|
|
|
}
|
|
|
|
|
|
|
|
connect() {
|
|
|
|
this.defer = Promise.defer()
|
|
|
|
this.pool.getConnection(this.slave, (err, conn) => {
|
|
|
|
if (err) {
|
|
|
|
return this.defer.reject({ err: `MySQL connect ${err}`, sql: '' })
|
|
|
|
}
|
|
|
|
if (this.db) {
|
|
|
|
conn.query('USE ' + this.db, err => {
|
|
|
|
if (err) {
|
|
|
|
return this.defer.reject({ err: 'Select DB ' + err, sql: '' })
|
|
|
|
}
|
|
|
|
this.defer.resolve(conn)
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
this.defer.resolve(conn)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return this.defer.promise
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
listDb() {
|
2018-03-06 20:48:41 +08:00
|
|
|
return this.connect().then(conn => {
|
2017-12-14 16:36:39 +08:00
|
|
|
const defer = Promise.defer()
|
|
|
|
|
2018-03-06 17:54:10 +08:00
|
|
|
conn.query('SHOW DATABASES', (err, row) => {
|
2018-03-06 20:48:41 +08:00
|
|
|
conn.release()
|
2017-12-14 16:36:39 +08:00
|
|
|
if (err) {
|
2018-03-06 17:54:10 +08:00
|
|
|
return defer.reject({
|
|
|
|
err: 'SHOW DATABASES ' + err,
|
|
|
|
sql: ''
|
|
|
|
})
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
defer.resolve(row.map(it => it.Database))
|
|
|
|
})
|
|
|
|
|
|
|
|
return defer.promise
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
//返回数据表
|
|
|
|
listTable() {
|
2018-03-06 20:48:41 +08:00
|
|
|
return this.connect().then(conn => {
|
2017-12-14 16:36:39 +08:00
|
|
|
const defer = Promise.defer()
|
|
|
|
|
2018-03-06 17:54:10 +08:00
|
|
|
conn.query('SHOW TABLES', (err, row) => {
|
2018-03-06 20:48:41 +08:00
|
|
|
conn.release()
|
2017-12-14 16:36:39 +08:00
|
|
|
if (err) {
|
2018-03-06 17:54:10 +08:00
|
|
|
return defer.reject({
|
|
|
|
err: 'SHOW TABLES ' + err,
|
|
|
|
sql: ''
|
|
|
|
})
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
defer.resolve(row.map(it => Object.values(it)[0]))
|
|
|
|
})
|
|
|
|
|
|
|
|
return defer.promise
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* [query sql语句执行]
|
|
|
|
* @param {[type]} sql [sql语句]
|
|
|
|
*/
|
|
|
|
query(sql) {
|
2018-03-06 20:48:41 +08:00
|
|
|
if (typeof sql !== 'string') {
|
2018-03-06 17:54:10 +08:00
|
|
|
return Promise.reject({
|
|
|
|
err: `Query error, argument sql must be string. ${typeof sql} given`,
|
2018-03-06 20:48:41 +08:00
|
|
|
sql: sql
|
2018-03-06 17:54:10 +08:00
|
|
|
})
|
2018-03-06 20:48:41 +08:00
|
|
|
}
|
2017-12-14 16:36:39 +08:00
|
|
|
|
2018-03-06 20:48:41 +08:00
|
|
|
return this.connect().then(conn => {
|
2017-12-14 16:36:39 +08:00
|
|
|
const defer = Promise.defer()
|
|
|
|
|
|
|
|
conn.query(sql, (err, result) => {
|
2018-03-06 20:48:41 +08:00
|
|
|
conn.release()
|
2017-12-14 16:36:39 +08:00
|
|
|
if (err) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return defer.reject({ err: `Query ${err}`, sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
defer.resolve(result)
|
|
|
|
})
|
|
|
|
return defer.promise
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2018-03-03 20:48:51 +08:00
|
|
|
find(condition, select) {
|
2017-12-14 16:36:39 +08:00
|
|
|
const { table, leftJoin, rightJoin, join, where, sort, limit } = condition
|
2018-03-06 17:54:10 +08:00
|
|
|
let sql = ''
|
2017-12-14 16:36:39 +08:00
|
|
|
if (!table) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return Promise.reject({ err: 'Find Error: empty table', sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
2018-03-06 17:54:10 +08:00
|
|
|
sql = parser.select(select)
|
2018-03-03 20:10:31 +08:00
|
|
|
sql += `FROM ${table} `
|
2017-12-14 16:36:39 +08:00
|
|
|
if (leftJoin) {
|
|
|
|
sql += parser.leftJoin(leftJoin)
|
|
|
|
}
|
|
|
|
if (rightJoin) {
|
|
|
|
sql += parser.rightJoin(rightJoin)
|
|
|
|
}
|
|
|
|
if (join) {
|
|
|
|
sql += parser.join(join)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (where) {
|
|
|
|
sql += parser.where(where)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sort) {
|
|
|
|
sql += parser.sort(sort)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (limit) {
|
|
|
|
sql += parser.limit(limit)
|
|
|
|
}
|
|
|
|
|
2018-03-06 20:48:41 +08:00
|
|
|
return this.connect().then(conn => {
|
2017-12-14 16:36:39 +08:00
|
|
|
const defer = Promise.defer()
|
|
|
|
|
|
|
|
conn.query(sql, (err, result) => {
|
2018-03-06 20:48:41 +08:00
|
|
|
conn.release()
|
2017-12-14 16:36:39 +08:00
|
|
|
if (err) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return defer.reject({ err: `Find ${err}`, sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
defer.resolve(result)
|
|
|
|
})
|
|
|
|
return defer.promise
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2018-03-03 20:48:51 +08:00
|
|
|
findOne(condition, select) {
|
2017-12-14 16:36:39 +08:00
|
|
|
condition.limit = [1]
|
2018-03-06 17:54:10 +08:00
|
|
|
return this.find(condition, select).then(row => {
|
2017-12-14 16:36:39 +08:00
|
|
|
return row[0] || null
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
count(condition) {
|
|
|
|
delete condition.limit
|
2018-03-06 17:54:10 +08:00
|
|
|
return this.find(condition, ['count(*) AS total']).then(row => {
|
2017-12-14 16:36:39 +08:00
|
|
|
return (row[0] && row[0].total) || 0
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
insert({ table }, doc) {
|
2018-03-06 17:54:10 +08:00
|
|
|
let sql = ''
|
2017-12-14 16:36:39 +08:00
|
|
|
if (!table) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return Promise.reject({ err: 'Insert Error: empty table', sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
2018-03-06 17:54:10 +08:00
|
|
|
sql = `INSERT INTO ${table} `
|
2017-12-14 16:36:39 +08:00
|
|
|
let keys = []
|
|
|
|
let vals = []
|
|
|
|
|
|
|
|
for (let i in doc) {
|
|
|
|
keys.push(i)
|
|
|
|
vals.push(escape(doc[i]))
|
|
|
|
}
|
|
|
|
sql += `(${keys.join(',')}) VALUES (${vals.join(',')})`
|
|
|
|
|
2018-03-06 20:48:41 +08:00
|
|
|
return this.connect().then(conn => {
|
2017-12-14 16:36:39 +08:00
|
|
|
const defer = Promise.defer()
|
|
|
|
|
|
|
|
conn.query(sql, (err, result) => {
|
2018-03-06 20:48:41 +08:00
|
|
|
conn.release()
|
2017-12-14 16:36:39 +08:00
|
|
|
if (err) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return defer.reject({ err: `Insert ${err}`, sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
defer.resolve(result.insertId)
|
|
|
|
})
|
|
|
|
|
|
|
|
return defer.promise
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
update({ table, where }, doc) {
|
2018-03-06 17:54:10 +08:00
|
|
|
let sql = ''
|
2017-12-14 16:36:39 +08:00
|
|
|
if (!table) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return Promise.reject({ err: 'Update Error: empty table', sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
2018-03-06 17:54:10 +08:00
|
|
|
sql = `UPDATE ${table} SET `
|
2017-12-14 16:36:39 +08:00
|
|
|
|
|
|
|
let fields = [] //要更新的字段
|
|
|
|
for (let i in doc) {
|
2018-02-22 00:43:10 +08:00
|
|
|
let val = doc[i]
|
|
|
|
if (typeof val === 'object' && val.$sql) {
|
|
|
|
val = `(${val.$sql})`
|
|
|
|
} else {
|
|
|
|
val = escape(val)
|
|
|
|
}
|
|
|
|
fields.push(i + ' = ' + val)
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
sql += fields.join(',')
|
|
|
|
sql += parser.where(where)
|
|
|
|
|
2018-03-06 20:48:41 +08:00
|
|
|
return this.connect().then(conn => {
|
2017-12-14 16:36:39 +08:00
|
|
|
const defer = Promise.defer()
|
|
|
|
conn.query(sql, (err, res) => {
|
2018-03-06 20:48:41 +08:00
|
|
|
conn.release()
|
2017-12-14 16:36:39 +08:00
|
|
|
if (err) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return defer.reject({ err: `Update ${err}`, sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
defer.resolve(res.affectedRows)
|
|
|
|
})
|
|
|
|
return defer.promise
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
remove({ table, where }) {
|
2018-03-06 17:54:10 +08:00
|
|
|
let sql = ''
|
2017-12-14 16:36:39 +08:00
|
|
|
if (!table) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return Promise.reject({ err: 'Remove Error: empty table', sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
2018-03-06 17:54:10 +08:00
|
|
|
sql = `DELETE FROM \`${table}\` `
|
2017-12-14 16:36:39 +08:00
|
|
|
|
|
|
|
if (where) {
|
|
|
|
sql += parser.where(where)
|
|
|
|
}
|
|
|
|
|
2018-03-06 20:48:41 +08:00
|
|
|
return this.connect().then(conn => {
|
2017-12-14 16:36:39 +08:00
|
|
|
const defer = Promise.defer()
|
|
|
|
conn.query(sql, (err, res) => {
|
2018-03-06 20:48:41 +08:00
|
|
|
conn.release()
|
2017-12-14 16:36:39 +08:00
|
|
|
if (err) {
|
2018-03-06 20:48:41 +08:00
|
|
|
return defer.reject({ err: `Remove ${err}`, sql: sql })
|
2017-12-14 16:36:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
defer.resolve(res.affectedRows)
|
|
|
|
})
|
|
|
|
return defer.promise
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = Method
|