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/lib/build.js +40 -40
- package/lib/index.js +806 -283
- package/package.json +2 -1
- package/src/build.ts +153 -153
- package/src/index.ts +925 -462
- package/src/metadata.ts +51 -70
package/src/index.ts
CHANGED
|
@@ -1,684 +1,1147 @@
|
|
|
1
|
-
import { Connection, createPool as createPool2, FieldPacket,
|
|
2
|
-
import { buildToSave, buildToSaveBatch } from
|
|
3
|
-
import { Attribute, Attributes,
|
|
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
|
|
6
|
-
export * from
|
|
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
|
|
35
|
-
constructor(
|
|
36
|
-
this.param = this.param.bind(this)
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
this.query = this.query.bind(this)
|
|
40
|
-
this.queryOne = this.queryOne.bind(this)
|
|
41
|
-
this.
|
|
42
|
-
this.count = this.count.bind(this)
|
|
43
|
-
}
|
|
44
|
-
driver =
|
|
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
|
-
|
|
49
|
-
const p =
|
|
50
|
-
return
|
|
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
|
-
|
|
53
|
-
const p =
|
|
54
|
-
return
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
65
|
-
const p =
|
|
66
|
-
return
|
|
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 =
|
|
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
|
|
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
|
|
205
|
+
return execute(pool, statements[0].query, statements[0].params)
|
|
78
206
|
}
|
|
79
|
-
if (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
352
|
+
connection.commit((er3) => {
|
|
353
|
+
if (er3) {
|
|
354
|
+
connection.rollback(() => {
|
|
355
|
+
return reject(er3)
|
|
356
|
+
})
|
|
357
|
+
}
|
|
358
|
+
})
|
|
359
|
+
return 0
|
|
114
360
|
} else {
|
|
115
|
-
|
|
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.
|
|
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
|
-
|
|
141
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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(
|
|
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.
|
|
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.
|
|
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 ===
|
|
185
|
-
err.error =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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>(
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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 ===
|
|
253
|
-
return pool(s.query, s.params)
|
|
679
|
+
if (typeof pool === "function") {
|
|
680
|
+
return pool(s.query, s.params)
|
|
254
681
|
} else {
|
|
255
|
-
return
|
|
682
|
+
return execute(pool, s.query, s.params)
|
|
256
683
|
}
|
|
257
684
|
}
|
|
258
|
-
export function saveBatch<T>(
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
|
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] ===
|
|
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 !==
|
|
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] =
|
|
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] =
|
|
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 ===
|
|
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(
|
|
436
|
-
|
|
437
|
-
|
|
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, [
|
|
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
|
|
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
|
-
|
|
474
|
-
map?: (v: T) => T
|
|
475
|
-
param?: (i: number) => string
|
|
476
|
-
constructor(
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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.
|
|
945
|
+
if (this.execute) {
|
|
501
946
|
if (this.oneIfSuccess) {
|
|
502
|
-
return this.
|
|
947
|
+
return this.execute(stmt.query, stmt.params).then((ct) => (ct > 0 ? 1 : 0))
|
|
503
948
|
} else {
|
|
504
|
-
return this.
|
|
949
|
+
return this.execute(stmt.query, stmt.params)
|
|
505
950
|
}
|
|
506
951
|
} else {
|
|
507
952
|
if (this.oneIfSuccess) {
|
|
508
|
-
return
|
|
953
|
+
return execute(this.pool as any, stmt.query, stmt.params).then((ct) => (ct > 0 ? 1 : 0))
|
|
509
954
|
} else {
|
|
510
|
-
return
|
|
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
|
-
|
|
525
|
-
map?: (v: T) => T
|
|
526
|
-
param?: (i: number) => string
|
|
527
|
-
constructor(
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
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.
|
|
570
|
-
return this.
|
|
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
|
|
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(
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
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
|
|
1088
|
+
return executeBatch(this.pool as any, stmts).then((ct) => stmts.length)
|
|
630
1089
|
} else {
|
|
631
|
-
return
|
|
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(
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
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(
|
|
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[
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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] =
|
|
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 =
|
|
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 =
|
|
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(
|
|
1342
|
+
return `select ${cols.join(",")} from ${table}`
|
|
880
1343
|
}
|