mysql2-core 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.ts CHANGED
@@ -1,684 +1,1147 @@
1
- import { Connection, createPool as createPool2, FieldPacket, format, OkPacket, Pool, PoolConnection, ResultSetHeader } from 'mysql2';
2
- import { buildToSave, buildToSaveBatch } from './build';
3
- import { Attribute, Attributes, Manager, Statement, StringMap } from './metadata';
1
+ import { Connection, createPool as createPool2, FieldPacket, Pool, PoolConnection, ResultSetHeader } from "mysql2"
2
+ import { buildToSave, buildToSaveBatch } from "./build"
3
+ import { Attribute, Attributes, DB, Statement, StringMap, Transaction } from "./metadata"
4
4
 
5
- export * from './metadata';
6
- export * from './build';
5
+ export * from "./build"
6
+ export * from "./metadata"
7
7
 
8
8
  // tslint:disable-next-line:class-name
9
9
  export class resource {
10
- static string?: boolean;
10
+ static string?: boolean
11
+ static multipleStatements?: boolean
11
12
  }
12
13
  export interface Config {
13
- host?: string | undefined;
14
- port?: number;
15
- server?: string | undefined;
16
- database?: string | undefined;
17
- user?: string | undefined;
18
- password?: string | undefined;
19
- multipleStatements?: boolean | undefined;
20
- connectionLimit?: number | undefined;
21
- max?: number | undefined;
22
- min?: number | undefined;
23
- idleTimeoutMillis?: number | undefined;
14
+ host?: string | undefined
15
+ port?: number
16
+ server?: string | undefined
17
+ database?: string | undefined
18
+ user?: string | undefined
19
+ password?: string | undefined
20
+ multipleStatements?: boolean | undefined
21
+ connectionLimit?: number | undefined
22
+ max?: number | undefined
23
+ min?: number | undefined
24
+ idleTimeoutMillis?: number | undefined
24
25
  }
25
26
  export function createPool(conf: Config): Pool {
26
27
  if (conf.max && conf.max > 0 && !conf.connectionLimit) {
27
- conf.connectionLimit = conf.max;
28
+ conf.connectionLimit = conf.max
29
+ }
30
+ const pool = createPool2({ ...conf, rowsAsArray: true })
31
+ return pool
32
+ }
33
+ export function getConnection(pool: Pool): Promise<PoolConnection> {
34
+ return new Promise<PoolConnection>((resolve, reject) => {
35
+ pool.getConnection((err, connection) => {
36
+ if (err) {
37
+ return reject(err)
38
+ }
39
+ return resolve(connection)
40
+ })
41
+ })
42
+ }
43
+ export function beginTransaction(connection: PoolConnection, rollbackIfError?: boolean): Promise<void> {
44
+ return new Promise<void>((resolve, reject) => {
45
+ connection.beginTransaction((err) => {
46
+ if (err) {
47
+ if (!rollbackIfError) {
48
+ return reject(err)
49
+ }
50
+ connection.rollback(() => {
51
+ return reject(err)
52
+ })
53
+ }
54
+ return resolve()
55
+ })
56
+ })
57
+ }
58
+ export function commit(connection: PoolConnection, rollbackIfError?: boolean): Promise<void> {
59
+ return new Promise<void>((resolve, reject) => {
60
+ connection.commit((err) => {
61
+ if (err) {
62
+ if (!rollbackIfError) {
63
+ return reject(err)
64
+ }
65
+ connection.rollback(() => {
66
+ return reject(err)
67
+ })
68
+ }
69
+ resolve()
70
+ })
71
+ })
72
+ }
73
+ export function rollback(connection: PoolConnection): Promise<void> {
74
+ return new Promise<void>((resolve, reject) => {
75
+ connection.rollback((err) => {
76
+ if (err) {
77
+ return reject(err)
78
+ }
79
+ resolve()
80
+ })
81
+ })
82
+ }
83
+ // tslint:disable-next-line:max-classes-per-file
84
+ export class PoolManager implements DB {
85
+ constructor(protected pool: Pool) {
86
+ this.param = this.param.bind(this)
87
+ this.execute = this.execute.bind(this)
88
+ this.executeBatch = this.executeBatch.bind(this)
89
+ this.query = this.query.bind(this)
90
+ this.queryOne = this.queryOne.bind(this)
91
+ this.executeScalar = this.executeScalar.bind(this)
92
+ this.count = this.count.bind(this)
93
+ }
94
+ driver = "mysql"
95
+ param(i: number): string {
96
+ return "?"
97
+ }
98
+ beginTransaction(): Promise<Transaction> {
99
+ return new Promise<Transaction>((resolve, reject) => {
100
+ this.pool.getConnection((er0, connection) => {
101
+ if (er0) {
102
+ return reject(er0)
103
+ }
104
+ connection.beginTransaction((er1) => {
105
+ if (er1) {
106
+ connection.rollback(() => {
107
+ return reject(er1)
108
+ })
109
+ }
110
+ const tx = new PoolConnectionManager(connection)
111
+ return resolve(tx)
112
+ })
113
+ })
114
+ })
115
+ }
116
+ execute(sql: string, args?: any[], ctx?: any): Promise<number> {
117
+ const p = ctx ? ctx : this.pool
118
+ return execute(p, sql, args)
119
+ }
120
+ executeBatch(statements: Statement[], firstSuccess?: boolean, ctx?: any): Promise<number> {
121
+ const p = ctx ? ctx : this.pool
122
+ return executeBatch(p, statements, firstSuccess)
123
+ }
124
+ query<T>(sql: string, args?: any[], m?: StringMap, bools?: Attribute[], ctx?: any): Promise<T[]> {
125
+ const p = ctx ? ctx : this.pool
126
+ return query(p, sql, args, m, bools)
127
+ }
128
+ queryOne<T>(sql: string, args?: any[], m?: StringMap, bools?: Attribute[], ctx?: any): Promise<T | null> {
129
+ const p = ctx ? ctx : this.pool
130
+ return queryOne(p, sql, args, m, bools)
131
+ }
132
+ executeScalar<T>(sql: string, args?: any[], ctx?: any): Promise<T> {
133
+ const p = ctx ? ctx : this.pool
134
+ return executeScalar<T>(p, sql, args)
135
+ }
136
+ count(sql: string, args?: any[], ctx?: any): Promise<number> {
137
+ const p = ctx ? ctx : this.pool
138
+ return count(p, sql, args)
28
139
  }
29
- const pool = createPool2({...conf, rowsAsArray: true});
30
- return pool;
31
140
  }
32
-
33
141
  // tslint:disable-next-line:max-classes-per-file
34
- export class PoolManager implements Manager {
35
- constructor(public pool: Pool) {
36
- this.param = this.param.bind(this);
37
- this.exec = this.exec.bind(this);
38
- this.execBatch = this.execBatch.bind(this);
39
- this.query = this.query.bind(this);
40
- this.queryOne = this.queryOne.bind(this);
41
- this.execScalar = this.execScalar.bind(this);
42
- this.count = this.count.bind(this);
43
- }
44
- driver = 'mysql';
142
+ export class PoolConnectionManager implements Transaction {
143
+ constructor(protected connection: PoolConnection) {
144
+ this.param = this.param.bind(this)
145
+ this.execute = this.execute.bind(this)
146
+ this.executeBatch = this.executeBatch.bind(this)
147
+ this.query = this.query.bind(this)
148
+ this.queryOne = this.queryOne.bind(this)
149
+ this.executeScalar = this.executeScalar.bind(this)
150
+ this.count = this.count.bind(this)
151
+ }
152
+ driver = "mysql"
45
153
  param(i: number): string {
46
- return '?';
154
+ return "?"
155
+ }
156
+ commit(): Promise<void> {
157
+ return new Promise<void>((resolve, reject) => {
158
+ this.connection.commit((er3) => {
159
+ if (er3) {
160
+ return reject(er3)
161
+ }
162
+ return resolve()
163
+ })
164
+ })
165
+ }
166
+ rollback(): Promise<void> {
167
+ return new Promise<void>((resolve, reject) => {
168
+ this.connection.rollback((er3) => {
169
+ if (er3) {
170
+ return reject(er3)
171
+ }
172
+ return resolve()
173
+ })
174
+ })
47
175
  }
48
- exec(sql: string, args?: any[], ctx?: any): Promise<number> {
49
- const p = (ctx ? ctx : this.pool);
50
- return exec(p, sql, args);
176
+ execute(sql: string, args?: any[], ctx?: any): Promise<number> {
177
+ const p = ctx ? ctx : this.connection
178
+ return execute(p, sql, args)
51
179
  }
52
- execBatch(statements: Statement[], firstSuccess?: boolean, ctx?: any): Promise<number> {
53
- const p = (ctx ? ctx : this.pool);
54
- return execBatch(p, statements, firstSuccess);
180
+ executeBatch(statements: Statement[], firstSuccess?: boolean, ctx?: any): Promise<number> {
181
+ const p = ctx ? ctx : this.connection
182
+ return executeBatchConnection(p, statements, firstSuccess)
55
183
  }
56
184
  query<T>(sql: string, args?: any[], m?: StringMap, bools?: Attribute[], ctx?: any): Promise<T[]> {
57
- const p = (ctx ? ctx : this.pool);
58
- return query(p, sql, args, m, bools);
185
+ const p = ctx ? ctx : this.connection
186
+ return query(p, sql, args, m, bools)
59
187
  }
60
188
  queryOne<T>(sql: string, args?: any[], m?: StringMap, bools?: Attribute[], ctx?: any): Promise<T | null> {
61
- const p = (ctx ? ctx : this.pool);
62
- return queryOne(p, sql, args, m, bools);
189
+ const p = ctx ? ctx : this.connection
190
+ return queryOne(p, sql, args, m, bools)
63
191
  }
64
- execScalar<T>(sql: string, args?: any[], ctx?: any): Promise<T> {
65
- const p = (ctx ? ctx : this.pool);
66
- return execScalar<T>(p, sql, args);
192
+ executeScalar<T>(sql: string, args?: any[], ctx?: any): Promise<T> {
193
+ const p = ctx ? ctx : this.connection
194
+ return executeScalar<T>(p, sql, args)
67
195
  }
68
196
  count(sql: string, args?: any[], ctx?: any): Promise<number> {
69
- const p = (ctx ? ctx : this.pool);
70
- return count(p, sql, args);
197
+ const p = ctx ? ctx : this.connection
198
+ return count(p, sql, args)
71
199
  }
72
200
  }
73
- export function execBatch(pool: Pool, statements: Statement[], firstSuccess?: boolean): Promise<number> {
201
+ export async function executeBatch(pool: Pool, statements: Statement[], firstSuccess?: boolean): Promise<number> {
74
202
  if (!statements || statements.length === 0) {
75
- return Promise.resolve(0);
203
+ return Promise.resolve(0)
76
204
  } else if (statements.length === 1) {
77
- return exec(pool, statements[0].query, statements[0].params);
205
+ return execute(pool, statements[0].query, statements[0].params)
78
206
  }
79
- if (firstSuccess) {
80
- return new Promise<number>((resolve, reject) => {
81
- pool.getConnection((er0, connection) => {
82
- if (er0) {
83
- return reject(er0);
84
- }
85
- connection.beginTransaction(er1 => {
86
- if (er1) {
87
- connection.rollback(() => {
88
- return reject(er1);
89
- });
90
- } else {
91
- let query0 = '';
92
- const queries: string[] = [];
93
- const l = statements.length;
94
- for (let j = 0; j < l; j++) {
95
- const item = statements[j];
96
- if (j === 0) {
97
- query0 = format(item.query, toArray(item.params));
98
- } else {
99
- if (item.query.endsWith(';')) {
100
- queries.push(format(item.query, toArray(item.params)));
207
+ if (resource.multipleStatements) {
208
+ if (firstSuccess) {
209
+ return new Promise<number>((resolve, reject) => {
210
+ pool.getConnection((er0, connection) => {
211
+ if (er0) {
212
+ return reject(er0)
213
+ }
214
+ connection.beginTransaction((er1) => {
215
+ if (er1) {
216
+ connection.rollback(() => {
217
+ return reject(er1)
218
+ })
219
+ } else {
220
+ connection.execute<ResultSetHeader>(statements[0].query, toArray(statements[0].params), (er2a, results0) => {
221
+ if (er2a) {
222
+ connection.rollback(() => {
223
+ return reject(er2a)
224
+ })
101
225
  } else {
102
- queries.push(format(item.query + ';', toArray(item.params)));
226
+ if (results0 && results0.affectedRows === 0) {
227
+ connection.commit((er3) => {
228
+ if (er3) {
229
+ connection.rollback(() => {
230
+ return reject(er3)
231
+ })
232
+ }
233
+ })
234
+ return 0
235
+ } else {
236
+ const queries: string[] = []
237
+ const params: any[] = []
238
+ const l = statements.length
239
+ for (let j = 1; j < l; j++) {
240
+ const item = statements[j]
241
+ if (item.query.endsWith(";")) {
242
+ queries.push(item.query)
243
+ } else {
244
+ queries.push(item.query + ";")
245
+ }
246
+ if (item.params && item.params.length > 0) {
247
+ for (const p of item.params) {
248
+ params.push(p)
249
+ }
250
+ }
251
+ }
252
+ connection.execute<ResultSetHeader>(queries.join(""), toArray(params), (er2, results) => {
253
+ if (er2) {
254
+ connection.rollback(() => {
255
+ return reject(er2)
256
+ })
257
+ } else {
258
+ connection.commit((er3) => {
259
+ if (er3) {
260
+ connection.rollback(() => {
261
+ return reject(er3)
262
+ })
263
+ }
264
+ })
265
+ let c = 0
266
+ c += results0.affectedRows + results.affectedRows
267
+ return resolve(c)
268
+ }
269
+ })
270
+ }
103
271
  }
104
- }
272
+ })
105
273
  }
106
- connection.query<ResultSetHeader>(query0, (er2a, results0) => {
274
+ })
275
+ })
276
+ })
277
+ } else {
278
+ return new Promise<number>((resolve, reject) => {
279
+ pool.getConnection((er0, connection) => {
280
+ if (er0) {
281
+ return reject(er0)
282
+ }
283
+ connection.beginTransaction((er1) => {
284
+ if (er1) {
285
+ connection.rollback(() => {
286
+ return reject(er1)
287
+ })
288
+ } else {
289
+ const queries: string[] = []
290
+ const params: any[] = []
291
+ statements.forEach((item) => {
292
+ if (item.query.endsWith(";")) {
293
+ queries.push(item.query)
294
+ } else {
295
+ queries.push(item.query + ";")
296
+ }
297
+ if (item.params && item.params.length > 0) {
298
+ for (const p of item.params) {
299
+ params.push(p)
300
+ }
301
+ }
302
+ })
303
+ connection.execute<ResultSetHeader>(queries.join(""), toArray(params), (er2, results) => {
304
+ if (er2) {
305
+ connection.rollback(() => {
306
+ buildError(er2)
307
+ return reject(er2)
308
+ })
309
+ } else {
310
+ connection.commit((er3) => {
311
+ if (er3) {
312
+ connection.rollback(() => {
313
+ return reject(er3)
314
+ })
315
+ }
316
+ })
317
+ return resolve(results.affectedRows)
318
+ }
319
+ })
320
+ }
321
+ })
322
+ })
323
+ })
324
+ }
325
+ } else {
326
+ const connection = await getConnection(pool)
327
+ return executeBatchConnectionTx(connection, statements, firstSuccess)
328
+ }
329
+ }
330
+ export async function executeBatchConnectionTx(connection: PoolConnection, statements: Statement[], firstSuccess?: boolean): Promise<number> {
331
+ if (!statements || statements.length === 0) {
332
+ return Promise.resolve(0)
333
+ } else if (statements.length === 1) {
334
+ return execute(connection, statements[0].query, statements[0].params)
335
+ }
336
+ if (resource.multipleStatements) {
337
+ if (firstSuccess) {
338
+ return new Promise<number>((resolve, reject) => {
339
+ connection.beginTransaction((er1) => {
340
+ if (er1) {
341
+ connection.rollback(() => {
342
+ return reject(er1)
343
+ })
344
+ } else {
345
+ connection.execute<ResultSetHeader>(statements[0].query, toArray(statements[0].params), (er2a, results0) => {
107
346
  if (er2a) {
108
347
  connection.rollback(() => {
109
- return reject(er2a);
110
- });
348
+ return reject(er2a)
349
+ })
111
350
  } else {
112
351
  if (results0 && results0.affectedRows === 0) {
113
- return 0;
352
+ connection.commit((er3) => {
353
+ if (er3) {
354
+ connection.rollback(() => {
355
+ return reject(er3)
356
+ })
357
+ }
358
+ })
359
+ return 0
114
360
  } else {
115
- connection.query<OkPacket[]>(queries.join(''), (er2, results) => {
361
+ const queries: string[] = []
362
+ const params: any[] = []
363
+ const l = statements.length
364
+ for (let j = 1; j < l; j++) {
365
+ const item = statements[j]
366
+ if (item.query.endsWith(";")) {
367
+ queries.push(item.query)
368
+ } else {
369
+ queries.push(item.query + ";")
370
+ }
371
+ if (item.params && item.params.length > 0) {
372
+ for (const p of item.params) {
373
+ params.push(p)
374
+ }
375
+ }
376
+ }
377
+ connection.execute<ResultSetHeader>(queries.join(""), toArray(params), (er2, results) => {
116
378
  if (er2) {
117
379
  connection.rollback(() => {
118
- return reject(er2);
119
- });
380
+ return reject(er2)
381
+ })
120
382
  } else {
121
383
  connection.commit((er3) => {
122
384
  if (er3) {
123
385
  connection.rollback(() => {
124
- return reject(er3);
125
- });
386
+ return reject(er3)
387
+ })
126
388
  }
127
- });
128
- let c = 0;
129
- c += results0.affectedRows + results.reduce((prev, item) => prev + item.affectedRows, 0);
130
- return resolve(c);
389
+ })
390
+ let c = 0
391
+ c += results0.affectedRows + results.affectedRows
392
+ return resolve(c)
131
393
  }
132
- });
394
+ })
133
395
  }
134
396
  }
135
- });
397
+ })
136
398
  }
137
- });
138
- });
139
- });
140
- } else {
141
- return new Promise<number>((resolve, reject) => {
142
- pool.getConnection((er0, connection) => {
143
- if (er0) {
144
- return reject(er0);
145
- }
146
- connection.beginTransaction(er1 => {
399
+ })
400
+ })
401
+ } else {
402
+ return new Promise<number>((resolve, reject) => {
403
+ connection.beginTransaction((er1) => {
147
404
  if (er1) {
148
405
  connection.rollback(() => {
149
- return reject(er1);
150
- });
406
+ return reject(er1)
407
+ })
151
408
  } else {
152
- const queries: string[] = [];
153
- statements.forEach(item => {
154
- if (item.query.endsWith(';')) {
155
- queries.push(format(item.query, toArray(item.params)));
409
+ const queries: string[] = []
410
+ const params: any[] = []
411
+ statements.forEach((item) => {
412
+ if (item.query.endsWith(";")) {
413
+ queries.push(item.query)
156
414
  } else {
157
- queries.push(format(item.query + ';', toArray(item.params)));
415
+ queries.push(item.query + ";")
416
+ }
417
+ if (item.params && item.params.length > 0) {
418
+ for (const p of item.params) {
419
+ params.push(p)
420
+ }
158
421
  }
159
- });
160
- connection.query<OkPacket[]>(queries.join(''), (er2, results) => {
422
+ })
423
+ connection.execute<ResultSetHeader>(queries.join(""), toArray(params), (er2, results) => {
161
424
  if (er2) {
162
425
  connection.rollback(() => {
163
- buildError(er2);
164
- return reject(er2);
165
- });
426
+ buildError(er2)
427
+ return reject(er2)
428
+ })
166
429
  } else {
167
430
  connection.commit((er3) => {
168
431
  if (er3) {
169
432
  connection.rollback(() => {
170
- return reject(er3);
171
- });
433
+ return reject(er3)
434
+ })
172
435
  }
173
- });
174
- return resolve(results.reduce((prev, item) => prev + item.affectedRows, 0));
436
+ })
437
+ return resolve(results.affectedRows)
175
438
  }
176
- });
439
+ })
177
440
  }
178
- });
179
- });
180
- });
441
+ })
442
+ })
443
+ }
444
+ } else {
445
+ if (firstSuccess) {
446
+ try {
447
+ await beginTransaction(connection, true)
448
+ let count = await execute(connection, statements[0].query, toArray(statements[0].params))
449
+ if (count === 0) {
450
+ commit(connection, true)
451
+ return 0
452
+ }
453
+ const l = statements.length
454
+
455
+ for (let j = 1; j < l; j++) {
456
+ const item = statements[j]
457
+ const c = await execute(connection, item.query, toArray(item.params))
458
+ count = count + c
459
+ }
460
+ commit(connection, true)
461
+ return count
462
+ } catch (err) {
463
+ rollback(connection)
464
+ throw err
465
+ }
466
+ } else {
467
+ try {
468
+ await beginTransaction(connection, true)
469
+ let count = 0
470
+ const l = statements.length
471
+ for (let j = 0; j < l; j++) {
472
+ const item = statements[j]
473
+ const c = await execute(connection, item.query, toArray(item.params))
474
+ count = count + c
475
+ }
476
+ commit(connection, true)
477
+ return count
478
+ } catch (err) {
479
+ rollback(connection)
480
+ throw err
481
+ }
482
+ }
483
+ }
484
+ }
485
+ export async function executeBatchConnection(connection: PoolConnection, statements: Statement[], firstSuccess?: boolean): Promise<number> {
486
+ if (!statements || statements.length === 0) {
487
+ return Promise.resolve(0)
488
+ } else if (statements.length === 1) {
489
+ return execute(connection, statements[0].query, statements[0].params)
490
+ }
491
+ if (resource.multipleStatements) {
492
+ if (firstSuccess) {
493
+ return new Promise<number>((resolve, reject) => {
494
+ connection.execute<ResultSetHeader>(statements[0].query, toArray(statements[0].params), (er2a, results0) => {
495
+ if (er2a) {
496
+ return reject(er2a)
497
+ } else {
498
+ if (results0 && results0.affectedRows === 0) {
499
+ return 0
500
+ } else {
501
+ const queries: string[] = []
502
+ const params: any[] = []
503
+ const l = statements.length
504
+ for (let j = 1; j < l; j++) {
505
+ const item = statements[j]
506
+ if (item.query.endsWith(";")) {
507
+ queries.push(item.query)
508
+ } else {
509
+ queries.push(item.query + ";")
510
+ }
511
+ if (item.params && item.params.length > 0) {
512
+ for (const p of item.params) {
513
+ params.push(p)
514
+ }
515
+ }
516
+ }
517
+ connection.execute<ResultSetHeader>(queries.join(""), toArray(params), (er2, results) => {
518
+ if (er2) {
519
+ return reject(er2)
520
+ } else {
521
+ let c = 0
522
+ c += results0.affectedRows + results.affectedRows
523
+ return resolve(c)
524
+ }
525
+ })
526
+ }
527
+ }
528
+ })
529
+ })
530
+ } else {
531
+ return new Promise<number>((resolve, reject) => {
532
+ const queries: string[] = []
533
+ const params: any[] = []
534
+ statements.forEach((item) => {
535
+ if (item.query.endsWith(";")) {
536
+ queries.push(item.query)
537
+ } else {
538
+ queries.push(item.query + ";")
539
+ }
540
+ if (item.params && item.params.length > 0) {
541
+ for (const p of item.params) {
542
+ params.push(p)
543
+ }
544
+ }
545
+ })
546
+ connection.execute<ResultSetHeader>(queries.join(""), toArray(params), (er2, results) => {
547
+ if (er2) {
548
+ connection.rollback(() => {
549
+ buildError(er2)
550
+ return reject(er2)
551
+ })
552
+ } else {
553
+ connection.commit((er3) => {
554
+ if (er3) {
555
+ connection.rollback(() => {
556
+ return reject(er3)
557
+ })
558
+ }
559
+ })
560
+ return resolve(results.affectedRows)
561
+ }
562
+ })
563
+ })
564
+ }
565
+ } else {
566
+ if (firstSuccess) {
567
+ try {
568
+ let count = await execute(connection, statements[0].query, toArray(statements[0].params))
569
+ if (count === 0) {
570
+ return 0
571
+ }
572
+ const l = statements.length
573
+ try {
574
+ for (let j = 1; j < l; j++) {
575
+ const item = statements[j]
576
+ const c = await execute(connection, item.query, toArray(item.params))
577
+ count = count + c
578
+ }
579
+ return count
580
+ } catch (er1) {
581
+ throw er1
582
+ }
583
+ } catch (er0) {
584
+ throw er0
585
+ }
586
+ } else {
587
+ let count = 0
588
+ const l = statements.length
589
+ try {
590
+ for (let j = 0; j < l; j++) {
591
+ const item = statements[j]
592
+ const c = await execute(connection, item.query, toArray(item.params))
593
+ count = count + c
594
+ }
595
+ return count
596
+ } catch (err) {
597
+ throw err
598
+ }
599
+ }
181
600
  }
182
601
  }
183
602
  function buildError(err: any): any {
184
- if (err.errno === 1062 && err.code === 'ER_DUP_ENTRY') {
185
- err.error = 'duplicate';
603
+ if (err.errno === 1062 && err.code === "ER_DUP_ENTRY") {
604
+ err.error = "duplicate"
186
605
  }
187
- return err;
606
+ return err
188
607
  }
189
608
 
190
- export async function exec(pool: Pool, sql: string, args?: any[]): Promise<number> {
191
- const p = toArray(args);
609
+ export async function execute(pool: Pool | PoolConnection, sql: string, args?: any[]): Promise<number> {
610
+ const p = toArray(args)
192
611
  return new Promise<number>((resolve, reject) => {
193
612
  return pool.execute<ResultSetHeader>(sql, p, (err, res) => {
194
613
  if (err) {
195
- buildError(err);
196
- return reject(err);
614
+ buildError(err)
615
+ return reject(err)
197
616
  } else {
198
- return resolve(res.affectedRows);
617
+ return resolve(res.affectedRows)
199
618
  }
200
- });
201
- });
619
+ })
620
+ })
202
621
  }
203
622
  export async function query<T>(pool: Pool | PoolConnection, sql: string, args?: any[], m?: StringMap, bools?: Attribute[]): Promise<T[]> {
204
- const p = toArray(args);
623
+ const p = toArray(args)
205
624
  return new Promise((resolve, reject) => {
206
625
  return pool.query<T[] & ResultSetHeader>(sql, p, (err, results, fields) => {
207
626
  if (err) {
208
- return reject(err);
627
+ return reject(err)
209
628
  } else {
210
629
  if (results.length > 0) {
211
- const arrayResult = results.map(item => {
630
+ const arrayResult = results.map((item) => {
212
631
  if (Array.isArray(item)) {
213
- return formatData<T>(fields, item);
632
+ return formatData<T>(fields, item)
214
633
  } else {
215
- return item;
634
+ return item
216
635
  }
217
- });
218
- return resolve(handleResults(arrayResult, m, bools));
636
+ })
637
+ return resolve(handleResults(arrayResult, m, bools))
219
638
  } else {
220
- resolve([]);
639
+ resolve([])
221
640
  }
222
641
  }
223
- });
224
- });
642
+ })
643
+ })
225
644
  }
226
645
 
227
- export function queryOne<T>(pool: Pool, sql: string, args?: any[], m?: StringMap, bools?: Attribute[]): Promise<T | null> {
228
- return query<T>(pool, sql, args, m, bools).then(r => {
229
- return (r && r.length > 0 ? r[0] : null);
230
- });
646
+ export function queryOne<T>(pool: Pool | PoolConnection, sql: string, args?: any[], m?: StringMap, bools?: Attribute[]): Promise<T | null> {
647
+ return query<T>(pool, sql, args, m, bools).then((r) => {
648
+ return r && r.length > 0 ? r[0] : null
649
+ })
231
650
  }
232
- export function execScalar<T>(pool: Pool, sql: string, args?: any[]): Promise<T> {
233
- return queryOne<T>(pool, sql, args).then(r => {
651
+ export function executeScalar<T>(pool: Pool | PoolConnection, sql: string, args?: any[]): Promise<T> {
652
+ return queryOne<T>(pool, sql, args).then((r) => {
234
653
  if (!r) {
235
- return null;
654
+ return null
236
655
  } else {
237
- const keys = Object.keys(r);
238
- return (r as any)[keys[0]];
656
+ const keys = Object.keys(r)
657
+ return (r as any)[keys[0]]
239
658
  }
240
- });
659
+ })
241
660
  }
242
661
 
243
- export function count(pool: Pool, sql: string, args?: any[]): Promise<number> {
244
- return execScalar<number>(pool, sql, args);
662
+ export function count(pool: Pool | PoolConnection, sql: string, args?: any[]): Promise<number> {
663
+ return executeScalar<number>(pool, sql, args)
245
664
  }
246
665
 
247
- export function save<T>(pool: Pool | ((sql: string, args?: any[]) => Promise<number>), obj: T, table: string, attrs: Attributes, ver?: string, buildParam?: (i: number) => string, i?: number): Promise<number> {
248
- const s = buildToSave(obj, table, attrs, ver, buildParam);
249
- if (!s) {
250
- return Promise.resolve(-1);
666
+ export function save<T>(
667
+ pool: Pool | PoolConnection | ((sql: string, args?: any[]) => Promise<number>),
668
+ obj: T,
669
+ table: string,
670
+ attrs: Attributes,
671
+ ver?: string,
672
+ buildParam?: (i: number) => string,
673
+ i?: number,
674
+ ): Promise<number> {
675
+ const s = buildToSave(obj, table, attrs, ver, buildParam)
676
+ if (!s.query) {
677
+ return Promise.resolve(-1)
251
678
  }
252
- if (typeof pool === 'function') {
253
- return pool(s.query, s.params);
679
+ if (typeof pool === "function") {
680
+ return pool(s.query, s.params)
254
681
  } else {
255
- return exec(pool, s.query, s.params);
682
+ return execute(pool, s.query, s.params)
256
683
  }
257
684
  }
258
- export function saveBatch<T>(pool: Pool | ((statements: Statement[]) => Promise<number>), objs: T[], table: string, attrs: Attributes, ver?: string, buildParam?: (i: number) => string): Promise<number> {
259
- const s = buildToSaveBatch(objs, table, attrs, ver, buildParam);
260
- if (typeof pool === 'function') {
261
- return pool(s);
685
+ export function saveBatch<T>(
686
+ pool: Pool | ((statements: Statement[]) => Promise<number>),
687
+ objs: T[],
688
+ table: string,
689
+ attrs: Attributes,
690
+ ver?: string,
691
+ buildParam?: (i: number) => string,
692
+ ): Promise<number> {
693
+ const s = buildToSaveBatch(objs, table, attrs, ver, buildParam)
694
+ if (typeof pool === "function") {
695
+ return pool(s)
262
696
  } else {
263
- return execBatch(pool, s);
697
+ return executeBatch(pool, s)
264
698
  }
265
699
  }
266
700
  export function toArray(arr?: any[]): any[] {
267
701
  if (!arr || arr.length === 0) {
268
- return [];
702
+ return []
269
703
  }
270
- const p: any[] = [];
271
- const l = arr.length;
704
+ const p: any[] = []
705
+ const l = arr.length
272
706
  for (let i = 0; i < l; i++) {
273
707
  if (arr[i] === undefined || arr[i] == null) {
274
- p.push(null);
708
+ p.push(null)
275
709
  } else {
276
- if (typeof arr[i] === 'object') {
710
+ if (typeof arr[i] === "object") {
277
711
  if (arr[i] instanceof Date) {
278
- p.push(arr[i]);
712
+ p.push(arr[i])
279
713
  } else {
280
714
  if (resource.string) {
281
- const s: string = JSON.stringify(arr[i]);
282
- p.push(s);
715
+ const s: string = JSON.stringify(arr[i])
716
+ p.push(s)
283
717
  } else {
284
- p.push(arr[i]);
718
+ p.push(arr[i])
285
719
  }
286
720
  }
287
721
  } else {
288
- p.push(arr[i]);
722
+ p.push(arr[i])
289
723
  }
290
724
  }
291
725
  }
292
- return p;
726
+ return p
293
727
  }
294
728
  export function handleResults<T>(r: T[], m?: StringMap, bools?: Attribute[]) {
295
729
  if (m) {
296
- const res = mapArray(r, m);
730
+ const res = mapArray(r, m)
297
731
  if (bools && bools.length > 0) {
298
- return handleBool(res, bools);
732
+ return handleBool(res, bools)
299
733
  } else {
300
- return res;
734
+ return res
301
735
  }
302
736
  } else {
303
737
  if (bools && bools.length > 0) {
304
- return handleBool(r, bools);
738
+ return handleBool(r, bools)
305
739
  } else {
306
- return r;
740
+ return r
307
741
  }
308
742
  }
309
743
  }
310
744
  export function handleBool<T>(objs: T[], bools: Attribute[]) {
311
745
  if (!bools || bools.length === 0 || !objs) {
312
- return objs;
746
+ return objs
313
747
  }
314
748
  for (const obj of objs) {
315
- const o: any = obj;
749
+ const o: any = obj
316
750
  for (const field of bools) {
317
751
  if (field.name) {
318
- const v = o[field.name];
319
- if (typeof v !== 'boolean' && v != null && v !== undefined) {
320
- const b = field.true;
752
+ const v = o[field.name]
753
+ if (typeof v !== "boolean" && v != null && v !== undefined) {
754
+ const b = field.true
321
755
  if (b == null || b === undefined) {
322
756
  // tslint:disable-next-line:triple-equals
323
- o[field.name] = ('1' == v || 'T' == v || 'Y' == v || 'true' == v || 'on' == v);
757
+ o[field.name] = "1" == v || "T" == v || "Y" == v || "true" == v || "on" == v
324
758
  } else {
325
759
  // tslint:disable-next-line:triple-equals
326
- o[field.name] = (v == b ? true : false);
760
+ o[field.name] = v == b ? true : false
327
761
  }
328
762
  }
329
763
  }
330
764
  }
331
765
  }
332
- return objs;
766
+ return objs
333
767
  }
334
768
  export function formatData<T>(nameColumn: FieldPacket[], data: any, m?: StringMap): T {
335
- const result: any = {};
769
+ const result: any = {}
336
770
  nameColumn.forEach((item, index) => {
337
- let key = item.name;
771
+ let key = item.name
338
772
  if (m) {
339
- key = m[item.name];
773
+ key = m[item.name]
340
774
  }
341
- result[key] = data[index];
342
- });
343
- return result;
775
+ result[key] = data[index]
776
+ })
777
+ return result
344
778
  }
345
779
  export function map<T>(obj: T, m?: StringMap): any {
346
780
  if (!m) {
347
- return obj;
781
+ return obj
348
782
  }
349
- const mkeys = Object.keys(m);
783
+ const mkeys = Object.keys(m)
350
784
  if (mkeys.length === 0) {
351
- return obj;
785
+ return obj
352
786
  }
353
- const o: any = {};
354
- const keys = Object.keys(obj as any);
787
+ const o: any = {}
788
+ const keys = Object.keys(obj as any)
355
789
  for (const key of keys) {
356
- let k0 = m[key];
790
+ let k0 = m[key]
357
791
  if (!k0) {
358
- k0 = key;
792
+ k0 = key
359
793
  }
360
- o[k0] = (obj as any)[key];
794
+ o[k0] = (obj as any)[key]
361
795
  }
362
- return o;
796
+ return o
363
797
  }
364
798
  export function mapArray<T>(results: T[], m?: StringMap): T[] {
365
799
  if (!m) {
366
- return results;
800
+ return results
367
801
  }
368
- const mkeys = Object.keys(m);
802
+ const mkeys = Object.keys(m)
369
803
  if (mkeys.length === 0) {
370
- return results;
804
+ return results
371
805
  }
372
- const objs = [];
373
- const length = results.length;
806
+ const objs = []
807
+ const length = results.length
374
808
  for (let i = 0; i < length; i++) {
375
- const obj = results[i];
376
- const obj2: any = {};
377
- const keys = Object.keys(obj as any);
809
+ const obj = results[i]
810
+ const obj2: any = {}
811
+ const keys = Object.keys(obj as any)
378
812
  for (const key of keys) {
379
- let k0 = m[key];
813
+ let k0 = m[key]
380
814
  if (!k0) {
381
- k0 = key;
815
+ k0 = key
382
816
  }
383
- obj2[k0] = (obj as any)[key];
817
+ obj2[k0] = (obj as any)[key]
384
818
  }
385
- objs.push(obj2);
819
+ objs.push(obj2)
386
820
  }
387
- return objs;
821
+ return objs
388
822
  }
389
823
  export function getFields(fields: string[], all?: string[]): string[] | undefined {
390
824
  if (!fields || fields.length === 0) {
391
- return undefined;
825
+ return undefined
392
826
  }
393
- const ext: string[] = [];
827
+ const ext: string[] = []
394
828
  if (all) {
395
829
  for (const s of fields) {
396
830
  if (all.includes(s)) {
397
- ext.push(s);
831
+ ext.push(s)
398
832
  }
399
833
  }
400
834
  if (ext.length === 0) {
401
- return undefined;
835
+ return undefined
402
836
  } else {
403
- return ext;
837
+ return ext
404
838
  }
405
839
  } else {
406
- return fields;
840
+ return fields
407
841
  }
408
842
  }
409
843
  export function buildFields(fields: string[], all?: string[]): string {
410
- const s = getFields(fields, all);
844
+ const s = getFields(fields, all)
411
845
  if (!s || s.length === 0) {
412
- return '*';
846
+ return "*"
413
847
  } else {
414
- return s.join(',');
848
+ return s.join(",")
415
849
  }
416
850
  }
417
851
  export function getMapField(name: string, mp?: StringMap): string {
418
852
  if (!mp) {
419
- return name;
853
+ return name
420
854
  }
421
- const x = mp[name];
855
+ const x = mp[name]
422
856
  if (!x) {
423
- return name;
857
+ return name
424
858
  }
425
- if (typeof x === 'string') {
426
- return x;
859
+ if (typeof x === "string") {
860
+ return x
427
861
  }
428
- return name;
862
+ return name
429
863
  }
430
864
  export function isEmpty(s: string): boolean {
431
- return !(s && s.length > 0);
865
+ return !(s && s.length > 0)
432
866
  }
433
867
  // tslint:disable-next-line:max-classes-per-file
434
868
  export class StringService {
435
- constructor(protected pool: Pool, public table: string, public column: string) {
436
- this.load = this.load.bind(this);
437
- this.save = this.save.bind(this);
869
+ constructor(
870
+ protected pool: Pool | PoolConnection,
871
+ public table: string,
872
+ public column: string,
873
+ ) {
874
+ this.load = this.load.bind(this)
875
+ this.save = this.save.bind(this)
438
876
  }
439
877
  load(key: string, max: number): Promise<string[]> {
440
- const s = `select ${this.column} from ${this.table} where ${this.column} like ? order by ${this.column} limit ${max}`;
441
- return query(this.pool, s, ['' + key + '%']).then(arr => {
442
- return arr.map(i => (i as any)[this.column] as string);
443
- });
878
+ const s = `select ${this.column} from ${this.table} where ${this.column} like ? order by ${this.column} limit ${max}`
879
+ return query(this.pool, s, ["" + key + "%"]).then((arr) => {
880
+ return arr.map((i) => (i as any)[this.column] as string)
881
+ })
444
882
  }
445
883
  save(values: string[]): Promise<number> {
446
884
  if (!values || values.length === 0) {
447
- return Promise.resolve(0);
885
+ return Promise.resolve(0)
448
886
  }
449
- const arr: string[] = [];
887
+ const arr: string[] = []
450
888
  for (let i = 1; i <= values.length; i++) {
451
- arr.push('(?)');
889
+ arr.push("(?)")
452
890
  }
453
- const s = `insert ignore into ${this.table}(${this.column})values${arr.join(',')}`;
454
- return exec(this.pool, s, values);
891
+ const s = `insert ignore into ${this.table}(${this.column})values${arr.join(",")}`
892
+ return execute(this.pool, s, values)
455
893
  }
456
894
  }
457
895
 
458
896
  export function version(attrs: Attributes): Attribute | undefined {
459
- const ks = Object.keys(attrs);
897
+ const ks = Object.keys(attrs)
460
898
  for (const k of ks) {
461
- const attr = attrs[k];
899
+ const attr = attrs[k]
462
900
  if (attr.version) {
463
- attr.name = k;
464
- return attr;
901
+ attr.name = k
902
+ return attr
465
903
  }
466
904
  }
467
- return undefined;
905
+ return undefined
468
906
  }
469
907
  // tslint:disable-next-line:max-classes-per-file
470
908
  export class MySQLWriter<T> {
471
- pool?: Pool;
472
- version?: string;
473
- exec?: (sql: string, args?: any[]) => Promise<number>;
474
- map?: (v: T) => T;
475
- param?: (i: number) => string;
476
- constructor(pool: Pool | ((sql: string, args?: any[]) => Promise<number>), public table: string, public attributes: Attributes, public oneIfSuccess?: boolean, toDB?: (v: T) => T, buildParam?: (i: number) => string) {
477
- this.write = this.write.bind(this);
478
- if (typeof pool === 'function') {
479
- this.exec = pool;
909
+ pool?: Pool | PoolConnection
910
+ version?: string
911
+ execute?: (sql: string, args?: any[]) => Promise<number>
912
+ map?: (v: T) => T
913
+ param?: (i: number) => string
914
+ constructor(
915
+ pool: Pool | PoolConnection | ((sql: string, args?: any[]) => Promise<number>),
916
+ public table: string,
917
+ public attributes: Attributes,
918
+ public oneIfSuccess?: boolean,
919
+ toDB?: (v: T) => T,
920
+ buildParam?: (i: number) => string,
921
+ ) {
922
+ this.write = this.write.bind(this)
923
+ if (typeof pool === "function") {
924
+ this.execute = pool
480
925
  } else {
481
- this.pool = pool;
926
+ this.pool = pool
482
927
  }
483
- this.param = buildParam;
484
- this.map = toDB;
485
- const x = version(attributes);
928
+ this.param = buildParam
929
+ this.map = toDB
930
+ const x = version(attributes)
486
931
  if (x) {
487
- this.version = x.name;
932
+ this.version = x.name
488
933
  }
489
934
  }
490
935
  write(obj: T): Promise<number> {
491
936
  if (!obj) {
492
- return Promise.resolve(0);
937
+ return Promise.resolve(0)
493
938
  }
494
- let obj2: NonNullable<T> | T = obj;
939
+ let obj2: NonNullable<T> | T = obj
495
940
  if (this.map) {
496
- obj2 = this.map(obj);
941
+ obj2 = this.map(obj)
497
942
  }
498
- const stmt = buildToSave(obj2, this.table, this.attributes, this.version, this.param);
943
+ const stmt = buildToSave(obj2, this.table, this.attributes, this.version, this.param)
499
944
  if (stmt) {
500
- if (this.exec) {
945
+ if (this.execute) {
501
946
  if (this.oneIfSuccess) {
502
- return this.exec(stmt.query, stmt.params).then(ct => ct > 0 ? 1 : 0);
947
+ return this.execute(stmt.query, stmt.params).then((ct) => (ct > 0 ? 1 : 0))
503
948
  } else {
504
- return this.exec(stmt.query, stmt.params);
949
+ return this.execute(stmt.query, stmt.params)
505
950
  }
506
951
  } else {
507
952
  if (this.oneIfSuccess) {
508
- return exec(this.pool as any, stmt.query, stmt.params).then(ct => ct > 0 ? 1 : 0);
953
+ return execute(this.pool as any, stmt.query, stmt.params).then((ct) => (ct > 0 ? 1 : 0))
509
954
  } else {
510
- return exec(this.pool as any, stmt.query, stmt.params);
955
+ return execute(this.pool as any, stmt.query, stmt.params)
511
956
  }
512
957
  }
513
958
  } else {
514
- return Promise.resolve(0);
959
+ return Promise.resolve(0)
515
960
  }
516
961
  }
517
962
  }
518
963
  // tslint:disable-next-line:max-classes-per-file
519
964
  export class MySQLStreamWriter<T> {
520
- list: T[] = [];
521
- size = 0;
522
- pool?: Pool;
523
- version?: string;
524
- execBatch?: (statements: Statement[]) => Promise<number>;
525
- map?: (v: T) => T;
526
- param?: (i: number) => string;
527
- constructor(pool: Pool | ((statements: Statement[]) => Promise<number>), public table: string, public attributes: Attributes, size?: number, toDB?: (v: T) => T, buildParam?: (i: number) => string) {
528
- this.write = this.write.bind(this);
529
- this.flush = this.flush.bind(this);
530
- if (typeof pool === 'function') {
531
- this.execBatch = pool;
965
+ list: T[] = []
966
+ size = 0
967
+ pool?: Pool
968
+ version?: string
969
+ executeBatch?: (statements: Statement[]) => Promise<number>
970
+ map?: (v: T) => T
971
+ param?: (i: number) => string
972
+ constructor(
973
+ pool: Pool | ((statements: Statement[]) => Promise<number>),
974
+ public table: string,
975
+ public attributes: Attributes,
976
+ size?: number,
977
+ toDB?: (v: T) => T,
978
+ buildParam?: (i: number) => string,
979
+ ) {
980
+ this.write = this.write.bind(this)
981
+ this.flush = this.flush.bind(this)
982
+ if (typeof pool === "function") {
983
+ this.executeBatch = pool
532
984
  } else {
533
- this.pool = pool;
985
+ this.pool = pool
534
986
  }
535
- this.param = buildParam;
536
- this.map = toDB;
537
- const x = version(attributes);
987
+ this.param = buildParam
988
+ this.map = toDB
989
+ const x = version(attributes)
538
990
  if (x) {
539
- this.version = x.name;
991
+ this.version = x.name
540
992
  }
541
993
  if (size) {
542
- this.size = size;
994
+ this.size = size
543
995
  }
544
996
  }
545
997
  write(obj: T): Promise<number> {
546
998
  if (!obj) {
547
- return Promise.resolve(0);
999
+ return Promise.resolve(0)
548
1000
  }
549
- let obj2: NonNullable<T> | T = obj;
1001
+ let obj2: NonNullable<T> | T = obj
550
1002
  if (this.map) {
551
- obj2 = this.map(obj);
552
- this.list.push(obj2);
1003
+ obj2 = this.map(obj)
1004
+ this.list.push(obj2)
553
1005
  } else {
554
- this.list.push(obj);
1006
+ this.list.push(obj)
555
1007
  }
556
1008
  if (this.list.length < this.size) {
557
- return Promise.resolve(0);
1009
+ return Promise.resolve(0)
558
1010
  } else {
559
- return this.flush();
1011
+ return this.flush()
560
1012
  }
561
1013
  }
562
1014
  flush(): Promise<number> {
563
1015
  if (!this.list || this.list.length === 0) {
564
- return Promise.resolve(0);
1016
+ return Promise.resolve(0)
565
1017
  } else {
566
- const total = this.list.length;
567
- const stmt = buildToSaveBatch(this.list, this.table, this.attributes, this.version, this.param);
1018
+ const total = this.list.length
1019
+ const stmt = buildToSaveBatch(this.list, this.table, this.attributes, this.version, this.param)
568
1020
  if (stmt) {
569
- if (this.execBatch) {
570
- return this.execBatch(stmt).then(r => {
571
- this.list = [];
572
- return total;
573
- });
1021
+ if (this.executeBatch) {
1022
+ return this.executeBatch(stmt).then((r) => {
1023
+ this.list = []
1024
+ return total
1025
+ })
574
1026
  } else {
575
- return execBatch(this.pool as any, stmt).then(r => {
576
- this.list = [];
577
- return total;
578
- });
1027
+ return executeBatch(this.pool as any, stmt).then((r) => {
1028
+ this.list = []
1029
+ return total
1030
+ })
579
1031
  }
580
1032
  } else {
581
- return Promise.resolve(0);
1033
+ return Promise.resolve(0)
582
1034
  }
583
1035
  }
584
1036
  }
585
1037
  }
586
1038
  // tslint:disable-next-line:max-classes-per-file
587
1039
  export class MySQLBatchWriter<T> {
588
- pool?: Pool;
589
- version?: string;
590
- execute?: (statements: Statement[]) => Promise<number>;
591
- map?: (v: T) => T;
592
- param?: (i: number) => string;
593
- constructor(pool: Pool | ((statements: Statement[]) => Promise<number>), public table: string, public attributes: Attributes, public oneIfSuccess?: boolean, toDB?: (v: T) => T, buildParam?: (i: number) => string) {
594
- this.write = this.write.bind(this);
595
- if (typeof pool === 'function') {
596
- this.execute = pool;
1040
+ pool?: Pool
1041
+ version?: string
1042
+ execute?: (statements: Statement[]) => Promise<number>
1043
+ map?: (v: T) => T
1044
+ param?: (i: number) => string
1045
+ constructor(
1046
+ pool: Pool | ((statements: Statement[]) => Promise<number>),
1047
+ public table: string,
1048
+ public attributes: Attributes,
1049
+ public oneIfSuccess?: boolean,
1050
+ toDB?: (v: T) => T,
1051
+ buildParam?: (i: number) => string,
1052
+ ) {
1053
+ this.write = this.write.bind(this)
1054
+ if (typeof pool === "function") {
1055
+ this.execute = pool
597
1056
  } else {
598
- this.pool = pool;
1057
+ this.pool = pool
599
1058
  }
600
- this.param = buildParam;
601
- this.map = toDB;
602
- const x = version(attributes);
1059
+ this.param = buildParam
1060
+ this.map = toDB
1061
+ const x = version(attributes)
603
1062
  if (x) {
604
- this.version = x.name;
1063
+ this.version = x.name
605
1064
  }
606
1065
  }
607
1066
  write(objs: T[]): Promise<number> {
608
1067
  if (!objs || objs.length === 0) {
609
- return Promise.resolve(0);
1068
+ return Promise.resolve(0)
610
1069
  }
611
- let list = objs;
1070
+ let list = objs
612
1071
  if (this.map) {
613
- list = [];
1072
+ list = []
614
1073
  for (const obj of objs) {
615
- const obj2 = this.map(obj);
616
- list.push(obj2);
1074
+ const obj2 = this.map(obj)
1075
+ list.push(obj2)
617
1076
  }
618
1077
  }
619
- const stmts = buildToSaveBatch(list, this.table, this.attributes, this.version, this.param);
1078
+ const stmts = buildToSaveBatch(list, this.table, this.attributes, this.version, this.param)
620
1079
  if (stmts && stmts.length > 0) {
621
1080
  if (this.execute) {
622
1081
  if (this.oneIfSuccess) {
623
- return this.execute(stmts).then(ct => stmts.length);
1082
+ return this.execute(stmts).then((ct) => stmts.length)
624
1083
  } else {
625
- return this.execute(stmts);
1084
+ return this.execute(stmts)
626
1085
  }
627
1086
  } else {
628
1087
  if (this.oneIfSuccess) {
629
- return execBatch(this.pool as any, stmts).then(ct => stmts.length);
1088
+ return executeBatch(this.pool as any, stmts).then((ct) => stmts.length)
630
1089
  } else {
631
- return execBatch(this.pool as any, stmts);
1090
+ return executeBatch(this.pool as any, stmts)
632
1091
  }
633
1092
  }
634
1093
  } else {
635
- return Promise.resolve(0);
1094
+ return Promise.resolve(0)
636
1095
  }
637
1096
  }
638
1097
  }
639
1098
 
640
1099
  export interface AnyMap {
641
- [key: string]: any;
1100
+ [key: string]: any
642
1101
  }
643
1102
  // tslint:disable-next-line:max-classes-per-file
644
1103
  export class MySQLChecker {
645
- timeout: number;
646
- service: string;
647
- constructor(private pool: Pool, service?: string, timeout?: number) {
648
- this.timeout = (timeout ? timeout : 4200);
649
- this.service = (service ? service : 'mysql');
650
- this.check = this.check.bind(this);
651
- this.name = this.name.bind(this);
652
- this.build = this.build.bind(this);
1104
+ timeout: number
1105
+ service: string
1106
+ constructor(
1107
+ private pool: Pool,
1108
+ service?: string,
1109
+ timeout?: number,
1110
+ ) {
1111
+ this.timeout = timeout ? timeout : 4200
1112
+ this.service = service ? service : "mysql"
1113
+ this.check = this.check.bind(this)
1114
+ this.name = this.name.bind(this)
1115
+ this.build = this.build.bind(this)
653
1116
  }
654
1117
  async check(): Promise<AnyMap> {
655
- const obj = {} as AnyMap;
1118
+ const obj = {} as AnyMap
656
1119
  const promise = new Promise<any>((resolve, reject) => {
657
- this.pool.query('select current_time', (err, result) => {
1120
+ this.pool.query("select current_time", (err, result) => {
658
1121
  if (err) {
659
- return reject(err);
1122
+ return reject(err)
660
1123
  } else {
661
- resolve(obj);
1124
+ resolve(obj)
662
1125
  }
663
- });
664
- });
1126
+ })
1127
+ })
665
1128
  if (this.timeout > 0) {
666
- return promiseTimeOut(this.timeout, promise);
1129
+ return promiseTimeOut(this.timeout, promise)
667
1130
  } else {
668
- return promise;
1131
+ return promise
669
1132
  }
670
1133
  }
671
1134
  name(): string {
672
- return this.service;
1135
+ return this.service
673
1136
  }
674
1137
  build(data: AnyMap, err: any): AnyMap {
675
1138
  if (err) {
676
1139
  if (!data) {
677
- data = {} as AnyMap;
1140
+ data = {} as AnyMap
678
1141
  }
679
- data['error'] = err;
1142
+ data["error"] = err
680
1143
  }
681
- return data;
1144
+ return data
682
1145
  }
683
1146
  }
684
1147
 
@@ -687,21 +1150,21 @@ function promiseTimeOut(timeoutInMilliseconds: number, promise: Promise<any>): P
687
1150
  promise,
688
1151
  new Promise((resolve, reject) => {
689
1152
  setTimeout(() => {
690
- reject(`Timed out in: ${timeoutInMilliseconds} milliseconds!`);
691
- }, timeoutInMilliseconds);
692
- })
693
- ]);
1153
+ reject(`Timed out in: ${timeoutInMilliseconds} milliseconds!`)
1154
+ }, timeoutInMilliseconds)
1155
+ }),
1156
+ ])
694
1157
  }
695
1158
  export interface Formatter<T> {
696
- format: (row: T) => string;
1159
+ format: (row: T) => string
697
1160
  }
698
1161
  export interface FileWriter {
699
- write(chunk: string): boolean;
700
- flush?(cb?: () => void): void;
701
- end?(cb?: () => void): void;
1162
+ write(chunk: string): boolean
1163
+ flush?(cb?: () => void): void
1164
+ end?(cb?: () => void): void
702
1165
  }
703
1166
  export interface QueryBuilder {
704
- build(ctx?: any): Promise<Statement>;
1167
+ build(ctx?: any): Promise<Statement>
705
1168
  }
706
1169
  // tslint:disable-next-line:max-classes-per-file
707
1170
  export class Exporter<T> {
@@ -711,58 +1174,58 @@ export class Exporter<T> {
711
1174
  ft: (row: T) => string,
712
1175
  public write: (chunk: string) => boolean,
713
1176
  public end: (cb?: () => void) => void,
714
- public attributes?: Attributes
1177
+ public attributes?: Attributes,
715
1178
  ) {
716
- this.format = ft;
1179
+ this.format = ft
717
1180
  if (attributes) {
718
- this.map = buildMap(attributes);
1181
+ this.map = buildMap(attributes)
719
1182
  }
720
- this.export = this.export.bind(this);
1183
+ this.export = this.export.bind(this)
721
1184
  }
722
- map?: StringMap;
723
- format: (row: T) => string;
1185
+ map?: StringMap
1186
+ format: (row: T) => string
724
1187
  async export(ctx?: any): Promise<number> {
725
- let idx = 0;
726
- const stmt = await this.buildQuery(ctx);
727
- const reader = this.connection.query(stmt.query, stmt.params);
728
- let er: any;
729
- reader.on('error', (err) => er = err);
1188
+ let idx = 0
1189
+ const stmt = await this.buildQuery(ctx)
1190
+ const reader = this.connection.query(stmt.query, stmt.params)
1191
+ let er: any
1192
+ reader.on("error", (err) => (er = err))
730
1193
  // (D2) WRITE ROW-BY-ROW
731
1194
  if (this.map) {
732
- reader.on('result', async (row: any) => {
733
- ++idx;
734
- this.connection.pause();
735
- const obj = mapOne<T>(row, this.map);
736
- const data = this.format(obj);
737
- this.write(data);
738
- this.connection.resume();
739
- });
1195
+ reader.on("result", async (row: any) => {
1196
+ ++idx
1197
+ this.connection.pause()
1198
+ const obj = mapOne<T>(row, this.map)
1199
+ const data = this.format(obj)
1200
+ this.write(data)
1201
+ this.connection.resume()
1202
+ })
740
1203
  } else {
741
- reader.on('result', async (row: any) => {
742
- ++idx;
743
- this.connection.pause();
744
- const data = this.format(row as T);
745
- this.write(data);
746
- this.connection.resume();
747
- });
1204
+ reader.on("result", async (row: any) => {
1205
+ ++idx
1206
+ this.connection.pause()
1207
+ const data = this.format(row as T)
1208
+ this.write(data)
1209
+ this.connection.resume()
1210
+ })
748
1211
  }
749
1212
  // (D3) CLOSE CONNECTION + FILE
750
1213
  return new Promise<number>((resolve, reject) => {
751
- reader.on('end', () => {
752
- this.end();
1214
+ reader.on("end", () => {
1215
+ this.end()
753
1216
  if (er) {
754
- reject(er);
1217
+ reject(er)
755
1218
  } else {
756
1219
  this.connection.end((err) => {
757
1220
  if (err) {
758
- reject(err);
1221
+ reject(err)
759
1222
  } else {
760
- resolve(idx);
1223
+ resolve(idx)
761
1224
  }
762
- });
1225
+ })
763
1226
  }
764
- });
765
- });
1227
+ })
1228
+ })
766
1229
  }
767
1230
  }
768
1231
  // tslint:disable-next-line:max-classes-per-file
@@ -772,109 +1235,109 @@ export class ExportService<T> {
772
1235
  public queryBuilder: QueryBuilder,
773
1236
  public formatter: Formatter<T>,
774
1237
  public writer: FileWriter,
775
- public attributes?: Attributes
1238
+ public attributes?: Attributes,
776
1239
  ) {
777
1240
  if (attributes) {
778
- this.map = buildMap(attributes);
1241
+ this.map = buildMap(attributes)
779
1242
  }
780
- this.export = this.export.bind(this);
1243
+ this.export = this.export.bind(this)
781
1244
  }
782
- map?: StringMap;
1245
+ map?: StringMap
783
1246
  async export(ctx?: any): Promise<number> {
784
- let idx = 0;
785
- const stmt = await this.queryBuilder.build(ctx);
786
- const reader = this.connection.query(stmt.query, stmt.params);
787
- let er: any;
788
- reader.on('error', (err) => er = err);
1247
+ let idx = 0
1248
+ const stmt = await this.queryBuilder.build(ctx)
1249
+ const reader = this.connection.query(stmt.query, stmt.params)
1250
+ let er: any
1251
+ reader.on("error", (err) => (er = err))
789
1252
  // (D2) WRITE ROW-BY-ROW
790
1253
  if (this.map) {
791
- reader.on('result', async (row: any) => {
792
- ++idx;
793
- this.connection.pause();
794
- const obj = mapOne<T>(row, this.map);
795
- const data = this.formatter.format(obj);
796
- this.writer.write(data);
797
- this.connection.resume();
798
- });
1254
+ reader.on("result", async (row: any) => {
1255
+ ++idx
1256
+ this.connection.pause()
1257
+ const obj = mapOne<T>(row, this.map)
1258
+ const data = this.formatter.format(obj)
1259
+ this.writer.write(data)
1260
+ this.connection.resume()
1261
+ })
799
1262
  } else {
800
- reader.on('result', async (row: any) => {
801
- ++idx;
802
- this.connection.pause();
803
- const data = this.formatter.format(row as T);
804
- this.writer.write(data);
805
- this.connection.resume();
806
- });
1263
+ reader.on("result", async (row: any) => {
1264
+ ++idx
1265
+ this.connection.pause()
1266
+ const data = this.formatter.format(row as T)
1267
+ this.writer.write(data)
1268
+ this.connection.resume()
1269
+ })
807
1270
  }
808
1271
  // (D3) CLOSE CONNECTION + FILE
809
1272
  return new Promise<number>((resolve, reject) => {
810
- reader.on('end', () => {
1273
+ reader.on("end", () => {
811
1274
  if (this.writer.end) {
812
- this.writer.end();
1275
+ this.writer.end()
813
1276
  } else if (this.writer.flush) {
814
- this.writer.flush();
1277
+ this.writer.flush()
815
1278
  }
816
1279
  if (er) {
817
- reject(er);
1280
+ reject(er)
818
1281
  } else {
819
1282
  this.connection.end((err) => {
820
1283
  if (err) {
821
- reject(err);
1284
+ reject(err)
822
1285
  } else {
823
- resolve(idx);
1286
+ resolve(idx)
824
1287
  }
825
- });
1288
+ })
826
1289
  }
827
- });
828
- });
1290
+ })
1291
+ })
829
1292
  }
830
1293
  }
831
1294
  export function mapOne<T>(results: any, m?: StringMap): T {
832
- const obj: any = results;
1295
+ const obj: any = results
833
1296
  if (!m) {
834
- return obj;
1297
+ return obj
835
1298
  }
836
- const mkeys = Object.keys(m as any);
1299
+ const mkeys = Object.keys(m as any)
837
1300
  if (mkeys.length === 0) {
838
- return obj;
1301
+ return obj
839
1302
  }
840
- const obj2: any = {};
841
- const keys = Object.keys(obj);
1303
+ const obj2: any = {}
1304
+ const keys = Object.keys(obj)
842
1305
  for (const key of keys) {
843
- let k0 = m[key];
1306
+ let k0 = m[key]
844
1307
  if (!k0) {
845
- k0 = key;
1308
+ k0 = key
846
1309
  }
847
- obj2[k0] = (obj)[key];
1310
+ obj2[k0] = obj[key]
848
1311
  }
849
- return obj2;
1312
+ return obj2
850
1313
  }
851
- export function buildMap(attrs: Attributes): StringMap|undefined {
852
- const mp: StringMap = {};
853
- const ks = Object.keys(attrs);
854
- let isMap = false;
1314
+ export function buildMap(attrs: Attributes): StringMap | undefined {
1315
+ const mp: StringMap = {}
1316
+ const ks = Object.keys(attrs)
1317
+ let isMap = false
855
1318
  for (const k of ks) {
856
- const attr = attrs[k];
857
- attr.name = k;
858
- const field = (attr.column ? attr.column : k);
859
- const s = field.toLowerCase();
1319
+ const attr = attrs[k]
1320
+ attr.name = k
1321
+ const field = attr.column ? attr.column : k
1322
+ const s = field.toLowerCase()
860
1323
  if (s !== k) {
861
- mp[s] = k;
862
- isMap = true;
1324
+ mp[s] = k
1325
+ isMap = true
863
1326
  }
864
1327
  }
865
1328
  if (isMap) {
866
- return mp;
1329
+ return mp
867
1330
  }
868
- return undefined;
1331
+ return undefined
869
1332
  }
870
1333
  export function select(table: string, attrs: Attributes): string {
871
- const cols: string[] = [];
872
- const ks = Object.keys(attrs);
1334
+ const cols: string[] = []
1335
+ const ks = Object.keys(attrs)
873
1336
  for (const k of ks) {
874
- const attr = attrs[k];
875
- attr.name = k;
876
- const field = (attr.column ? attr.column : k);
877
- cols.push(field);
1337
+ const attr = attrs[k]
1338
+ attr.name = k
1339
+ const field = attr.column ? attr.column : k
1340
+ cols.push(field)
878
1341
  }
879
- return `select ${cols.join(',')} from ${table}`;
1342
+ return `select ${cols.join(",")} from ${table}`
880
1343
  }