@dbml/core 2.3.1 → 2.4.2
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 +11 -6
- package/lib/export/MysqlExporter.js +127 -48
- package/lib/export/PostgresExporter.js +142 -55
- package/lib/export/SqlServerExporter.js +130 -52
- package/lib/export/utils.js +40 -0
- 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 +74 -24
- package/lib/parse/dbmlParser.js +1275 -886
- package/lib/parse/mssql/fk_definition/actions.js +10 -3
- package/lib/parse/mssql/keyword_parsers.js +12 -1
- package/lib/parse/mssql/statements/actions.js +37 -6
- package/lib/parse/mssql/statements/index.js +1 -1
- package/lib/parse/mssql/statements/statement_types/alter_table/actions.js +11 -5
- package/lib/parse/mssql/statements/statement_types/comments/actions.js +57 -0
- package/lib/parse/mssql/statements/statement_types/comments/index.js +97 -0
- 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/statements/statement_types/index.js +4 -1
- package/lib/parse/mssql/utils.js +15 -0
- package/lib/parse/mysql/parser.pegjs +55 -20
- package/lib/parse/mysqlParser.js +479 -308
- package/lib/parse/postgresParser.js +15 -14
- package/lib/parse/postgresql/Base_rules.pegjs +24 -3
- package/lib/parse/postgresql/Commands/Alter_table/Alter_table.pegjs +49 -4
- package/lib/parse/postgresql/Commands/Comment.pegjs +18 -6
- 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/Commands/Ignore_syntax.pegjs +10 -1
- package/lib/parse/postgresql/InitializerUtils.pegjs +14 -2
- package/lib/parse/postgresql/Keywords.pegjs +5 -1
- package/lib/parse/postgresql/parser.pegjs +22 -8
- 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 {
|
|
@@ -83,6 +83,7 @@ exports.KeywordCollate = keyword(/COLLATE/i);
|
|
|
83
83
|
exports.KeywordClose = keyword(/CLOSE/i);
|
|
84
84
|
exports.KeywordDeny = keyword(/DENY/i);
|
|
85
85
|
exports.KeywordExecute = keyword(/EXECUTE/i);
|
|
86
|
+
exports.KeywordExec = keyword(/EXEC/i);
|
|
86
87
|
exports.KeywordGrant = keyword(/GRANT/i);
|
|
87
88
|
exports.KeywordOpen = keyword(/OPEN/i);
|
|
88
89
|
exports.KeywordRevoke = keyword(/REVOKE/i);
|
|
@@ -96,6 +97,7 @@ exports.KeywordSend = keyword(/SEND/i);
|
|
|
96
97
|
exports.KeywordRename = keyword(/RENAME/i);
|
|
97
98
|
exports.KeywordDelete = keyword(/DELETE/i);
|
|
98
99
|
exports.KeywordIf = keyword(/IF/i);
|
|
100
|
+
exports.KeywordSP_ADDEXTENDEDPROPERTY = keyword(/sp_addextendedproperty/i);
|
|
99
101
|
exports.LogicalOpIn = keyword(/IN/i);
|
|
100
102
|
exports.LogicalOpAnd = keyword(/AND/i);
|
|
101
103
|
exports.LessThan = word('<');
|
|
@@ -104,7 +106,16 @@ exports.LParen = word('(');
|
|
|
104
106
|
exports.Comma = word(',');
|
|
105
107
|
exports.RParen = word(')');
|
|
106
108
|
exports.DoubleQuote = word('"');
|
|
109
|
+
exports.SingleQuote = word('\'');
|
|
107
110
|
exports.LBracket = word('[');
|
|
108
111
|
exports.RBracket = word(']');
|
|
109
112
|
exports.Equal = word('=');
|
|
110
|
-
exports.Semicolon = word(';');
|
|
113
|
+
exports.Semicolon = word(';');
|
|
114
|
+
exports.KeywordAtName = keyword(/@name/i);
|
|
115
|
+
exports.KeywordAtValue = keyword(/@value/i);
|
|
116
|
+
exports.KeywordAtLevel0Type = keyword(/@level0type/i);
|
|
117
|
+
exports.KeywordAtLevel0Name = keyword(/@level0name/i);
|
|
118
|
+
exports.KeywordAtLevel1Type = keyword(/@level1type/i);
|
|
119
|
+
exports.KeywordAtLevel1Name = keyword(/@level1name/i);
|
|
120
|
+
exports.KeywordAtLevel2Type = keyword(/@level2type/i);
|
|
121
|
+
exports.KeywordAtLevel2Name = keyword(/@level2name/i);
|
|
@@ -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;
|
|
@@ -56,6 +59,30 @@ function handleEnums(_enum, ast) {
|
|
|
56
59
|
}).join(', ');
|
|
57
60
|
}
|
|
58
61
|
|
|
62
|
+
function handleComment(comment, ast) {
|
|
63
|
+
if (comment.type === 'table') handleTableNote(comment, ast);else if (comment.type === 'column') handleFieldNote(comment, ast);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function handleTableNote(comment, ast) {
|
|
67
|
+
var schemaName = comment.schemaName;
|
|
68
|
+
if (schemaName === 'dbo') schemaName = null; // treat `dbo` as public schema
|
|
69
|
+
|
|
70
|
+
var foundTable = findTable(ast, comment.tableName, schemaName);
|
|
71
|
+
if (foundTable) foundTable.note = comment.note;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function handleFieldNote(comment, ast) {
|
|
75
|
+
var schemaName = comment.schemaName;
|
|
76
|
+
if (schemaName === 'dbo') schemaName = null; // treat `dbo` as public schema
|
|
77
|
+
|
|
78
|
+
var foundTable = findTable(ast, comment.tableName, schemaName);
|
|
79
|
+
|
|
80
|
+
if (foundTable) {
|
|
81
|
+
var foundField = findField(foundTable, comment.columnName);
|
|
82
|
+
if (foundField) foundField.note = comment.note;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
59
86
|
function handleStatement(_statements) {
|
|
60
87
|
var ast = {
|
|
61
88
|
tables: [],
|
|
@@ -87,6 +114,10 @@ function handleStatement(_statements) {
|
|
|
87
114
|
handleEnums(statement.value, ast);
|
|
88
115
|
break;
|
|
89
116
|
|
|
117
|
+
case 'comment':
|
|
118
|
+
handleComment(statement.value, ast);
|
|
119
|
+
break;
|
|
120
|
+
|
|
90
121
|
default:
|
|
91
122
|
break;
|
|
92
123
|
}
|
|
@@ -18,7 +18,7 @@ var Lang = P.createLanguage({
|
|
|
18
18
|
return wss.then(r.Seperator).then(P.sepBy(r.StatementTypes, r.Seperator)).skip(r.Seperator).map(A.handleStatement);
|
|
19
19
|
},
|
|
20
20
|
StatementTypes: function StatementTypes(r) {
|
|
21
|
-
return P.alt(S.pCreateIndex, S.pCreateTable, S.pAlterTable, r.IgnoredStatementTypes);
|
|
21
|
+
return P.alt(S.pCreateIndex, S.pCreateTable, S.pAlterTable, S.pCommentSyntax, r.IgnoredStatementTypes);
|
|
22
22
|
},
|
|
23
23
|
IgnoredStatementTypes: function IgnoredStatementTypes(r) {
|
|
24
24
|
return P.seq(r.IgnoredStatementSyntax, pIgnore);
|
|
@@ -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:
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function handleComment(_ref) {
|
|
4
|
+
var note = _ref.note,
|
|
5
|
+
level = _ref.level;
|
|
6
|
+
var type = 'unsupported';
|
|
7
|
+
var schemaName = null,
|
|
8
|
+
tableName = null,
|
|
9
|
+
columnName = null;
|
|
10
|
+
|
|
11
|
+
if (isValidTableNote(level)) {
|
|
12
|
+
schemaName = level[0].name;
|
|
13
|
+
tableName = level[1].name; // Table Comment
|
|
14
|
+
|
|
15
|
+
type = 'table';
|
|
16
|
+
} else if (isValidColumnNote(level)) {
|
|
17
|
+
schemaName = level[0].name;
|
|
18
|
+
tableName = level[1].name;
|
|
19
|
+
columnName = level[2].name;
|
|
20
|
+
type = 'column';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
type: 'comment',
|
|
25
|
+
value: {
|
|
26
|
+
type: type,
|
|
27
|
+
note: note,
|
|
28
|
+
schemaName: schemaName,
|
|
29
|
+
tableName: tableName,
|
|
30
|
+
columnName: columnName
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
var isSchema = function isSchema(type) {
|
|
36
|
+
return type.toLowerCase() === 'schema';
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
var isTable = function isTable(type) {
|
|
40
|
+
return type.toLowerCase() === 'table';
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
var isColumn = function isColumn(type) {
|
|
44
|
+
return type.toLowerCase() === 'column';
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
var isValidTableNote = function isValidTableNote(level) {
|
|
48
|
+
return level.length === 2 && isSchema(level[0].type) && isTable(level[1].type);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
var isValidColumnNote = function isValidColumnNote(level) {
|
|
52
|
+
return level.length === 3 && isSchema(level[0].type) && isTable(level[1].type) && isColumn(level[2].type);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
module.exports = {
|
|
56
|
+
handleComment: handleComment
|
|
57
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
4
|
+
|
|
5
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
6
|
+
|
|
7
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
8
|
+
|
|
9
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
|
|
10
|
+
|
|
11
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
12
|
+
|
|
13
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
14
|
+
|
|
15
|
+
var P = require('parsimmon');
|
|
16
|
+
|
|
17
|
+
var KP = require('../../../keyword_parsers');
|
|
18
|
+
|
|
19
|
+
var A = require('./actions');
|
|
20
|
+
|
|
21
|
+
var _require = require('../../../utils'),
|
|
22
|
+
makeNode = _require.makeNode;
|
|
23
|
+
|
|
24
|
+
var Lang = P.createLanguage({
|
|
25
|
+
StartComment: function StartComment() {
|
|
26
|
+
return P.seq(KP.KeywordExec, KP.KeywordSP_ADDEXTENDEDPROPERTY);
|
|
27
|
+
},
|
|
28
|
+
EndComment: function EndComment() {
|
|
29
|
+
return P.seq(KP.Semicolon.atMost(1), KP.KeywordGo);
|
|
30
|
+
},
|
|
31
|
+
StartString: function StartString() {
|
|
32
|
+
return P.alt(KP.SingleQuote, P.string("N'"));
|
|
33
|
+
},
|
|
34
|
+
ManyDoubleSingleQuote: function ManyDoubleSingleQuote() {
|
|
35
|
+
return P.string("''");
|
|
36
|
+
},
|
|
37
|
+
NoSingleQuote: function NoSingleQuote() {
|
|
38
|
+
return P.regex(/[^']/);
|
|
39
|
+
},
|
|
40
|
+
StringType: function StringType(r) {
|
|
41
|
+
return P.alt(r.NoSingleQuote, r.ManyDoubleSingleQuote).atLeast(1).map(function (res) {
|
|
42
|
+
return res.join('');
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
NVarchar: function NVarchar(r) {
|
|
46
|
+
return r.StartString.then(r.StringType).skip(KP.SingleQuote);
|
|
47
|
+
},
|
|
48
|
+
NameOption: function NameOption(r) {
|
|
49
|
+
return KP.KeywordAtName.skip(KP.Equal).then(r.NVarchar);
|
|
50
|
+
},
|
|
51
|
+
ValueOption: function ValueOption(r) {
|
|
52
|
+
return KP.KeywordAtValue.skip(KP.Equal).then(r.NVarchar);
|
|
53
|
+
},
|
|
54
|
+
Level0Type: function Level0Type(r) {
|
|
55
|
+
return KP.KeywordAtLevel0Type.skip(KP.Equal).then(r.NVarchar);
|
|
56
|
+
},
|
|
57
|
+
Level0Name: function Level0Name(r) {
|
|
58
|
+
return KP.KeywordAtLevel0Name.skip(KP.Equal).then(r.NVarchar);
|
|
59
|
+
},
|
|
60
|
+
Level1Type: function Level1Type(r) {
|
|
61
|
+
return KP.KeywordAtLevel1Type.skip(KP.Equal).then(r.NVarchar);
|
|
62
|
+
},
|
|
63
|
+
Level1Name: function Level1Name(r) {
|
|
64
|
+
return KP.KeywordAtLevel1Name.skip(KP.Equal).then(r.NVarchar);
|
|
65
|
+
},
|
|
66
|
+
Level2Type: function Level2Type(r) {
|
|
67
|
+
return KP.KeywordAtLevel2Type.skip(KP.Equal).then(r.NVarchar);
|
|
68
|
+
},
|
|
69
|
+
Level2Name: function Level2Name(r) {
|
|
70
|
+
return KP.KeywordAtLevel2Name.skip(KP.Equal).then(r.NVarchar);
|
|
71
|
+
},
|
|
72
|
+
Level0Stmt: function Level0Stmt(r) {
|
|
73
|
+
return P.seqObj(['type', r.Level0Type], KP.Comma, ['name', r.Level0Name]);
|
|
74
|
+
},
|
|
75
|
+
Level1Stmt: function Level1Stmt(r) {
|
|
76
|
+
return P.seqObj(['type', r.Level1Type], KP.Comma, ['name', r.Level1Name]);
|
|
77
|
+
},
|
|
78
|
+
Level2Stmt: function Level2Stmt(r) {
|
|
79
|
+
return P.seqObj(['type', r.Level2Type], KP.Comma, ['name', r.Level2Name]);
|
|
80
|
+
},
|
|
81
|
+
Level0Wrapper: function Level0Wrapper(r) {
|
|
82
|
+
return P.alt(P.seq(r.Level0Stmt.skip(KP.Comma), r.Level1Wrapper), r.Level0Stmt).map(function (res) {
|
|
83
|
+
return Array.isArray(res) ? [res[0]].concat(_toConsumableArray(res[1])) : [res];
|
|
84
|
+
}).atMost(1).map(function (res) {
|
|
85
|
+
return res.length === 1 ? res[0] : res;
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
Level1Wrapper: function Level1Wrapper(r) {
|
|
89
|
+
return P.alt(P.seq(r.Level1Stmt.skip(KP.Comma), r.Level2Stmt), r.Level1Stmt).map(function (res) {
|
|
90
|
+
return Array.isArray(res) ? res : [res];
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
CommentSyntax: function CommentSyntax(r) {
|
|
94
|
+
return P.seqObj(r.StartComment, ['name', r.NameOption], KP.Comma, ['note', r.ValueOption], KP.Comma, ['level', r.Level0Wrapper], r.EndComment).map(A.handleComment).thru(makeNode());
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
module.exports = Lang.CommentSyntax;
|
|
@@ -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
|
|
|
@@ -6,8 +6,11 @@ var pCreateIndex = require('./create_index/index');
|
|
|
6
6
|
|
|
7
7
|
var pCreateTable = require('./create_table');
|
|
8
8
|
|
|
9
|
+
var pCommentSyntax = require('./comments');
|
|
10
|
+
|
|
9
11
|
module.exports = {
|
|
10
12
|
pAlterTable: pAlterTable,
|
|
11
13
|
pCreateIndex: pCreateIndex,
|
|
12
|
-
pCreateTable: pCreateTable
|
|
14
|
+
pCreateTable: pCreateTable,
|
|
15
|
+
pCommentSyntax: pCommentSyntax
|
|
13
16
|
};
|
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'
|
|
@@ -25,20 +34,20 @@ Rule = (Expr)* {
|
|
|
25
34
|
return {tables, refs, enums};
|
|
26
35
|
}
|
|
27
36
|
|
|
28
|
-
Expr =
|
|
37
|
+
Expr =
|
|
29
38
|
t:TableSyntax { tables.push(t) }
|
|
30
39
|
/AlterSyntax
|
|
31
40
|
/IndexSyntax
|
|
32
41
|
/IgnoreSyntax
|
|
33
42
|
/__
|
|
34
|
-
|
|
43
|
+
|
|
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]}
|
|
39
|
-
TableSyntax
|
|
40
|
-
= create_table (__ if_not_exist)? __
|
|
41
|
-
"(" _ body:TableBody _ ")" _ TableOptions? _ semicolon endline?
|
|
47
|
+
// Return: table object: {name, schemaName, fields, [,indexes]}
|
|
48
|
+
TableSyntax
|
|
49
|
+
= create_table (__ if_not_exist)? __ table_name:table_name _
|
|
50
|
+
"(" _ body:TableBody _ ")" _ options:TableOptions? _ semicolon endline?
|
|
42
51
|
{
|
|
43
52
|
const fields = body.fields;
|
|
44
53
|
const indexes = body.indexes;
|
|
@@ -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,18 @@ 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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
87
|
+
let res = {...table_name, fields};
|
|
88
|
+
|
|
89
|
+
if (options && options.comment) res.note = options.comment;
|
|
90
|
+
if (indexes) res.indexes = indexes;
|
|
91
|
+
// return statement
|
|
92
|
+
return res;
|
|
80
93
|
}
|
|
81
94
|
|
|
82
95
|
// TableBody: this is the part between parenthesis.
|
|
@@ -149,7 +162,8 @@ FKSyntax = _ constraint:("CONSTRAINT"i _ name)? _ foreign_key _
|
|
|
149
162
|
relation: "*",
|
|
150
163
|
},
|
|
151
164
|
{
|
|
152
|
-
tableName: table2,
|
|
165
|
+
tableName: table2.name,
|
|
166
|
+
schemaName: table2.schemaName,
|
|
153
167
|
fieldNames: fields2,
|
|
154
168
|
relation: "1",
|
|
155
169
|
}
|
|
@@ -295,16 +309,19 @@ CheckConstraintSyntax = _ ("CONSTRAINT"i name _)? "CHECK"i _ expression _ ("NOT"
|
|
|
295
309
|
// AlterSyntax: support "ALTER TABLE" syntax
|
|
296
310
|
// We will support ADD_COLUMN, ADD_FOREIGN_KEY, ADD_INDEX
|
|
297
311
|
// https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
|
|
298
|
-
AlterSyntax = alter_table _ table:
|
|
312
|
+
AlterSyntax = alter_table _ table:table_name _
|
|
299
313
|
options:(AddOptions/ChangeOptions/DropOptions) _
|
|
300
314
|
semicolon
|
|
301
315
|
{
|
|
302
316
|
const fks = _.flatten(options.filter(o => o.type === "add_fk").map(o => o.fks));
|
|
303
|
-
fks.forEach(fk => {
|
|
317
|
+
fks.forEach(fk => {
|
|
318
|
+
fk.endpoints[0].tableName = table.name;
|
|
319
|
+
fk.endpoints[0].schemaName = table.schemaName;
|
|
320
|
+
});
|
|
304
321
|
refs.push(...fks)
|
|
305
322
|
|
|
306
323
|
const pks = _.flatten(options.filter(o => o.type === "add_pk").map(o => o.pks));
|
|
307
|
-
const tableAlter =
|
|
324
|
+
const tableAlter = findTable(table.schemaName, table.name);
|
|
308
325
|
|
|
309
326
|
const index = {
|
|
310
327
|
columns: pks.map(field => ({
|
|
@@ -341,7 +358,7 @@ DropOptions = "DROP"i [^;]
|
|
|
341
358
|
|
|
342
359
|
// IndexSyntax: support "CREATE INDEX" syntax
|
|
343
360
|
IndexSyntax = constraint:create_index _ indexName:name _
|
|
344
|
-
"ON"i _ tableName:
|
|
361
|
+
"ON"i _ tableName:table_name _ indexType:index_type? _
|
|
345
362
|
columns: IndexColumn _
|
|
346
363
|
option:IndexOption? semicolon
|
|
347
364
|
{
|
|
@@ -358,7 +375,8 @@ IndexSyntax = constraint:create_index _ indexName:name _
|
|
|
358
375
|
if(type)
|
|
359
376
|
index.type = type;
|
|
360
377
|
|
|
361
|
-
const table =
|
|
378
|
+
const table = findTable(tableName.schemaName, tableName.name);
|
|
379
|
+
|
|
362
380
|
if(table.indexes) {
|
|
363
381
|
table.indexes.push(index);
|
|
364
382
|
} else {
|
|
@@ -400,6 +418,7 @@ IgnoreSyntax
|
|
|
400
418
|
/ BeginSyntax
|
|
401
419
|
/ CommitSyntax
|
|
402
420
|
/ RollbackSyntax
|
|
421
|
+
/ "ALTER"i _ (comment / !(semicolon) .)*
|
|
403
422
|
) semicolon newline?
|
|
404
423
|
|
|
405
424
|
// InsertSyntax: "INSERTO INTO" syntax
|
|
@@ -458,8 +477,24 @@ index_type "index type" = "USING"i _ type:("BTREE"i/"HASH"i) { return type.toUpp
|
|
|
458
477
|
name "valid name"
|
|
459
478
|
= c:(character)+ { return c.join("") }
|
|
460
479
|
/ quote c:[^`]+ quote { return c.join("") }
|
|
461
|
-
|
|
462
|
-
|
|
480
|
+
|
|
481
|
+
path_name = names:(name _ "." _)* {
|
|
482
|
+
let dbName = null;
|
|
483
|
+
let schemaName = null;
|
|
484
|
+
if (names && names.length > 0) {
|
|
485
|
+
if (names.length === 1) schemaName = names[0][0];
|
|
486
|
+
else {
|
|
487
|
+
dbName = names[0][0];
|
|
488
|
+
schemaName = names[1][0];
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return { dbName, schemaName }
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
table_name "valid table name" = pathName:path_name name:name {
|
|
495
|
+
return { ...pathName, name }
|
|
496
|
+
}
|
|
497
|
+
|
|
463
498
|
type "type" = c:type_name { return c }
|
|
464
499
|
/ c:name { return { type_name: c } }
|
|
465
500
|
type_name = type_name:name _ args:("(" _ expression _ ")")? {
|