@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.
Files changed (40) hide show
  1. package/lib/export/DbmlExporter.js +11 -6
  2. package/lib/export/MysqlExporter.js +127 -48
  3. package/lib/export/PostgresExporter.js +142 -55
  4. package/lib/export/SqlServerExporter.js +130 -52
  5. package/lib/export/utils.js +40 -0
  6. package/lib/model_structure/database.js +53 -12
  7. package/lib/model_structure/endpoint.js +2 -2
  8. package/lib/model_structure/field.js +31 -1
  9. package/lib/model_structure/ref.js +1 -2
  10. package/lib/model_structure/schema.js +3 -19
  11. package/lib/model_structure/tableGroup.js +1 -1
  12. package/lib/model_structure/utils.js +5 -0
  13. package/lib/parse/dbml/parser.pegjs +74 -24
  14. package/lib/parse/dbmlParser.js +1275 -886
  15. package/lib/parse/mssql/fk_definition/actions.js +10 -3
  16. package/lib/parse/mssql/keyword_parsers.js +12 -1
  17. package/lib/parse/mssql/statements/actions.js +37 -6
  18. package/lib/parse/mssql/statements/index.js +1 -1
  19. package/lib/parse/mssql/statements/statement_types/alter_table/actions.js +11 -5
  20. package/lib/parse/mssql/statements/statement_types/comments/actions.js +57 -0
  21. package/lib/parse/mssql/statements/statement_types/comments/index.js +97 -0
  22. package/lib/parse/mssql/statements/statement_types/create_index/actions.js +6 -1
  23. package/lib/parse/mssql/statements/statement_types/create_table/actions.js +11 -9
  24. package/lib/parse/mssql/statements/statement_types/index.js +4 -1
  25. package/lib/parse/mssql/utils.js +15 -0
  26. package/lib/parse/mysql/parser.pegjs +55 -20
  27. package/lib/parse/mysqlParser.js +479 -308
  28. package/lib/parse/postgresParser.js +15 -14
  29. package/lib/parse/postgresql/Base_rules.pegjs +24 -3
  30. package/lib/parse/postgresql/Commands/Alter_table/Alter_table.pegjs +49 -4
  31. package/lib/parse/postgresql/Commands/Comment.pegjs +18 -6
  32. package/lib/parse/postgresql/Commands/Create_table/Create_table_normal.pegjs +5 -3
  33. package/lib/parse/postgresql/Commands/Create_table/Create_table_of.pegjs +1 -1
  34. package/lib/parse/postgresql/Commands/Create_table/Create_table_partition_of.pegjs +1 -1
  35. package/lib/parse/postgresql/Commands/Create_type/Create_type_enum.pegjs +2 -2
  36. package/lib/parse/postgresql/Commands/Ignore_syntax.pegjs +10 -1
  37. package/lib/parse/postgresql/InitializerUtils.pegjs +14 -2
  38. package/lib/parse/postgresql/Keywords.pegjs +5 -1
  39. package/lib/parse/postgresql/parser.pegjs +22 -8
  40. 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[tableName.length - 1],
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
- value.endpoint = makeEndPoint(tableName, columnName, '1');
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 = _.last(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
- return ast.tables.find(function (_table) {
7
- return _table.name === tableName;
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 = _.last(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 = _.last(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; // eslint-disable-next-line consistent-return
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(tableName, result);
29
+ handleRef(fullName, result);
24
30
  break;
25
31
 
26
32
  case 'indexes':
27
33
  case 'dbdefault':
28
34
  case 'enums':
29
- addTableName(tableName, result);
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: tableName[tableName.length - 1],
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 linesValue = getLinesValue(lines, _.last(tableName));
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
  };
@@ -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)? __ name:table_name _
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: `${name}_${field.name}_enum`,
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
- // return statement
77
- return indexes ?
78
- {name, fields, indexes}
79
- : {name, fields}
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:name _
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 => {fk.endpoints[0].tableName = table});
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 = tables.find((t) => t.name === table);
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:name _ indexType:index_type? _
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 = tables.find(table => table.name === tableName);
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
- table_name "valid table name"
462
- = (name _ "." _)* name:name { return name }
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 _ ")")? {