-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconnect.js
75 lines (54 loc) · 1.74 KB
/
connect.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
'use strict';
const debug = require('debug')('mysql-query');
/**
* Wrap complicated async process in sql query into single async call
* @param {string} method
* @param {string} sql
* @param {*} values
* @param {Function} callback
* @return {Function}
*/
module.exports = function connect(method, sql, values, callback) {
// values might be function, in that case, the functin might be callback inserted by util-asyncflow
// so, we do not auto-switch option to avoid wierd bug
return function(err, conn) {
if (err) {
err.original = {message: 'getConnection() error', method};
return callback(err);
}
var query = conn.query(sql, values, function(err, res, fields) {
debug(serialQuery(query));
if (res && (res.warningCount || res.warningStatus)) {
// check what error happened via show warnings
conn.query('show warnings', function(err, res) {
conn.release();
// show warnings but got error
if (err) {
err.original = errOriginal(method + ': has warnings but got error in show warnings', query);
return callback(err);
}
err = new Error(method +': show warnings');
err.original = Object.assign({ warnings:res }, errOriginal(method, query));
return callback(err);
});
return;
}
conn.release();
if (err) {
err.original = errOriginal(method, query);
return callback(err);
}
callback(null, res, fields);
})
}
};
function errOriginal(message, query) {
return Object.assign({message}, serialQuery(query));
}
function serialQuery(query) {
if (query !== Object(query)) return {};
return {
sql: query.sql,
values: query.values
}
}