@dbml/core 2.3.1 → 2.4.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/export/DbmlExporter.js +9 -1
- package/lib/export/MysqlExporter.js +41 -35
- package/lib/export/PostgresExporter.js +55 -42
- package/lib/export/SqlServerExporter.js +43 -39
- package/lib/model_structure/database.js +53 -12
- package/lib/model_structure/endpoint.js +2 -2
- package/lib/model_structure/field.js +31 -1
- package/lib/model_structure/ref.js +1 -2
- package/lib/model_structure/schema.js +3 -19
- package/lib/model_structure/tableGroup.js +1 -1
- package/lib/model_structure/utils.js +5 -0
- package/lib/parse/dbml/parser.pegjs +61 -19
- package/lib/parse/dbmlParser.js +1219 -883
- package/lib/parse/mssql/fk_definition/actions.js +10 -3
- package/lib/parse/mssql/statements/actions.js +9 -6
- package/lib/parse/mssql/statements/statement_types/alter_table/actions.js +11 -5
- package/lib/parse/mssql/statements/statement_types/create_index/actions.js +6 -1
- package/lib/parse/mssql/statements/statement_types/create_table/actions.js +11 -9
- package/lib/parse/mssql/utils.js +15 -0
- package/lib/parse/mysql/parser.pegjs +46 -14
- package/lib/parse/mysqlParser.js +215 -167
- package/lib/parse/postgresParser.js +11 -10
- package/lib/parse/postgresql/Base_rules.pegjs +24 -3
- package/lib/parse/postgresql/Commands/Alter_table/Alter_table.pegjs +2 -1
- package/lib/parse/postgresql/Commands/Create_table/Create_table_normal.pegjs +5 -3
- package/lib/parse/postgresql/Commands/Create_table/Create_table_of.pegjs +1 -1
- package/lib/parse/postgresql/Commands/Create_table/Create_table_partition_of.pegjs +1 -1
- package/lib/parse/postgresql/Commands/Create_type/Create_type_enum.pegjs +2 -2
- package/lib/parse/postgresql/InitializerUtils.pegjs +10 -0
- package/lib/parse/postgresql/parser.pegjs +2 -1
- package/package.json +2 -2
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
|
|
5
|
+
var _require = require('../utils'),
|
|
6
|
+
getFullTableName = _require.getFullTableName;
|
|
7
|
+
|
|
5
8
|
function makeEndPoint(tableName, columnName, relation) {
|
|
6
9
|
return {
|
|
7
|
-
tableName: tableName
|
|
10
|
+
tableName: tableName.name,
|
|
11
|
+
schemaName: tableName.schemaName,
|
|
8
12
|
fieldNames: columnName,
|
|
9
13
|
relation: relation
|
|
10
14
|
};
|
|
@@ -24,7 +28,8 @@ function setOption(value, fkOptions) {
|
|
|
24
28
|
|
|
25
29
|
function makeColumnConstraintFK(_unused, tableName, columnName, fkOptions) {
|
|
26
30
|
var value = {};
|
|
27
|
-
|
|
31
|
+
var fullTableName = getFullTableName(tableName);
|
|
32
|
+
value.endpoint = makeEndPoint(fullTableName, columnName, '1');
|
|
28
33
|
setOption(value, fkOptions);
|
|
29
34
|
return {
|
|
30
35
|
type: 'inline_refs',
|
|
@@ -43,6 +48,7 @@ function makeTableEndpoint(columnNames) {
|
|
|
43
48
|
|
|
44
49
|
function makeTableConstraintFK(_keyword1, endpoint1, _keyword2, tableName, endpoint2, fkOptions) {
|
|
45
50
|
var value = {};
|
|
51
|
+
var fullTableName = getFullTableName(tableName);
|
|
46
52
|
|
|
47
53
|
if (!endpoint2) {
|
|
48
54
|
// eslint-disable-next-line no-param-reassign
|
|
@@ -55,7 +61,8 @@ function makeTableConstraintFK(_keyword1, endpoint1, _keyword2, tableName, endpo
|
|
|
55
61
|
|
|
56
62
|
endpoint1.value.relation = '*';
|
|
57
63
|
endpoint2.value.relation = '1';
|
|
58
|
-
endpoint2.value.tableName =
|
|
64
|
+
endpoint2.value.tableName = fullTableName.name;
|
|
65
|
+
endpoint2.value.schemaName = fullTableName.schemaName;
|
|
59
66
|
value.endpoints = [endpoint1.value, endpoint2.value];
|
|
60
67
|
setOption(value, fkOptions);
|
|
61
68
|
return {
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
|
|
5
|
-
function findTable(ast, tableName) {
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function findTable(ast, tableName, schemaName) {
|
|
6
|
+
var realSchemaName = schemaName || 'public';
|
|
7
|
+
var table = ast.tables.find(function (t) {
|
|
8
|
+
var targetSchemaName = t.schemaName || 'public';
|
|
9
|
+
return targetSchemaName === realSchemaName && t.name === tableName;
|
|
8
10
|
});
|
|
11
|
+
return table;
|
|
9
12
|
}
|
|
10
13
|
|
|
11
14
|
function findField(table, fieldName) {
|
|
@@ -15,7 +18,7 @@ function findField(table, fieldName) {
|
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
function handleIndexes(index, ast) {
|
|
18
|
-
var table = findTable(ast, index.tableName);
|
|
21
|
+
var table = findTable(ast, index.tableName, index.schemaName);
|
|
19
22
|
table.indexes.push(index);
|
|
20
23
|
index.tableName = null;
|
|
21
24
|
}
|
|
@@ -37,7 +40,7 @@ function handleTable(table, ast) {
|
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
function handleDefaults(dbdefault, ast) {
|
|
40
|
-
var table = findTable(ast, dbdefault.tableName);
|
|
43
|
+
var table = findTable(ast, dbdefault.tableName, dbdefault.schemaName);
|
|
41
44
|
var field = findField(table, dbdefault.fieldName);
|
|
42
45
|
dbdefault.fieldName = null;
|
|
43
46
|
dbdefault.tableName = null;
|
|
@@ -45,7 +48,7 @@ function handleDefaults(dbdefault, ast) {
|
|
|
45
48
|
}
|
|
46
49
|
|
|
47
50
|
function handleEnums(_enum, ast) {
|
|
48
|
-
var table = findTable(ast, _enum.tableName);
|
|
51
|
+
var table = findTable(ast, _enum.tableName, _enum.schemaName);
|
|
49
52
|
var field = findField(table, _enum.fieldName);
|
|
50
53
|
_enum.name = "".concat(_enum.tableName, "_").concat(_enum.fieldName, "_enum");
|
|
51
54
|
_enum.fieldName = null;
|
|
@@ -2,31 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
|
|
5
|
+
var _require = require('../../../utils'),
|
|
6
|
+
getFullTableName = _require.getFullTableName;
|
|
7
|
+
|
|
5
8
|
function handleRef(tableName, result) {
|
|
6
9
|
var endpointWithNoTableName = result.value.endpoints.find(function (ele) {
|
|
7
10
|
return !ele.tableName;
|
|
8
11
|
});
|
|
9
|
-
endpointWithNoTableName.tableName =
|
|
12
|
+
endpointWithNoTableName.tableName = tableName.name;
|
|
13
|
+
endpointWithNoTableName.schemaName = tableName.schemaName;
|
|
10
14
|
}
|
|
11
15
|
|
|
12
16
|
function addTableName(tableName, result) {
|
|
13
|
-
result.value.tableName =
|
|
17
|
+
result.value.tableName = tableName.name;
|
|
18
|
+
result.value.schemaName = tableName.schemaName;
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
function handleAlterTableResult(_keyword, tableName, results) {
|
|
17
|
-
if (!results) return null;
|
|
22
|
+
if (!results) return null;
|
|
23
|
+
var fullName = getFullTableName(tableName); // eslint-disable-next-line consistent-return
|
|
18
24
|
|
|
19
25
|
results.forEach(function (result) {
|
|
20
26
|
if (result) {
|
|
21
27
|
switch (result.type) {
|
|
22
28
|
case 'refs':
|
|
23
|
-
handleRef(
|
|
29
|
+
handleRef(fullName, result);
|
|
24
30
|
break;
|
|
25
31
|
|
|
26
32
|
case 'indexes':
|
|
27
33
|
case 'dbdefault':
|
|
28
34
|
case 'enums':
|
|
29
|
-
addTableName(
|
|
35
|
+
addTableName(fullName, result);
|
|
30
36
|
break;
|
|
31
37
|
|
|
32
38
|
default:
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _require = require('../../../utils'),
|
|
4
|
+
getFullTableName = _require.getFullTableName;
|
|
5
|
+
|
|
3
6
|
function makeIndex(_create, isUnique, _clustered, _index, indexName, _on, tableName, columnNames) {
|
|
7
|
+
var fullTableName = getFullTableName(tableName);
|
|
4
8
|
var columns = [];
|
|
5
9
|
columnNames.forEach(function (columnName) {
|
|
6
10
|
columns.push({
|
|
@@ -13,7 +17,8 @@ function makeIndex(_create, isUnique, _clustered, _index, indexName, _on, tableN
|
|
|
13
17
|
value: {
|
|
14
18
|
name: indexName,
|
|
15
19
|
unique: isUnique ? true : null,
|
|
16
|
-
tableName:
|
|
20
|
+
tableName: fullTableName.name,
|
|
21
|
+
schemaName: fullTableName.schemaName,
|
|
17
22
|
columns: columns
|
|
18
23
|
}
|
|
19
24
|
};
|
|
@@ -8,6 +8,9 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
|
|
|
8
8
|
|
|
9
9
|
var _ = require('lodash');
|
|
10
10
|
|
|
11
|
+
var _require = require('../../../utils'),
|
|
12
|
+
getFullTableName = _require.getFullTableName;
|
|
13
|
+
|
|
11
14
|
function createRefFromInlineRef(linesRefs, inlineRefs, fieldName, tableName) {
|
|
12
15
|
if (!inlineRefs || inlineRefs.length === 0) return;
|
|
13
16
|
var newRef = {};
|
|
@@ -16,7 +19,8 @@ function createRefFromInlineRef(linesRefs, inlineRefs, fieldName, tableName) {
|
|
|
16
19
|
newRef.onDelete = inlineRef.onDelete;
|
|
17
20
|
newRef.endpoints = [];
|
|
18
21
|
newRef.endpoints.push({
|
|
19
|
-
tableName: tableName,
|
|
22
|
+
tableName: tableName.name,
|
|
23
|
+
schemaName: tableName.schemaName,
|
|
20
24
|
fieldNames: [fieldName],
|
|
21
25
|
relation: '*'
|
|
22
26
|
});
|
|
@@ -33,7 +37,7 @@ function pushOutEnum(linesEnums, fieldValue, tableName) {
|
|
|
33
37
|
if (fieldValue.enums) {
|
|
34
38
|
var _enum = fieldValue.enums;
|
|
35
39
|
var fieldType = fieldValue.type;
|
|
36
|
-
_enum.name = "".concat(tableName, "_").concat(fieldValue.enums.name);
|
|
40
|
+
_enum.name = "".concat(tableName.schemaName ? "".concat(tableName.schemaName, "_") : '').concat(tableName.name, "_").concat(fieldValue.enums.name);
|
|
37
41
|
fieldType.type_name = _enum.name;
|
|
38
42
|
fieldType.args = _enum.values.map(function (value) {
|
|
39
43
|
return "'".concat(value.name, "'");
|
|
@@ -71,7 +75,8 @@ function getLinesValue(lines, tableName) {
|
|
|
71
75
|
|
|
72
76
|
if (line.type === 'refs') {
|
|
73
77
|
var ref = line.value;
|
|
74
|
-
ref.endpoints[0].tableName = tableName;
|
|
78
|
+
ref.endpoints[0].tableName = tableName.name;
|
|
79
|
+
ref.endpoints[0].schemaName = tableName.schemaName;
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
value[line.type].push(line.value);
|
|
@@ -84,14 +89,11 @@ function getLinesValue(lines, tableName) {
|
|
|
84
89
|
}
|
|
85
90
|
|
|
86
91
|
function makeTable(_keyword, tableName, _keyword2, lines) {
|
|
87
|
-
var
|
|
92
|
+
var fullName = getFullTableName(tableName);
|
|
93
|
+
var linesValue = getLinesValue(lines, fullName);
|
|
88
94
|
return {
|
|
89
95
|
type: 'tables',
|
|
90
|
-
value: _objectSpread(_objectSpread({
|
|
91
|
-
name: _.last(tableName)
|
|
92
|
-
}, linesValue.value), {}, {
|
|
93
|
-
schemaName: tableName.length > 1 ? tableName[tableName.length - 2] : null
|
|
94
|
-
})
|
|
96
|
+
value: _objectSpread(_objectSpread({}, fullName), linesValue.value)
|
|
95
97
|
};
|
|
96
98
|
}
|
|
97
99
|
|
package/lib/parse/mssql/utils.js
CHANGED
|
@@ -4,6 +4,8 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
|
|
|
4
4
|
|
|
5
5
|
var P = require('parsimmon');
|
|
6
6
|
|
|
7
|
+
var _ = require('lodash');
|
|
8
|
+
|
|
7
9
|
var _require = require('./keyword_parsers'),
|
|
8
10
|
LParen = _require.LParen,
|
|
9
11
|
RParen = _require.RParen,
|
|
@@ -47,4 +49,17 @@ exports.streamline = function (type) {
|
|
|
47
49
|
};
|
|
48
50
|
});
|
|
49
51
|
};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
exports.getFullTableName = function (nameList) {
|
|
55
|
+
var schemaName = null;
|
|
56
|
+
|
|
57
|
+
if (nameList.length > 1) {
|
|
58
|
+
schemaName = nameList[nameList.length - 2];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
name: _.last(nameList),
|
|
63
|
+
schemaName: schemaName
|
|
64
|
+
};
|
|
50
65
|
};
|
|
@@ -4,6 +4,15 @@
|
|
|
4
4
|
const refs = [];
|
|
5
5
|
const enums = [];
|
|
6
6
|
|
|
7
|
+
// TODO: support configurable default schema name other than 'public'
|
|
8
|
+
const findTable = (schemaName, tableName) => {
|
|
9
|
+
const realSchemaName = schemaName || 'public';
|
|
10
|
+
const table = tables.find(table => {
|
|
11
|
+
const targetSchemaName = table.schemaName || 'public';
|
|
12
|
+
return targetSchemaName === realSchemaName && table.name === tableName;
|
|
13
|
+
});
|
|
14
|
+
return table;
|
|
15
|
+
};
|
|
7
16
|
// intput:
|
|
8
17
|
// `
|
|
9
18
|
// 'created'
|
|
@@ -35,9 +44,9 @@ Expr =
|
|
|
35
44
|
// TableSyntax: support "CREATE TABLE" syntax.
|
|
36
45
|
// Try to support as mush as possible syntax in MySQL offical documents.
|
|
37
46
|
// https://dev.mysql.com/doc/refman/8.0/en/create-table.html
|
|
38
|
-
// Return: table object: {name, fields, [,indexes]}
|
|
47
|
+
// Return: table object: {name, schemaName, fields, [,indexes]}
|
|
39
48
|
TableSyntax
|
|
40
|
-
= create_table (__ if_not_exist)? __
|
|
49
|
+
= create_table (__ if_not_exist)? __ table_name:table_name _
|
|
41
50
|
"(" _ body:TableBody _ ")" _ TableOptions? _ semicolon endline?
|
|
42
51
|
{
|
|
43
52
|
const fields = body.fields;
|
|
@@ -59,7 +68,8 @@ TableSyntax
|
|
|
59
68
|
});
|
|
60
69
|
|
|
61
70
|
const _enum = {
|
|
62
|
-
name: `${
|
|
71
|
+
name: `${table_name.schemaName
|
|
72
|
+
? `${table_name.schemaName}_` : ''}${table_name.name}_${field.name}_enum`,
|
|
63
73
|
values
|
|
64
74
|
};
|
|
65
75
|
enums.push(_enum);
|
|
@@ -68,15 +78,16 @@ TableSyntax
|
|
|
68
78
|
});
|
|
69
79
|
|
|
70
80
|
bodyRefs.forEach(ref => {
|
|
71
|
-
ref.endpoints[0].tableName = name;
|
|
81
|
+
ref.endpoints[0].tableName = table_name.name;
|
|
82
|
+
ref.endpoints[0].schemaName = table_name.schemaName;
|
|
72
83
|
ref.endpoints[0].relation = '*';
|
|
73
84
|
refs.push(ref);
|
|
74
85
|
});
|
|
75
86
|
|
|
76
87
|
// return statement
|
|
77
88
|
return indexes ?
|
|
78
|
-
{
|
|
79
|
-
: {
|
|
89
|
+
{...table_name, fields, indexes}
|
|
90
|
+
: {...table_name, fields}
|
|
80
91
|
}
|
|
81
92
|
|
|
82
93
|
// TableBody: this is the part between parenthesis.
|
|
@@ -149,7 +160,8 @@ FKSyntax = _ constraint:("CONSTRAINT"i _ name)? _ foreign_key _
|
|
|
149
160
|
relation: "*",
|
|
150
161
|
},
|
|
151
162
|
{
|
|
152
|
-
tableName: table2,
|
|
163
|
+
tableName: table2.name,
|
|
164
|
+
schemaName: table2.schemaName,
|
|
153
165
|
fieldNames: fields2,
|
|
154
166
|
relation: "1",
|
|
155
167
|
}
|
|
@@ -295,16 +307,19 @@ CheckConstraintSyntax = _ ("CONSTRAINT"i name _)? "CHECK"i _ expression _ ("NOT"
|
|
|
295
307
|
// AlterSyntax: support "ALTER TABLE" syntax
|
|
296
308
|
// We will support ADD_COLUMN, ADD_FOREIGN_KEY, ADD_INDEX
|
|
297
309
|
// https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
|
|
298
|
-
AlterSyntax = alter_table _ table:
|
|
310
|
+
AlterSyntax = alter_table _ table:table_name _
|
|
299
311
|
options:(AddOptions/ChangeOptions/DropOptions) _
|
|
300
312
|
semicolon
|
|
301
313
|
{
|
|
302
314
|
const fks = _.flatten(options.filter(o => o.type === "add_fk").map(o => o.fks));
|
|
303
|
-
fks.forEach(fk => {
|
|
315
|
+
fks.forEach(fk => {
|
|
316
|
+
fk.endpoints[0].tableName = table.name;
|
|
317
|
+
fk.endpoints[0].schemaName = table.schemaName;
|
|
318
|
+
});
|
|
304
319
|
refs.push(...fks)
|
|
305
320
|
|
|
306
321
|
const pks = _.flatten(options.filter(o => o.type === "add_pk").map(o => o.pks));
|
|
307
|
-
const tableAlter =
|
|
322
|
+
const tableAlter = findTable(table.schemaName, table.name);
|
|
308
323
|
|
|
309
324
|
const index = {
|
|
310
325
|
columns: pks.map(field => ({
|
|
@@ -341,7 +356,7 @@ DropOptions = "DROP"i [^;]
|
|
|
341
356
|
|
|
342
357
|
// IndexSyntax: support "CREATE INDEX" syntax
|
|
343
358
|
IndexSyntax = constraint:create_index _ indexName:name _
|
|
344
|
-
"ON"i _ tableName:
|
|
359
|
+
"ON"i _ tableName:table_name _ indexType:index_type? _
|
|
345
360
|
columns: IndexColumn _
|
|
346
361
|
option:IndexOption? semicolon
|
|
347
362
|
{
|
|
@@ -358,7 +373,8 @@ IndexSyntax = constraint:create_index _ indexName:name _
|
|
|
358
373
|
if(type)
|
|
359
374
|
index.type = type;
|
|
360
375
|
|
|
361
|
-
const table =
|
|
376
|
+
const table = findTable(tableName.schemaName, tableName.name);
|
|
377
|
+
|
|
362
378
|
if(table.indexes) {
|
|
363
379
|
table.indexes.push(index);
|
|
364
380
|
} else {
|
|
@@ -458,8 +474,24 @@ index_type "index type" = "USING"i _ type:("BTREE"i/"HASH"i) { return type.toUpp
|
|
|
458
474
|
name "valid name"
|
|
459
475
|
= c:(character)+ { return c.join("") }
|
|
460
476
|
/ quote c:[^`]+ quote { return c.join("") }
|
|
461
|
-
|
|
462
|
-
|
|
477
|
+
|
|
478
|
+
path_name = names:(name _ "." _)* {
|
|
479
|
+
let dbName = null;
|
|
480
|
+
let schemaName = null;
|
|
481
|
+
if (names && names.length > 0) {
|
|
482
|
+
if (names.length === 1) schemaName = names[0][0];
|
|
483
|
+
else {
|
|
484
|
+
dbName = names[0][0];
|
|
485
|
+
schemaName = names[1][0];
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return { dbName, schemaName }
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
table_name "valid table name" = pathName:path_name name:name {
|
|
492
|
+
return { ...pathName, name }
|
|
493
|
+
}
|
|
494
|
+
|
|
463
495
|
type "type" = c:type_name { return c }
|
|
464
496
|
/ c:name { return { type_name: c } }
|
|
465
497
|
type_name = type_name:name _ args:("(" _ expression _ ")")? {
|