From b5330c859c839697ca005616e086ceeaeddbe94a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=87=E5=A4=A9?= Date: Thu, 22 Feb 2018 00:43:10 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=9D=A1=E4=BB=B6=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E5=87=BD=E6=95=B0;=E4=BC=98=E5=8C=96=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 2 ++ lib/method.js | 26 +++++++------- lib/parser.js | 96 +++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 105 insertions(+), 19 deletions(-) diff --git a/index.js b/index.js index 623d11f..c44e116 100644 --- a/index.js +++ b/index.js @@ -73,6 +73,8 @@ class Mysqli { } defer.resolve(conn) }) + } else { + defer.resolve(conn) } }) return new Method(defer.promise) diff --git a/lib/method.js b/lib/method.js index 84805f6..031c5d0 100644 --- a/lib/method.js +++ b/lib/method.js @@ -22,7 +22,6 @@ class Method { return defer.reject('SHOW databases ' + err) } defer.resolve(row.map(it => it.Database)) - // conn.release() }) return defer.promise @@ -39,7 +38,6 @@ class Method { return defer.reject('SHOW tables ' + err) } defer.resolve(row.map(it => Object.values(it)[0])) - // conn.release() }) return defer.promise @@ -61,9 +59,7 @@ class Method { conn.query(sql, (err, result) => { if (err) { - return defer.reject( - `Query ${err}; \nLast exec SQL:「${this.lastSql}」` - ) + return defer.reject(`Query ${err}; \nLast exec SQL:「${sql}」`) } defer.resolve(result) }) @@ -107,9 +103,7 @@ class Method { conn.query(sql, (err, result) => { if (err) { - return defer.reject( - `Filter ${err}; \nLast exec SQL:「${this.lastSql}」` - ) + return defer.reject(`Filter ${err}; \nLast exec SQL:「${sql}」`) } defer.resolve(result) }) @@ -151,7 +145,7 @@ class Method { conn.query(sql, (err, result) => { if (err) { - return defer.reject(`Insert ${err}; Last exec SQL: ${sql}`) + return defer.reject(`Insert ${err}; \nLast exec SQL: ${sql}`) } defer.resolve(result.insertId) @@ -166,11 +160,17 @@ class Method { return Promise.reject('Update Error: empty table') } - let sql = `UPDATE \`${table}\` SET ` + let sql = `UPDATE ${table} SET ` let fields = [] //要更新的字段 for (let i in doc) { - fields.push(i + ' = ' + escape(doc[i])) + let val = doc[i] + if (typeof val === 'object' && val.$sql) { + val = `(${val.$sql})` + } else { + val = escape(val) + } + fields.push(i + ' = ' + val) } sql += fields.join(',') sql += parser.where(where) @@ -179,7 +179,7 @@ class Method { const defer = Promise.defer() conn.query(sql, (err, res) => { if (err) { - return defer.reject(`Update ${err}; Last exec SQL: ${sql}`) + return defer.reject(`Update ${err}; \nLast exec SQL: ${sql}`) } defer.resolve(res.affectedRows) @@ -203,7 +203,7 @@ class Method { const defer = Promise.defer() conn.query(sql, (err, res) => { if (err) { - return defer.reject(`Remove ${err}; Last exec SQL: ${sql}`) + return defer.reject(`Remove ${err}; \nLast exec SQL: ${sql}`) } defer.resolve(res.affectedRows) diff --git a/lib/parser.js b/lib/parser.js index 3733d95..9fbe7da 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -11,7 +11,7 @@ const { escape } = require('mysql') * @param [array] arr [条件数组] */ -function parseWhere(arr) { +/*function parseWhere(arr) { if (typeof arr === 'string' && !!arr) { return ' WHERE ' + arr } else if (Array.isArray(arr) && arr.length > 0) { @@ -36,13 +36,82 @@ function parseWhere(arr) { } else { return ' ' } +}*/ + +function getType(val) { + if (val === null) { + return String(val) + } + return Object.prototype.toString + .call(val) + .slice(8, -1) + .toLowerCase() +} +function parse$or(arr) { + let sql = '' + for (let it of arr) { + sql += '(' + if (it.$and) { + sql += parse$and(it.$and) + } else { + sql += parse$opt(it) + } + sql += ') OR ' + } + sql = sql.slice(0, -3) + return sql +} +function parse$and(arr) { + let sql = '' + for (let it of arr) { + sql += '(' + if (it.$or) { + sql += parse$or(it.$or) + } else { + sql += parse$opt(it) + } + sql += ') AND ' + } + sql = sql.slice(0, -4) + return sql +} + +function parse$opt(opt) { + let sql = '' + for (let k in opt) { + let tmp = opt[k] + switch (getType(tmp)) { + case 'object': + if (tmp.$like) { + sql += ` ${k} LIKE ${escape(tmp.$like)} ` + break + } + if (tmp.$sql) { + sql += ` ${k} IN ${tmp.$sql} ` + break + } + + if (tmp.$in) { + let list = tmp.$in.map(it => { + return escape(it) + }) + sql += ` ${k} IN (${list.join(',')}) ` + break + } + default: + sql += ` ${k} = ${escape(tmp)}` + } + sql += ' AND ' + } + sql = sql.slice(0, -4) + return sql } const Parser = { leftJoin(tables) { let sql = '' for (let it of tables) { - sql += ` LEFT JOIN ${it[0]} ON ${it[1]} ` + sql += ` LEFT JOIN ${it.table} ON ${it.on} ` } return sql }, @@ -50,7 +119,7 @@ const Parser = { rightJoin(tables) { let sql = '' for (let it of tables) { - sql += ` RIGHT JOIN ${it[0]} ON ${it[1]} ` + sql += ` RIGHT JOIN ${it.table} ON ${it.on} ` } return sql }, @@ -58,13 +127,28 @@ const Parser = { join(tables) { let sql = '' for (let it of tables) { - sql += ` JOIN ${it[0]} ON ${it[1]} ` + sql += ` JOIN ${it[0]} ON ${it.on} ` } return sql }, - where(where = '') { - return parseWhere(where) + where(opt) { + if (typeof opt === 'string') { + return ` WHERE ${opt} ` + } + if (typeof opt === 'function') { + return ` WHERE ${opt()} ` + } + if (typeof opt === 'object') { + if (opt.$and) { + return parse$and(opt.$and) + } else if (opt.$or) { + return parse$or(opt.$or) + } + return parse$opt(opt) + } + + return ' ' }, select(arr = ['*']) {