11const reApi = require ( '../reverse_engineering/api' ) ;
22const { createLogger } = require ( '../reverse_engineering/helpers/loggerHelper' ) ;
33const applyToInstanceHelper = require ( './applyToInstanceHelper' ) ;
4+ const { commentDropStatements } = require ( './helpers/commentDropStatements' ) ;
5+ const { DROP_STATEMENTS } = require ( './helpers/constants' ) ;
46
57module . 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} ;
0 commit comments