@eggjs/dal-runtime 4.0.0-beta.34 → 4.0.0-beta.36

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.
@@ -1,386 +1,224 @@
1
- import { ColumnModel, IndexModel, TableModel } from '@eggjs/dal-decorator';
2
- import { ColumnType, IndexType } from '@eggjs/tegg-types';
3
- // TODO diff 实现
4
- export class SqlGenerator {
5
- formatComment(comment) {
6
- return comment.replace(/\n/g, '\\n');
7
- }
8
- generateColumn(column) {
9
- const sqls = [' ', column.columnName, this.generateColumnType(column.type)];
10
- if (column.canNull) {
11
- sqls.push('NULL');
12
- }
13
- else {
14
- sqls.push('NOT NULL');
15
- }
16
- if ([
17
- ColumnType.POINT,
18
- ColumnType.GEOMETRY,
19
- ColumnType.POINT,
20
- ColumnType.LINESTRING,
21
- ColumnType.POLYGON,
22
- ColumnType.MULTIPOINT,
23
- ColumnType.MULTILINESTRING,
24
- ColumnType.MULTIPOLYGON,
25
- ColumnType.GEOMETRYCOLLECTION,
26
- ].includes(column.type.type)) {
27
- const SRID = column.type.SRID;
28
- if (SRID) {
29
- sqls.push(`SRID ${SRID}`);
30
- }
31
- }
32
- if (typeof column.default !== 'undefined') {
33
- sqls.push(`DEFAULT ${column.default}`);
34
- }
35
- if (column.autoIncrement) {
36
- sqls.push('AUTO_INCREMENT');
37
- }
38
- if (column.uniqueKey) {
39
- sqls.push('UNIQUE KEY');
40
- }
41
- if (column.primaryKey) {
42
- sqls.push('PRIMARY KEY');
43
- }
44
- if (column.comment) {
45
- sqls.push(`COMMENT '${this.formatComment(column.comment)}'`);
46
- }
47
- if (column.collate) {
48
- sqls.push(`COLLATE ${column.collate}`);
49
- }
50
- if (column.columnFormat) {
51
- sqls.push(`COLUMN_FORMAT ${column.columnFormat}`);
52
- }
53
- if (column.engineAttribute) {
54
- sqls.push(`ENGINE_ATTRIBUTE='${column.engineAttribute}'`);
55
- }
56
- if (column.secondaryEngineAttribute) {
57
- sqls.push(`SECONDARY_ENGINE_ATTRIBUTE='${column.secondaryEngineAttribute}'`);
58
- }
59
- return sqls.join(' ');
60
- }
61
- generateColumnType(columnType) {
62
- const sqls = [];
63
- switch (columnType.type) {
64
- case ColumnType.BOOL: {
65
- sqls.push('BOOL');
66
- break;
67
- }
68
- case ColumnType.BIT: {
69
- if (columnType.length) {
70
- sqls.push(`BIT(${columnType.length})`);
71
- }
72
- else {
73
- sqls.push('BIT');
74
- }
75
- break;
76
- }
77
- case ColumnType.TINYINT:
78
- case ColumnType.SMALLINT:
79
- case ColumnType.MEDIUMINT:
80
- case ColumnType.INT:
81
- case ColumnType.BIGINT: {
82
- if (typeof columnType.length === 'number') {
83
- sqls.push(`${columnType.type}(${columnType.length})`);
84
- }
85
- else {
86
- sqls.push(columnType.type);
87
- }
88
- if (columnType.unsigned) {
89
- sqls.push('UNSIGNED');
90
- }
91
- if (columnType.zeroFill) {
92
- sqls.push('ZEROFILL');
93
- }
94
- break;
95
- }
96
- case ColumnType.DECIMAL:
97
- case ColumnType.FLOAT:
98
- case ColumnType.DOUBLE: {
99
- if (typeof columnType.length === 'number' && typeof columnType.fractionalLength === 'number') {
100
- sqls.push(`${columnType.type}(${columnType.length},${columnType.fractionalLength})`);
101
- }
102
- else if (typeof columnType.length === 'number') {
103
- sqls.push(`${columnType.type}(${columnType.length})`);
104
- }
105
- else {
106
- sqls.push('TINYINT');
107
- }
108
- if (columnType.unsigned) {
109
- sqls.push('UNSIGNED');
110
- }
111
- if (columnType.zeroFill) {
112
- sqls.push('ZEROFILL');
113
- }
114
- break;
115
- }
116
- case ColumnType.DATE: {
117
- sqls.push('DATE');
118
- break;
119
- }
120
- case ColumnType.DATETIME:
121
- case ColumnType.TIMESTAMP: {
122
- if (columnType.precision) {
123
- sqls.push(`${columnType.type}(${columnType.precision})`);
124
- }
125
- else {
126
- sqls.push(columnType.type);
127
- }
128
- if (columnType.autoUpdate) {
129
- if (columnType.precision) {
130
- sqls.push(`ON UPDATE CURRENT_TIMESTAMP(${columnType.precision})`);
131
- }
132
- else {
133
- sqls.push('ON UPDATE CURRENT_TIMESTAMP');
134
- }
135
- }
136
- break;
137
- }
138
- case ColumnType.TIME: {
139
- if (columnType.precision) {
140
- sqls.push(`${columnType.type}(${columnType.precision})`);
141
- }
142
- else {
143
- sqls.push(columnType.type);
144
- }
145
- break;
146
- }
147
- case ColumnType.YEAR: {
148
- sqls.push('YEAR');
149
- break;
150
- }
151
- case ColumnType.CHAR:
152
- case ColumnType.TEXT: {
153
- if (columnType.length) {
154
- sqls.push(`${columnType.type}(${columnType.length})`);
155
- }
156
- else {
157
- sqls.push(columnType.type);
158
- }
159
- if (columnType.characterSet) {
160
- sqls.push(`CHARACTER SET ${columnType.characterSet}`);
161
- }
162
- if (columnType.collate) {
163
- sqls.push(`COLLATE ${columnType.collate}`);
164
- }
165
- break;
166
- }
167
- case ColumnType.VARCHAR: {
168
- sqls.push(`${columnType.type}(${columnType.length})`);
169
- if (columnType.characterSet) {
170
- sqls.push(`CHARACTER SET ${columnType.characterSet}`);
171
- }
172
- if (columnType.collate) {
173
- sqls.push(`COLLATE ${columnType.collate}`);
174
- }
175
- break;
176
- }
177
- case ColumnType.BINARY: {
178
- if (columnType.length) {
179
- sqls.push(`${columnType.type}(${columnType.length})`);
180
- }
181
- else {
182
- sqls.push(columnType.type);
183
- }
184
- break;
185
- }
186
- case ColumnType.VARBINARY: {
187
- sqls.push(`${columnType.type}(${columnType.length})`);
188
- break;
189
- }
190
- case ColumnType.TINYBLOB: {
191
- sqls.push('TINYBLOB');
192
- break;
193
- }
194
- case ColumnType.TINYTEXT:
195
- case ColumnType.MEDIUMTEXT:
196
- case ColumnType.LONGTEXT: {
197
- sqls.push(columnType.type);
198
- if (columnType.characterSet) {
199
- sqls.push(`CHARACTER SET ${columnType.characterSet}`);
200
- }
201
- if (columnType.collate) {
202
- sqls.push(`COLLATE ${columnType.collate}`);
203
- }
204
- break;
205
- }
206
- case ColumnType.BLOB: {
207
- if (columnType.length) {
208
- sqls.push(`${columnType.type}(${columnType.length})`);
209
- }
210
- else {
211
- sqls.push(columnType.type);
212
- }
213
- break;
214
- }
215
- case ColumnType.MEDIUMBLOB: {
216
- sqls.push('MEDIUMBLOB');
217
- break;
218
- }
219
- case ColumnType.LONGBLOB: {
220
- sqls.push('LONGBLOB');
221
- break;
222
- }
223
- case ColumnType.ENUM: {
224
- const enumValue = columnType.enums.map((t) => `'${t}'`).join(',');
225
- sqls.push(`ENUM(${enumValue})`);
226
- if (columnType.characterSet) {
227
- sqls.push(`CHARACTER SET ${columnType.characterSet}`);
228
- }
229
- if (columnType.collate) {
230
- sqls.push(`COLLATE ${columnType.collate}`);
231
- }
232
- break;
233
- }
234
- case ColumnType.SET: {
235
- const enumValue = columnType.enums.map((t) => `'${t}'`).join(',');
236
- sqls.push(`SET(${enumValue})`);
237
- if (columnType.characterSet) {
238
- sqls.push(`CHARACTER SET ${columnType.characterSet}`);
239
- }
240
- if (columnType.collate) {
241
- sqls.push(`COLLATE ${columnType.collate}`);
242
- }
243
- break;
244
- }
245
- case ColumnType.JSON: {
246
- sqls.push('JSON');
247
- break;
248
- }
249
- case ColumnType.GEOMETRY:
250
- case ColumnType.POINT:
251
- case ColumnType.LINESTRING:
252
- case ColumnType.POLYGON:
253
- case ColumnType.MULTIPOINT:
254
- case ColumnType.MULTILINESTRING:
255
- case ColumnType.MULTIPOLYGON:
256
- case ColumnType.GEOMETRYCOLLECTION: {
257
- sqls.push(columnType.type);
258
- break;
259
- }
260
- default: {
261
- throw new Error(`unknown ColumnType ${columnType}`);
262
- }
263
- }
264
- return sqls.join(' ');
265
- }
266
- generateIndex(indexModel) {
267
- const indexSql = [' '];
268
- switch (indexModel.type) {
269
- case IndexType.INDEX: {
270
- indexSql.push('KEY');
271
- break;
272
- }
273
- case IndexType.UNIQUE: {
274
- indexSql.push('UNIQUE KEY');
275
- break;
276
- }
277
- case IndexType.PRIMARY: {
278
- indexSql.push('PRIMARY KEY');
279
- break;
280
- }
281
- case IndexType.FULLTEXT: {
282
- indexSql.push('FULLTEXT KEY');
283
- break;
284
- }
285
- case IndexType.SPATIAL: {
286
- indexSql.push('SPATIAL KEY');
287
- break;
288
- }
289
- default: {
290
- throw new Error(`unknown IndexType ${indexModel.type}`);
291
- }
292
- }
293
- indexSql.push(indexModel.name);
294
- indexSql.push(`(${indexModel.keys.map((t) => t.columnName).join(',')})`);
295
- if (indexModel.storeType) {
296
- indexSql.push(`USING ${indexModel.storeType}`);
297
- }
298
- if (indexModel.parser) {
299
- indexSql.push(`WITH PARSER ${indexModel.parser}`);
300
- }
301
- if (indexModel.comment) {
302
- indexSql.push(`COMMENT '${this.formatComment(indexModel.comment)}'`);
303
- }
304
- if (indexModel.engineAttribute) {
305
- indexSql.push(`ENGINE_ATTRIBUTE='${indexModel.engineAttribute}'`);
306
- }
307
- if (indexModel.secondaryEngineAttribute) {
308
- indexSql.push(`SECONDARY_ENGINE_ATTRIBUTE='${indexModel.secondaryEngineAttribute}'`);
309
- }
310
- return indexSql.join(' ');
311
- }
312
- generateTableOptions(tableModel) {
313
- const sqls = [];
314
- if (tableModel.autoExtendSize) {
315
- sqls.push(`AUTOEXTEND_SIZE=${tableModel.autoExtendSize}`);
316
- }
317
- if (tableModel.autoIncrement) {
318
- sqls.push(`AUTO_INCREMENT=${tableModel.autoIncrement}`);
319
- }
320
- if (tableModel.avgRowLength) {
321
- sqls.push(`AVG_ROW_LENGTH=${tableModel.avgRowLength}`);
322
- }
323
- if (tableModel.characterSet) {
324
- sqls.push(`DEFAULT CHARACTER SET ${tableModel.characterSet}`);
325
- }
326
- if (tableModel.collate) {
327
- sqls.push(`DEFAULT COLLATE ${tableModel.collate}`);
328
- }
329
- if (tableModel.comment) {
330
- sqls.push(`COMMENT='${this.formatComment(tableModel.comment)}'`);
331
- }
332
- if (tableModel.compression) {
333
- sqls.push(`COMPRESSION='${tableModel.compression}'`);
334
- }
335
- if (typeof tableModel.encryption !== 'undefined') {
336
- sqls.push(`ENCRYPTION='${tableModel.encryption ? 'Y' : 'N'}'`);
337
- }
338
- if (typeof tableModel.engine !== 'undefined') {
339
- sqls.push(`ENGINE=${tableModel.engine}`);
340
- }
341
- if (tableModel.engineAttribute) {
342
- sqls.push(`ENGINE_ATTRIBUTE='${tableModel.engineAttribute}'`);
343
- }
344
- if (tableModel.secondaryEngineAttribute) {
345
- sqls.push(`SECONDARY_ENGINE_ATTRIBUTE = '${tableModel.secondaryEngineAttribute}'`);
346
- }
347
- if (tableModel.insertMethod) {
348
- sqls.push(`INSERT_METHOD=${tableModel.insertMethod}`);
349
- }
350
- if (tableModel.keyBlockSize) {
351
- sqls.push(`KEY_BLOCK_SIZE=${tableModel.keyBlockSize}`);
352
- }
353
- if (tableModel.maxRows) {
354
- sqls.push(`MAX_ROWS=${tableModel.maxRows}`);
355
- }
356
- if (tableModel.minRows) {
357
- sqls.push(`MIN_ROWS=${tableModel.minRows}`);
358
- }
359
- if (tableModel.rowFormat) {
360
- sqls.push(`ROW_FORMAT=${tableModel.rowFormat}`);
361
- }
362
- return sqls.join(', ');
363
- }
364
- generate(tableModel) {
365
- const createSql = [];
366
- createSql.push(`CREATE TABLE IF NOT EXISTS ${tableModel.name} (`);
367
- const columnSql = [];
368
- for (const column of tableModel.columns) {
369
- columnSql.push(this.generateColumn(column));
370
- }
371
- const indexSql = [];
372
- for (const index of tableModel.indices) {
373
- indexSql.push(this.generateIndex(index));
374
- }
375
- if (indexSql.length) {
376
- createSql.push(columnSql.join(',\n') + ',');
377
- createSql.push(indexSql.join(',\n'));
378
- }
379
- else {
380
- createSql.push(columnSql.join(',\n'));
381
- }
382
- createSql.push(`) ${this.generateTableOptions(tableModel)};`);
383
- return createSql.join('\n');
384
- }
385
- }
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FsR2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NxbEdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRzFELGVBQWU7QUFDZixNQUFNLE9BQU8sWUFBWTtJQUNmLGFBQWEsQ0FBQyxPQUFlO1FBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLGNBQWMsQ0FBQyxNQUFtQjtRQUN4QyxNQUFNLElBQUksR0FBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFFSTtZQUNFLFVBQVUsQ0FBQyxLQUFLO1lBQ2hCLFVBQVUsQ0FBQyxRQUFRO1lBQ25CLFVBQVUsQ0FBQyxLQUFLO1lBQ2hCLFVBQVUsQ0FBQyxVQUFVO1lBQ3JCLFVBQVUsQ0FBQyxPQUFPO1lBQ2xCLFVBQVUsQ0FBQyxVQUFVO1lBQ3JCLFVBQVUsQ0FBQyxlQUFlO1lBQzFCLFVBQVUsQ0FBQyxZQUFZO1lBQ3ZCLFVBQVUsQ0FBQyxrQkFBa0I7U0FFaEMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDNUIsQ0FBQztZQUNELE1BQU0sSUFB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
1
+ import { ColumnModel, TableModel } from "@eggjs/dal-decorator";
2
+ import { ColumnType, IndexType } from "@eggjs/tegg-types";
3
+
4
+ //#region src/SqlGenerator.ts
5
+ var SqlGenerator = class {
6
+ formatComment(comment) {
7
+ return comment.replace(/\n/g, "\\n");
8
+ }
9
+ generateColumn(column) {
10
+ const sqls = [
11
+ " ",
12
+ column.columnName,
13
+ this.generateColumnType(column.type)
14
+ ];
15
+ if (column.canNull) sqls.push("NULL");
16
+ else sqls.push("NOT NULL");
17
+ if ([
18
+ ColumnType.POINT,
19
+ ColumnType.GEOMETRY,
20
+ ColumnType.POINT,
21
+ ColumnType.LINESTRING,
22
+ ColumnType.POLYGON,
23
+ ColumnType.MULTIPOINT,
24
+ ColumnType.MULTILINESTRING,
25
+ ColumnType.MULTIPOLYGON,
26
+ ColumnType.GEOMETRYCOLLECTION
27
+ ].includes(column.type.type)) {
28
+ const SRID = column.type.SRID;
29
+ if (SRID) sqls.push(`SRID ${SRID}`);
30
+ }
31
+ if (typeof column.default !== "undefined") sqls.push(`DEFAULT ${column.default}`);
32
+ if (column.autoIncrement) sqls.push("AUTO_INCREMENT");
33
+ if (column.uniqueKey) sqls.push("UNIQUE KEY");
34
+ if (column.primaryKey) sqls.push("PRIMARY KEY");
35
+ if (column.comment) sqls.push(`COMMENT '${this.formatComment(column.comment)}'`);
36
+ if (column.collate) sqls.push(`COLLATE ${column.collate}`);
37
+ if (column.columnFormat) sqls.push(`COLUMN_FORMAT ${column.columnFormat}`);
38
+ if (column.engineAttribute) sqls.push(`ENGINE_ATTRIBUTE='${column.engineAttribute}'`);
39
+ if (column.secondaryEngineAttribute) sqls.push(`SECONDARY_ENGINE_ATTRIBUTE='${column.secondaryEngineAttribute}'`);
40
+ return sqls.join(" ");
41
+ }
42
+ generateColumnType(columnType) {
43
+ const sqls = [];
44
+ switch (columnType.type) {
45
+ case ColumnType.BOOL:
46
+ sqls.push("BOOL");
47
+ break;
48
+ case ColumnType.BIT:
49
+ if (columnType.length) sqls.push(`BIT(${columnType.length})`);
50
+ else sqls.push("BIT");
51
+ break;
52
+ case ColumnType.TINYINT:
53
+ case ColumnType.SMALLINT:
54
+ case ColumnType.MEDIUMINT:
55
+ case ColumnType.INT:
56
+ case ColumnType.BIGINT:
57
+ if (typeof columnType.length === "number") sqls.push(`${columnType.type}(${columnType.length})`);
58
+ else sqls.push(columnType.type);
59
+ if (columnType.unsigned) sqls.push("UNSIGNED");
60
+ if (columnType.zeroFill) sqls.push("ZEROFILL");
61
+ break;
62
+ case ColumnType.DECIMAL:
63
+ case ColumnType.FLOAT:
64
+ case ColumnType.DOUBLE:
65
+ if (typeof columnType.length === "number" && typeof columnType.fractionalLength === "number") sqls.push(`${columnType.type}(${columnType.length},${columnType.fractionalLength})`);
66
+ else if (typeof columnType.length === "number") sqls.push(`${columnType.type}(${columnType.length})`);
67
+ else sqls.push("TINYINT");
68
+ if (columnType.unsigned) sqls.push("UNSIGNED");
69
+ if (columnType.zeroFill) sqls.push("ZEROFILL");
70
+ break;
71
+ case ColumnType.DATE:
72
+ sqls.push("DATE");
73
+ break;
74
+ case ColumnType.DATETIME:
75
+ case ColumnType.TIMESTAMP:
76
+ if (columnType.precision) sqls.push(`${columnType.type}(${columnType.precision})`);
77
+ else sqls.push(columnType.type);
78
+ if (columnType.autoUpdate) if (columnType.precision) sqls.push(`ON UPDATE CURRENT_TIMESTAMP(${columnType.precision})`);
79
+ else sqls.push("ON UPDATE CURRENT_TIMESTAMP");
80
+ break;
81
+ case ColumnType.TIME:
82
+ if (columnType.precision) sqls.push(`${columnType.type}(${columnType.precision})`);
83
+ else sqls.push(columnType.type);
84
+ break;
85
+ case ColumnType.YEAR:
86
+ sqls.push("YEAR");
87
+ break;
88
+ case ColumnType.CHAR:
89
+ case ColumnType.TEXT:
90
+ if (columnType.length) sqls.push(`${columnType.type}(${columnType.length})`);
91
+ else sqls.push(columnType.type);
92
+ if (columnType.characterSet) sqls.push(`CHARACTER SET ${columnType.characterSet}`);
93
+ if (columnType.collate) sqls.push(`COLLATE ${columnType.collate}`);
94
+ break;
95
+ case ColumnType.VARCHAR:
96
+ sqls.push(`${columnType.type}(${columnType.length})`);
97
+ if (columnType.characterSet) sqls.push(`CHARACTER SET ${columnType.characterSet}`);
98
+ if (columnType.collate) sqls.push(`COLLATE ${columnType.collate}`);
99
+ break;
100
+ case ColumnType.BINARY:
101
+ if (columnType.length) sqls.push(`${columnType.type}(${columnType.length})`);
102
+ else sqls.push(columnType.type);
103
+ break;
104
+ case ColumnType.VARBINARY:
105
+ sqls.push(`${columnType.type}(${columnType.length})`);
106
+ break;
107
+ case ColumnType.TINYBLOB:
108
+ sqls.push("TINYBLOB");
109
+ break;
110
+ case ColumnType.TINYTEXT:
111
+ case ColumnType.MEDIUMTEXT:
112
+ case ColumnType.LONGTEXT:
113
+ sqls.push(columnType.type);
114
+ if (columnType.characterSet) sqls.push(`CHARACTER SET ${columnType.characterSet}`);
115
+ if (columnType.collate) sqls.push(`COLLATE ${columnType.collate}`);
116
+ break;
117
+ case ColumnType.BLOB:
118
+ if (columnType.length) sqls.push(`${columnType.type}(${columnType.length})`);
119
+ else sqls.push(columnType.type);
120
+ break;
121
+ case ColumnType.MEDIUMBLOB:
122
+ sqls.push("MEDIUMBLOB");
123
+ break;
124
+ case ColumnType.LONGBLOB:
125
+ sqls.push("LONGBLOB");
126
+ break;
127
+ case ColumnType.ENUM: {
128
+ const enumValue = columnType.enums.map((t) => `'${t}'`).join(",");
129
+ sqls.push(`ENUM(${enumValue})`);
130
+ if (columnType.characterSet) sqls.push(`CHARACTER SET ${columnType.characterSet}`);
131
+ if (columnType.collate) sqls.push(`COLLATE ${columnType.collate}`);
132
+ break;
133
+ }
134
+ case ColumnType.SET: {
135
+ const enumValue = columnType.enums.map((t) => `'${t}'`).join(",");
136
+ sqls.push(`SET(${enumValue})`);
137
+ if (columnType.characterSet) sqls.push(`CHARACTER SET ${columnType.characterSet}`);
138
+ if (columnType.collate) sqls.push(`COLLATE ${columnType.collate}`);
139
+ break;
140
+ }
141
+ case ColumnType.JSON:
142
+ sqls.push("JSON");
143
+ break;
144
+ case ColumnType.GEOMETRY:
145
+ case ColumnType.POINT:
146
+ case ColumnType.LINESTRING:
147
+ case ColumnType.POLYGON:
148
+ case ColumnType.MULTIPOINT:
149
+ case ColumnType.MULTILINESTRING:
150
+ case ColumnType.MULTIPOLYGON:
151
+ case ColumnType.GEOMETRYCOLLECTION:
152
+ sqls.push(columnType.type);
153
+ break;
154
+ default: throw new Error(`unknown ColumnType ${columnType}`);
155
+ }
156
+ return sqls.join(" ");
157
+ }
158
+ generateIndex(indexModel) {
159
+ const indexSql = [" "];
160
+ switch (indexModel.type) {
161
+ case IndexType.INDEX:
162
+ indexSql.push("KEY");
163
+ break;
164
+ case IndexType.UNIQUE:
165
+ indexSql.push("UNIQUE KEY");
166
+ break;
167
+ case IndexType.PRIMARY:
168
+ indexSql.push("PRIMARY KEY");
169
+ break;
170
+ case IndexType.FULLTEXT:
171
+ indexSql.push("FULLTEXT KEY");
172
+ break;
173
+ case IndexType.SPATIAL:
174
+ indexSql.push("SPATIAL KEY");
175
+ break;
176
+ default: throw new Error(`unknown IndexType ${indexModel.type}`);
177
+ }
178
+ indexSql.push(indexModel.name);
179
+ indexSql.push(`(${indexModel.keys.map((t) => t.columnName).join(",")})`);
180
+ if (indexModel.storeType) indexSql.push(`USING ${indexModel.storeType}`);
181
+ if (indexModel.parser) indexSql.push(`WITH PARSER ${indexModel.parser}`);
182
+ if (indexModel.comment) indexSql.push(`COMMENT '${this.formatComment(indexModel.comment)}'`);
183
+ if (indexModel.engineAttribute) indexSql.push(`ENGINE_ATTRIBUTE='${indexModel.engineAttribute}'`);
184
+ if (indexModel.secondaryEngineAttribute) indexSql.push(`SECONDARY_ENGINE_ATTRIBUTE='${indexModel.secondaryEngineAttribute}'`);
185
+ return indexSql.join(" ");
186
+ }
187
+ generateTableOptions(tableModel) {
188
+ const sqls = [];
189
+ if (tableModel.autoExtendSize) sqls.push(`AUTOEXTEND_SIZE=${tableModel.autoExtendSize}`);
190
+ if (tableModel.autoIncrement) sqls.push(`AUTO_INCREMENT=${tableModel.autoIncrement}`);
191
+ if (tableModel.avgRowLength) sqls.push(`AVG_ROW_LENGTH=${tableModel.avgRowLength}`);
192
+ if (tableModel.characterSet) sqls.push(`DEFAULT CHARACTER SET ${tableModel.characterSet}`);
193
+ if (tableModel.collate) sqls.push(`DEFAULT COLLATE ${tableModel.collate}`);
194
+ if (tableModel.comment) sqls.push(`COMMENT='${this.formatComment(tableModel.comment)}'`);
195
+ if (tableModel.compression) sqls.push(`COMPRESSION='${tableModel.compression}'`);
196
+ if (typeof tableModel.encryption !== "undefined") sqls.push(`ENCRYPTION='${tableModel.encryption ? "Y" : "N"}'`);
197
+ if (typeof tableModel.engine !== "undefined") sqls.push(`ENGINE=${tableModel.engine}`);
198
+ if (tableModel.engineAttribute) sqls.push(`ENGINE_ATTRIBUTE='${tableModel.engineAttribute}'`);
199
+ if (tableModel.secondaryEngineAttribute) sqls.push(`SECONDARY_ENGINE_ATTRIBUTE = '${tableModel.secondaryEngineAttribute}'`);
200
+ if (tableModel.insertMethod) sqls.push(`INSERT_METHOD=${tableModel.insertMethod}`);
201
+ if (tableModel.keyBlockSize) sqls.push(`KEY_BLOCK_SIZE=${tableModel.keyBlockSize}`);
202
+ if (tableModel.maxRows) sqls.push(`MAX_ROWS=${tableModel.maxRows}`);
203
+ if (tableModel.minRows) sqls.push(`MIN_ROWS=${tableModel.minRows}`);
204
+ if (tableModel.rowFormat) sqls.push(`ROW_FORMAT=${tableModel.rowFormat}`);
205
+ return sqls.join(", ");
206
+ }
207
+ generate(tableModel) {
208
+ const createSql = [];
209
+ createSql.push(`CREATE TABLE IF NOT EXISTS ${tableModel.name} (`);
210
+ const columnSql = [];
211
+ for (const column of tableModel.columns) columnSql.push(this.generateColumn(column));
212
+ const indexSql = [];
213
+ for (const index of tableModel.indices) indexSql.push(this.generateIndex(index));
214
+ if (indexSql.length) {
215
+ createSql.push(columnSql.join(",\n") + ",");
216
+ createSql.push(indexSql.join(",\n"));
217
+ } else createSql.push(columnSql.join(",\n"));
218
+ createSql.push(`) ${this.generateTableOptions(tableModel)};`);
219
+ return createSql.join("\n");
220
+ }
221
+ };
222
+
223
+ //#endregion
224
+ export { SqlGenerator };