Skip to content

Commit a2ceb91

Browse files
committed
FE: added support of <applyDropStatements> option
1 parent 69107d6 commit a2ceb91

File tree

4 files changed

+102
-24
lines changed

4 files changed

+102
-24
lines changed

forward_engineering/api.js

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,61 @@
11
const reApi = require('../reverse_engineering/api');
22
const { createLogger } = require('../reverse_engineering/helpers/loggerHelper');
33
const applyToInstanceHelper = require('./applyToInstanceHelper');
4+
const { commentDropStatements } = require('./helpers/commentDropStatements');
5+
const { DROP_STATEMENTS } = require('./helpers/constants');
46

57
module.exports = {
68
generateScript(data, logger, callback, app) {
7-
const {
8-
getAlterContainersScripts,
9-
getAlterCollectionsScripts,
10-
getAlterViewScripts,
11-
getAlterModelDefinitionsScripts,
12-
} = require('./helpers/alterScriptFromDeltaHelper');
13-
14-
const collection = JSON.parse(data.jsonSchema);
15-
if (!collection) {
16-
throw new Error(
17-
'"comparisonModelCollection" is not found. Alter script can be generated only from Delta model',
9+
try {
10+
const {
11+
getAlterContainersScripts,
12+
getAlterCollectionsScripts,
13+
getAlterViewScripts,
14+
getAlterModelDefinitionsScripts,
15+
} = require('./helpers/alterScriptFromDeltaHelper');
16+
17+
const collection = JSON.parse(data.jsonSchema);
18+
if (!collection) {
19+
throw new Error(
20+
'"comparisonModelCollection" is not found. Alter script can be generated only from Delta model',
21+
);
22+
}
23+
24+
const dbVersion = data.modelData[0]?.dbVersion;
25+
const containersScripts = getAlterContainersScripts(collection);
26+
const collectionsScripts = getAlterCollectionsScripts(collection, app, dbVersion);
27+
const viewScripts = getAlterViewScripts(collection, app);
28+
const modelDefinitionsScripts = getAlterModelDefinitionsScripts(collection, app);
29+
const script = [
30+
...containersScripts,
31+
...collectionsScripts,
32+
...viewScripts,
33+
...modelDefinitionsScripts,
34+
].join('\n\n');
35+
36+
const applyDropStatements = data.options?.additionalOptions?.some(
37+
option => option.id === 'applyDropStatements' && option.value,
1838
);
19-
}
2039

21-
const dbVersion = data.modelData[0]?.dbVersion;
22-
const containersScripts = getAlterContainersScripts(collection);
23-
const collectionsScripts = getAlterCollectionsScripts(collection, app, dbVersion);
24-
const viewScripts = getAlterViewScripts(collection, app);
25-
const modelDefinitionsScripts = getAlterModelDefinitionsScripts(collection, app);
40+
callback(null, applyDropStatements ? script : commentDropStatements(script));
41+
} catch (error) {
42+
logger.log('error', { message: error.message, stack: error.stack }, 'PostgreSQL Forward-Engineering Error');
2643

27-
callback(
28-
null,
29-
[...containersScripts, ...collectionsScripts, ...viewScripts, ...modelDefinitionsScripts].join('\n\n'),
30-
);
44+
callback({ message: error.message, stack: error.stack });
45+
}
3146
},
3247
generateViewScript(data, logger, callback, app) {
3348
callback(new Error('Forward-Engineering of delta model on view level is not supported'));
3449
},
3550
generateContainerScript(data, logger, callback, app) {
36-
callback(new Error('Forward-Engineering of delta model on container level is not supported'));
51+
try {
52+
data.jsonSchema = data.collections[0];
53+
this.generateScript(data, logger, callback, app);
54+
} catch (error) {
55+
logger.log('error', { message: error.message, stack: error.stack }, 'PostgreSQL Forward-Engineering Error');
56+
57+
callback({ message: error.message, stack: error.stack });
58+
}
3759
},
3860
getDatabases(connectionInfo, logger, callback, app) {
3961
logger.progress({ message: 'Find all databases' });
@@ -60,4 +82,21 @@ module.exports = {
6082
testConnection(connectionInfo, logger, callback, app) {
6183
reApi.testConnection(connectionInfo, logger, callback, app).then(callback, callback);
6284
},
85+
isDropInStatements(data, logger, callback, app) {
86+
try {
87+
const cb = (error, script = '') =>
88+
callback(
89+
error,
90+
DROP_STATEMENTS.some(statement => script.includes(statement)),
91+
);
92+
93+
if (data.level === 'container') {
94+
this.generateContainerScript(data, logger, cb, app);
95+
} else {
96+
this.generateScript(data, logger, cb, app);
97+
}
98+
} catch (e) {
99+
callback({ message: e.message, stack: e.stack });
100+
}
101+
},
63102
};

forward_engineering/config.json

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@
2626
},
2727
"compMode": {
2828
"entity": true,
29-
"container": false
30-
}
29+
"container": true
30+
},
31+
"additionalOptions": [
32+
{
33+
"id": "applyDropStatements",
34+
"value": false,
35+
"forUpdate": true,
36+
"name": "Apply Drop Statements",
37+
"isDropInStatements": true
38+
}
39+
]
3140
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const { DROP_STATEMENTS } = require('./constants');
2+
3+
const commentDropStatements = (script = '') =>
4+
script
5+
.split('\n')
6+
.map(line => {
7+
if (DROP_STATEMENTS.some(statement => line.includes(statement))) {
8+
return `-- ${line}`;
9+
} else {
10+
return line;
11+
}
12+
})
13+
.join('\n');
14+
15+
module.exports = {
16+
commentDropStatements,
17+
};
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const DROP_STATEMENTS = [
2+
'DROP SCHEMA',
3+
'DROP TABLE',
4+
'DROP COLUMN',
5+
'DROP DOMAIN',
6+
'DROP TYPE',
7+
'DROP ATTRIBUTE',
8+
'DROP VIEW',
9+
];
10+
11+
module.exports = {
12+
DROP_STATEMENTS,
13+
};

0 commit comments

Comments
 (0)