@dbml/core 2.2.0 → 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 +15 -4
- package/lib/export/JsonExporter.js +1 -3
- package/lib/export/ModelExporter.js +1 -3
- package/lib/export/MysqlExporter.js +50 -42
- package/lib/export/PostgresExporter.js +64 -49
- package/lib/export/SqlServerExporter.js +52 -46
- package/lib/model_structure/database.js +73 -28
- package/lib/model_structure/dbState.js +1 -3
- package/lib/model_structure/element.js +13 -13
- package/lib/model_structure/endpoint.js +18 -14
- package/lib/model_structure/enum.js +18 -14
- package/lib/model_structure/enumValue.js +16 -12
- package/lib/model_structure/field.js +47 -13
- package/lib/model_structure/indexColumn.js +16 -12
- package/lib/model_structure/indexes.js +18 -14
- package/lib/model_structure/ref.js +19 -16
- package/lib/model_structure/schema.js +24 -36
- package/lib/model_structure/table.js +19 -15
- package/lib/model_structure/tableGroup.js +18 -14
- package/lib/model_structure/utils.js +5 -0
- package/lib/parse/Parser.js +2 -4
- package/lib/parse/buildParser.js +1 -3
- package/lib/parse/dbml/parser.pegjs +64 -20
- package/lib/parse/dbmlParser.js +1401 -899
- package/lib/parse/mssql/constraint_definition/actions.js +2 -2
- package/lib/parse/mssql/fk_definition/actions.js +10 -3
- package/lib/parse/mssql/keyword_parsers.js +0 -1
- 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 +12 -10
- package/lib/parse/mssql/utils.js +16 -1
- package/lib/parse/mysql/parser.pegjs +57 -34
- package/lib/parse/mysqlParser.js +270 -218
- package/lib/parse/postgresParser.js +12 -10
- package/lib/parse/postgresql/Base_rules.pegjs +45 -10
- 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/lib/parse/schemarbParser.js +3 -3
- package/package.json +5 -3
- package/types/export/ModelExporter.d.ts +5 -0
- package/types/export/index.d.ts +5 -0
- package/types/import/index.d.ts +5 -0
- package/types/index.d.ts +5 -0
- package/types/model_structure/database.d.ts +195 -0
- package/types/model_structure/dbState.d.ts +14 -0
- package/types/model_structure/element.d.ts +21 -0
- package/types/model_structure/endpoint.d.ts +55 -0
- package/types/model_structure/enum.d.ts +67 -0
- package/types/model_structure/enumValue.d.ts +39 -0
- package/types/model_structure/field.d.ts +77 -0
- package/types/model_structure/indexColumn.d.ts +37 -0
- package/types/model_structure/indexes.d.ts +74 -0
- package/types/model_structure/ref.d.ts +66 -0
- package/types/model_structure/schema.d.ts +188 -0
- package/types/model_structure/table.d.ts +118 -0
- package/types/model_structure/tableGroup.d.ts +54 -0
- package/types/parse/Parser.d.ts +11 -0
- package/lib/export/Exporter.js +0 -80
- package/lib/export/SchemaExporter.js +0 -99
- package/lib/parse/dbml/multiline_content.txt +0 -7
- package/lib/parse/dbml/multiline_string.pegjs +0 -17
- package/lib/parse/dbml/parser1.json +0 -219
- package/lib/parse/dbml/parser1.pegjs +0 -702
- package/lib/parse/dbml/parser1_content.txt +0 -29
- package/lib/parse/dbml/test_multiline.js +0 -53
- package/lib/parse/dbml/test_parser1.js +0 -16
- package/lib/parse/mssql/base_utils.js +0 -28
- package/lib/parse/mssql/composite_parsers.js +0 -109
- package/lib/parse/mssql/statement_types/alter_table/actions.js +0 -29
- package/lib/parse/mssql/statement_types/alter_table/add/actions.js +0 -8
- package/lib/parse/mssql/statement_types/alter_table/add/index.js +0 -58
- package/lib/parse/mssql/statement_types/alter_table/index.js +0 -32
- package/lib/parse/mssql/statement_types/create_index/actions.js +0 -25
- package/lib/parse/mssql/statement_types/create_index/index.js +0 -50
- package/lib/parse/mssql/statement_types/create_table/actions.js +0 -95
- package/lib/parse/mssql/statement_types/create_table/index.js +0 -50
- package/lib/parse/mssql/statement_types/index.js +0 -13
- package/lib/schema/element.js +0 -84
- package/lib/schema/endpoint.js +0 -102
- package/lib/schema/enum.js +0 -102
- package/lib/schema/enumValue.js +0 -70
- package/lib/schema/field.js +0 -104
- package/lib/schema/indexes.js +0 -74
- package/lib/schema/ref.js +0 -93
- package/lib/schema/schema.js +0 -245
- package/lib/schema/table.js +0 -163
- package/lib/schema/tableGroup.js +0 -93
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
4
4
|
|
|
5
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
5
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
6
6
|
|
|
7
7
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
8
8
|
|
|
@@ -55,7 +55,7 @@ function makeTableConstraint(constraintName, option) {
|
|
|
55
55
|
if (!option) return null;
|
|
56
56
|
return {
|
|
57
57
|
type: option.type,
|
|
58
|
-
value: _objectSpread({}, option.value, {
|
|
58
|
+
value: _objectSpread(_objectSpread({}, option.value), {}, {
|
|
59
59
|
name: option.type === 'indexes' && option.value.pk ? null : constraintName
|
|
60
60
|
})
|
|
61
61
|
};
|
|
@@ -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 {
|
|
@@ -72,7 +72,6 @@ exports.KeywordNoCheck = keyword(/NOCHECK/i);
|
|
|
72
72
|
exports.KeywordDrop = keyword(/DROP/i);
|
|
73
73
|
exports.KeywordAlterColumn = keyword(/ALTER COLUMN/i);
|
|
74
74
|
exports.KeywordGo = keyword(/GO/i);
|
|
75
|
-
exports.KeywordDrop = keyword(/DROP/i);
|
|
76
75
|
exports.KeywordBulkInsert = keyword(/BULK INSERT/i);
|
|
77
76
|
exports.KeywordInsert = keyword(/INSERT/i);
|
|
78
77
|
exports.KeywordUpdate = keyword(/UPDATE/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;
|
|
@@ -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
|
};
|
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
4
4
|
|
|
5
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
5
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
6
6
|
|
|
7
7
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
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({
|
|
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
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
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,31 +44,16 @@ 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;
|
|
44
53
|
const indexes = body.indexes;
|
|
45
|
-
|
|
54
|
+
const bodyRefs = body.refs;
|
|
55
|
+
|
|
46
56
|
fields.forEach((field)=>{
|
|
47
|
-
(field.inline_ref || []).forEach(ref => {
|
|
48
|
-
const endpoints = [
|
|
49
|
-
{
|
|
50
|
-
tableName: name,
|
|
51
|
-
fieldNames: [field.name],
|
|
52
|
-
relation: "*", //set by default
|
|
53
|
-
},
|
|
54
|
-
ref.endpoint,
|
|
55
|
-
]
|
|
56
|
-
refs.push({
|
|
57
|
-
endpoints,
|
|
58
|
-
onUpdate: ref.onUpdate,
|
|
59
|
-
onDelete: ref.onDelete,
|
|
60
|
-
});
|
|
61
|
-
})
|
|
62
|
-
|
|
63
57
|
// process enum: rename enum and push to array `enums`
|
|
64
58
|
if (field.type.type_name.toLowerCase() === 'enum') {
|
|
65
59
|
let enumValuesArr = field.type.args.split(/[\s\r\n\n]*,[\s\r\n\n]*/);
|
|
@@ -74,18 +68,26 @@ TableSyntax
|
|
|
74
68
|
});
|
|
75
69
|
|
|
76
70
|
const _enum = {
|
|
77
|
-
name: `${
|
|
71
|
+
name: `${table_name.schemaName
|
|
72
|
+
? `${table_name.schemaName}_` : ''}${table_name.name}_${field.name}_enum`,
|
|
78
73
|
values
|
|
79
74
|
};
|
|
80
75
|
enums.push(_enum);
|
|
81
76
|
field.type.type_name = _enum.name;
|
|
82
77
|
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
bodyRefs.forEach(ref => {
|
|
81
|
+
ref.endpoints[0].tableName = table_name.name;
|
|
82
|
+
ref.endpoints[0].schemaName = table_name.schemaName;
|
|
83
|
+
ref.endpoints[0].relation = '*';
|
|
84
|
+
refs.push(ref);
|
|
85
|
+
});
|
|
83
86
|
|
|
84
|
-
})
|
|
85
87
|
// return statement
|
|
86
88
|
return indexes ?
|
|
87
|
-
{
|
|
88
|
-
: {
|
|
89
|
+
{...table_name, fields, indexes}
|
|
90
|
+
: {...table_name, fields}
|
|
89
91
|
}
|
|
90
92
|
|
|
91
93
|
// TableBody: this is the part between parenthesis.
|
|
@@ -124,9 +126,9 @@ TableBody = _ lines:Line* _ {
|
|
|
124
126
|
onUpdate: key.onUpdate,
|
|
125
127
|
onDelete: key.onDelete,
|
|
126
128
|
});
|
|
127
|
-
})
|
|
129
|
+
});
|
|
128
130
|
|
|
129
|
-
return {fields, indexes}
|
|
131
|
+
return {fields, indexes, refs: fks}
|
|
130
132
|
}
|
|
131
133
|
|
|
132
134
|
// Line: is create_definition in MySQL documents.
|
|
@@ -158,7 +160,8 @@ FKSyntax = _ constraint:("CONSTRAINT"i _ name)? _ foreign_key _
|
|
|
158
160
|
relation: "*",
|
|
159
161
|
},
|
|
160
162
|
{
|
|
161
|
-
tableName: table2,
|
|
163
|
+
tableName: table2.name,
|
|
164
|
+
schemaName: table2.schemaName,
|
|
162
165
|
fieldNames: fields2,
|
|
163
166
|
relation: "1",
|
|
164
167
|
}
|
|
@@ -184,7 +187,7 @@ UniqueSyntax
|
|
|
184
187
|
// IndexInLineSyntax: Support "[UNIQUE] (INDEX/KEY) `indexName`(`field` (ASC/DESC)?)"
|
|
185
188
|
// "KEY is normally a synonym for INDEX".
|
|
186
189
|
IndexInLineSyntax = _ unique:index_in_line
|
|
187
|
-
_ name:name? _ type1:index_type?
|
|
190
|
+
_ name:name? _ type1:index_type? _
|
|
188
191
|
"(" _ columns:IndexColumnValues _")" IndexOption? type2:index_type?
|
|
189
192
|
{
|
|
190
193
|
const index = { columns };
|
|
@@ -304,16 +307,19 @@ CheckConstraintSyntax = _ ("CONSTRAINT"i name _)? "CHECK"i _ expression _ ("NOT"
|
|
|
304
307
|
// AlterSyntax: support "ALTER TABLE" syntax
|
|
305
308
|
// We will support ADD_COLUMN, ADD_FOREIGN_KEY, ADD_INDEX
|
|
306
309
|
// https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
|
|
307
|
-
AlterSyntax = alter_table _ table:
|
|
310
|
+
AlterSyntax = alter_table _ table:table_name _
|
|
308
311
|
options:(AddOptions/ChangeOptions/DropOptions) _
|
|
309
312
|
semicolon
|
|
310
313
|
{
|
|
311
314
|
const fks = _.flatten(options.filter(o => o.type === "add_fk").map(o => o.fks));
|
|
312
|
-
fks.forEach(fk => {
|
|
315
|
+
fks.forEach(fk => {
|
|
316
|
+
fk.endpoints[0].tableName = table.name;
|
|
317
|
+
fk.endpoints[0].schemaName = table.schemaName;
|
|
318
|
+
});
|
|
313
319
|
refs.push(...fks)
|
|
314
320
|
|
|
315
321
|
const pks = _.flatten(options.filter(o => o.type === "add_pk").map(o => o.pks));
|
|
316
|
-
const tableAlter =
|
|
322
|
+
const tableAlter = findTable(table.schemaName, table.name);
|
|
317
323
|
|
|
318
324
|
const index = {
|
|
319
325
|
columns: pks.map(field => ({
|
|
@@ -350,7 +356,7 @@ DropOptions = "DROP"i [^;]
|
|
|
350
356
|
|
|
351
357
|
// IndexSyntax: support "CREATE INDEX" syntax
|
|
352
358
|
IndexSyntax = constraint:create_index _ indexName:name _
|
|
353
|
-
"ON"i _ tableName:
|
|
359
|
+
"ON"i _ tableName:table_name _ indexType:index_type? _
|
|
354
360
|
columns: IndexColumn _
|
|
355
361
|
option:IndexOption? semicolon
|
|
356
362
|
{
|
|
@@ -367,7 +373,8 @@ IndexSyntax = constraint:create_index _ indexName:name _
|
|
|
367
373
|
if(type)
|
|
368
374
|
index.type = type;
|
|
369
375
|
|
|
370
|
-
const table =
|
|
376
|
+
const table = findTable(tableName.schemaName, tableName.name);
|
|
377
|
+
|
|
371
378
|
if(table.indexes) {
|
|
372
379
|
table.indexes.push(index);
|
|
373
380
|
} else {
|
|
@@ -467,8 +474,24 @@ index_type "index type" = "USING"i _ type:("BTREE"i/"HASH"i) { return type.toUpp
|
|
|
467
474
|
name "valid name"
|
|
468
475
|
= c:(character)+ { return c.join("") }
|
|
469
476
|
/ quote c:[^`]+ quote { return c.join("") }
|
|
470
|
-
|
|
471
|
-
|
|
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
|
+
|
|
472
495
|
type "type" = c:type_name { return c }
|
|
473
496
|
/ c:name { return { type_name: c } }
|
|
474
497
|
type_name = type_name:name _ args:("(" _ expression _ ")")? {
|