-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconnection.js
306 lines (224 loc) · 8.87 KB
/
connection.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
/**
* Created by gerardo on 1/28/2016.
*/
var mysql = require('mysql');
var Q = require('q');
var appconfig = require('./utils/config');
var config = {
host: appconfig.devDatabase.host,
user: appconfig.devDatabase.user,
password: appconfig.devDatabase.pass,
connectionLimit: 10,
database: appconfig.devDatabase.name,
port: 3306,
dateStrings: 'date',
debug: false
};
var pool = mysql.createPool(config);
pool.getConnection(function (error) {
if (error) {
throw error;
} else {
console.log('Conexion la BD "' + config.database + '" correcta.');
}
});
/**
* Metodo para hacer una consulta simple sin transacciones
* @author: [email protected]
* @date: 2/5/2016
* @params: arreglo de objetos con [{sql:'SELECT * FROM usuarios', values:'[]'}]
* @return promesa
* **/
var consultaSimple = function (conn, sql, values) {
//se crea objeto defer
var deferred = Q.defer();
//se validan parametros del query
values === undefined ? values = [] : null;
//se hace la consulta
conn.query(sql, values, function (error, result) {
if (error) {
//si hubo un error en el query falla la promesa y retorna el error
deferred.reject(error)
} else {
//si el query se realizo correctamente , retorna el resultado
deferred.resolve(result);
}//else
});//query
// retorna la promesa
return deferred.promise;
};//consulta simple
var query = function (sql, values) {
//se crea objeto defer
var deferred = Q.defer();
//se validan parametros del query
values === undefined ? values = [] : null;
//se obtiene una nueva conexion del pool
pool.getConnection(function (error, conn) {
if (error) {
throw error;
} else {
//se hace la consulta
conn.query(sql, values, function (error, result) {
if (error) {
//si hubo un error en el query falla la promesa y retorna el error
deferred.reject(error)
} else {
//si el query se realizo correctamente , retorna el resultado
deferred.resolve(result);
}//else
//conn.end();
});//query
}
conn.release();
});//pool
// retorna la promesa
return deferred.promise;
};//consulta simple
/**
* Metodo para hacer una consulta con transaccion
* @author: [email protected]
* @date: 2/5/2016
* @params: {sql} 'SELECT * FROM usuarios', {values} [] arreglo de valores de parametros}]
* @return promesa
* **/
var queryTrans = function (sql, values) {
//se crea objeto defer
var deferred = Q.defer();
//se validan parametros del query
values === undefined ? values = [] : null;
//se obtiene una nueva conexion del pool
pool.getConnection(function (error, conn) {
if (error) {
throw error;
} else {
//se empieza una transaccion
conn.beginTransaction(function (err) {
//se hace la consulta
conn.query(sql, values, function (error, result) {
if (error) {
//si hubo error en la transaccion
conn.rollback(function (err) {
//falla la promesa y retorna el error
deferred.reject(err);
console.error('Error en [QUERY-ROLLBACK] queryTrans ', err);
});
//si hubo un error en el query falla la promesa y retorna el error
deferred.reject(error)
} else {
//si el la transsacion se realizo correctamente se hace commit
conn.commit(function (err) {
if (err) {
// si hubo un error en el commit , falla promesa y retorna error
deferred.reject(err);
console.error('Error en [COMMIT] queryTrans ', err);
//deshace los cambios que pudo haber hecho
conn.rollback(function (err) {
//falla la promesa y retorna el error
deferred.reject(err);
console.error('Error en [ROLLBACK-COMMIT] queryTrans ', err)
});
}//if
});//commit
//si el query se realizo correctamente , retorna el resultado
deferred.resolve(result);
}//else
});//query
});//transaction
}//if - error
//desocupa la conexion del pool
conn.release();
});//get conn
// retorna la promesa
return deferred.promise;
};//consulta
/**
* Metodo para hacer multiples query con una unica transaccion
* @author: [email protected]
* @date: 2/5/2016
* @params: arreglo de objetos con [{sql:'SELECT * FROM usuarios', values:'[]'}]
* @return promesa
* **/
var multipleQueryTrans = function (querys) {
//se crea objeto defer
var deferred = Q.defer();
// validamos que sea array
if (Array.isArray(querys)) {
//se obtiene una nueva conexion del pool
pool.getConnection(function (error, conn) {
if (error) {
throw error;
} else {
//se empieza una transaccion
conn.beginTransaction(function (err) {
//arreglo donde se guarada la cola de promesas
var promises = [];
//recorremos el array de consultas
for (var i = 0; i < querys.length; i++) {
//validamos que tengan values
querys[i].values === undefined ? querys[i].values = [] : null;
//se guarda la consulta en el arreglo
promises.push(consultaSimple(conn, querys[i].sql, querys[i].values));
}//for
// se ejecutan toda la cola de promesas
Q.all(promises)
.then(
function (result) {
//si el la transsaciones se realizaron correctamente se hace commit
conn.commit(function (err) {
if (err) {
// si hubo un error en el commit , falla promesa y retorna error
deferred.reject(err);
console.error('Error en [COMMIT] la consulta multiple ', err);
//deshace los cambios que pudo haber hecho
conn.rollback(function (err) {
//falla la promesa y retorna el error
deferred.reject(err);
console.error('Error en [ROLLBACK-COMMIT] la consulta multiple ', err)
});
}//if
});//commit
deferred.resolve(result);
}, function (err) {
conn.rollback(function (err) {
//falla la promesa y retorna el error
deferred.reject(err);
console.error('Error en [ROLLBACK] la consulta multiple ', err)
});
});
});//transaction begin
}//if - error en tomar conexion
});//get connection
}//is array
// retorna la promesa
return deferred.promise;
};//consulta
/**
* Metodo para hacer multiples query con transaccion individual
* @author: [email protected]
* @date: 2/5/2016
* @params: arreglo de objetos con [{sql:'SELECT * FROM usuarios', values:'[]'}]
* @return promesa
* **/
var multipleQuery = function (querys) {
// validamos que sea array
if (Array.isArray(querys)) {
//creamos un arreglo donde guardaremos las promesas
var promises = [];
//recorremos el array de consultas
for (var i = 0; i < querys.length; i++) {
//validamos que tengan values
querys[i].values === undefined ? querys[i].values = [] : null;
//se guardan las promises en el array
promises.push(queryTrans(querys[i].sql, querys[i].values));
}//for
}//if is array
// se ejecutan totas las promesas
return Q.all(promises);
};
module.exports = {
queryTrans: queryTrans,
query: query,
pool: pool,
multipleQuery: multipleQuery,
multipleQueryTrans: multipleQueryTrans
};