diff --git a/forward_engineering/ddlProvider.js b/forward_engineering/ddlProvider.js index 5312c5af..0e5da97f 100644 --- a/forward_engineering/ddlProvider.js +++ b/forward_engineering/ddlProvider.js @@ -208,33 +208,42 @@ const ddlProvider = (baseProvider, options, app) => { }, convertColumnDefinition(columnDefinition) { + const { name, persisted, computed, computedExpression, dbVersion } = columnDefinition; + const type = hasType(columnDefinition.type) ? _.toUpper(columnDefinition.type) : getTableName(columnDefinition.type, columnDefinition.schemaName); + const notNull = columnDefinition.nullable ? '' : ' NOT NULL'; + const primaryKey = columnDefinition.primaryKey ? ' ' + createPKConstraint(templates, terminator, true)(columnDefinition.primaryKeyOptions).statement : ''; + const defaultValue = getDefaultValue(columnDefinition.defaultConstraint, type); + const sparse = columnDefinition.sparse ? ' SPARSE' : ''; + const maskedWithFunction = columnDefinition.maskedWithFunction ? ` MASKED WITH (FUNCTION='${columnDefinition.maskedWithFunction}')` : ''; + const identityContainer = columnDefinition.identity && { identity: getIdentity(columnDefinition.identity) }; + const encryptedWith = _.isEmpty(columnDefinition.encryption) ? '' - : getEncryptedWith(columnDefinition.encryption[0]); + : getEncryptedWith({ encryption: columnDefinition.encryption[0], dbVersion }); + const unique = columnDefinition.unique ? ' ' + createUKConstraint(templates, terminator, true)(columnDefinition.uniqueKeyOptions).statement : ''; + const temporalTableTime = getTempTableTime( columnDefinition.isTempTableStartTimeColumn, columnDefinition.isTempTableEndTimeColumn, columnDefinition.isHidden, ); - const { name, persisted, computed, computedExpression } = columnDefinition; - const statement = computed && computedExpression ? this.createComputedColumn({ @@ -529,6 +538,7 @@ const ddlProvider = (baseProvider, options, app) => { increment: Number(_.get(jsonSchema, 'identity.identityIncrement', 0)), }, }), + dbVersion: schemaData.dbVersion, }; }, @@ -557,7 +567,7 @@ const ddlProvider = (baseProvider, options, app) => { }; }, - hydrateSchema(containerData, { procedures } = {}) { + hydrateSchema(containerData, { procedures, modelData = [] } = {}) { return { schemaName: containerData.name, databaseName: containerData.databaseName, @@ -565,6 +575,7 @@ const ddlProvider = (baseProvider, options, app) => { comment: containerData.role?.description ?? containerData.description, isActivated: containerData.isActivated, procedures: hydrateProcedures(procedures), + dbVersion: modelData[0]?.dbVersion, }; }, diff --git a/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js index c51938e2..02dce7eb 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js @@ -11,6 +11,7 @@ const alterContainerHelper = (app, options) => { udfs: containerData.role?.UDFs, procedures: containerData.role?.Procedures, useDb: false, + modelData: [{ dbVersion: options.dbVersion }], }); return AlterScriptDto.getInstance([_.trim(ddlProvider.createSchema(schemaData))], true, false); diff --git a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js index da899931..bbbf9939 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js @@ -14,7 +14,7 @@ const alterEntityHelper = (app, options) => { const { getRenameColumnScriptsDto } = require('./columnHelpers/renameColumnHelpers')(ddlProvider); const { getDefaultValueChangeDto } = require('./columnHelpers/defaultValueColumnHelper')(ddlProvider); const { getChangedComputedColumnsScriptsDto } = require('./columnHelpers/alterComputedColumnHelper')(ddlProvider); - const { getChangeTypeScriptsDto } = require('./columnHelpers/alterTypeHelper')(ddlProvider); + const { getChangeTypeScriptsDto } = require('./columnHelpers/alterTypeHelper')(ddlProvider, options); const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper'); const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper'); const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/notNullConstraintsHelper'); @@ -28,7 +28,7 @@ const alterEntityHelper = (app, options) => { const getAddCollectionScriptDto = (collection, inlineDeltaRelationships) => { //done but need clean up const schemaName = collection.compMod.keyspaceName; - const schemaData = { schemaName }; + const schemaData = { schemaName, dbVersion: options.dbVersion }; const jsonSchema = { ...collection, ...collection?.role }; const tableName = getEntityName(jsonSchema); const idToNameHashTable = generateIdToNameHashTable(jsonSchema); @@ -116,7 +116,7 @@ const alterEntityHelper = (app, options) => { const getModifyCollectionScriptDto = collection => { const jsonSchema = { ...collection, ...collection?.role }; const schemaName = collection.compMod?.keyspaceName; - const schemaData = { schemaName }; + const schemaData = { schemaName, dbVersion: options.dbVersion }; const idToNameHashTable = generateIdToNameHashTable(jsonSchema); const idToActivatedHashTable = generateIdToActivatedHashTable(jsonSchema); const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(ddlProvider)(collection); @@ -160,7 +160,7 @@ const alterEntityHelper = (app, options) => { const tableName = collectionSchema?.code || collectionSchema?.collectionName || collectionSchema?.name; const schemaName = collectionSchema.compMod?.keyspaceName; const fullName = getTableName(tableName, schemaName); - const schemaData = { schemaName }; + const schemaData = { schemaName, dbVersion: options.dbVersion }; return _.toPairs(collection.properties) .filter(([name, jsonSchema]) => !jsonSchema.compMod) @@ -221,6 +221,7 @@ const alterEntityHelper = (app, options) => { collection, collectionSchema, schemaName, + options.dbVersion, ); const modifiedDefaultValues = getDefaultValueChangeDto(collection, fullName); const changedComputedScriptsDtos = getChangedComputedColumnsScriptsDto({ @@ -228,6 +229,7 @@ const alterEntityHelper = (app, options) => { fullName, collectionSchema, schemaName, + dbVersion: options.dbVersion, }); return [ diff --git a/forward_engineering/helpers/alterScriptHelpers/alterScriptBuilder.js b/forward_engineering/helpers/alterScriptHelpers/alterScriptBuilder.js index 7da24576..aeee06a8 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterScriptBuilder.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterScriptBuilder.js @@ -75,7 +75,7 @@ const parseDataForEntityLevelScript = data => { const getEntityLevelAlterScriptDtos = (data, app) => ({ jsonSchema }) => { - return getAlterScriptDtos(jsonSchema, app, data.options); + return getAlterScriptDtos(jsonSchema, app, { ...data.options, dbVersion: data.modelData[0]?.dbVersion }); }; /** diff --git a/forward_engineering/helpers/alterScriptHelpers/alterUdtHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterUdtHelper.js index d6de8344..7141b105 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterUdtHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterUdtHelper.js @@ -16,7 +16,7 @@ const alterUdtHelper = (app, options) => { const schemaNames = getSchemaNames(jsonSchema); return Object.keys(schemaNames).map(schemaName => { - const schemaData = { schemaName }; + const schemaData = { schemaName, dbVersion: options.dbVersion }; const udt = createColumnDefinitionBySchema({ name: jsonSchema.code || jsonSchema.name, diff --git a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js index 99c0d46e..2f74b683 100644 --- a/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js @@ -14,7 +14,7 @@ const alterViewHelper = (app, options) => { const viewSchema = { ...view, ...view.role }; const idToNameHashTable = generateRefToNameHashTable(viewSchema); const idToActivatedHashTable = generateRefToActivatedHashTable(viewSchema); - const schemaData = { schemaName: viewSchema.compMod.keyspaceName }; + const schemaData = { schemaName: viewSchema.compMod.keyspaceName, dbVersion: options.dbVersion }; const viewData = { name: viewSchema.code || viewSchema.name, @@ -45,7 +45,7 @@ const alterViewHelper = (app, options) => { const viewSchema = { ...view, ...view.role }; const idToNameHashTable = generateIdToNameHashTable(viewSchema); const idToActivatedHashTable = generateIdToActivatedHashTable(viewSchema); - const schemaData = { schemaName: viewSchema.compMod.keyspaceName }; + const schemaData = { schemaName: viewSchema.compMod.keyspaceName, dbVersion: options.dbVersion }; const viewData = { name: viewSchema.code || viewSchema.name, keys: getKeys(viewSchema, viewSchema.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}), diff --git a/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterComputedColumnHelper.js b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterComputedColumnHelper.js index 9c13eb67..44a83fa1 100644 --- a/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterComputedColumnHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterComputedColumnHelper.js @@ -33,8 +33,9 @@ const alterComputedColumnHelper = ddlProvider => { schemaName, toAddNotNull, toRemoveNotNull, + dbVersion, }) => { - const schemaData = { schemaName }; + const schemaData = { schemaName, dbVersion }; const columnDefinition = createColumnDefinitionBySchema({ name: columnName, jsonSchema, @@ -65,7 +66,7 @@ const alterComputedColumnHelper = ddlProvider => { return sqlScripts; }; - const getChangedComputedColumnsScriptsDto = ({ collection, fullName, collectionSchema, schemaName }) => { + const getChangedComputedColumnsScriptsDto = ({ collection, fullName, collectionSchema, schemaName, dbVersion }) => { return _.toPairs(collection.properties) .reduce((result, [columnName, jsonSchema]) => { const oldJsonSchema = _.omit(collection.role?.properties?.[columnName], ['compMod']); @@ -90,6 +91,7 @@ const alterComputedColumnHelper = ddlProvider => { schemaName, toAddNotNull, toRemoveNotNull, + dbVersion, }), ); diff --git a/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterTypeHelper.js b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterTypeHelper.js index 3130ecf5..7c0b6dad 100644 --- a/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterTypeHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterTypeHelper.js @@ -3,9 +3,9 @@ const { AlterScriptDto } = require('../types/AlterScriptDto'); const { checkFieldPropertiesChanged } = require('../common'); const { createColumnDefinitionBySchema } = require('./createColumnDefinition'); -const alterTypeHelper = ddlProvider => { +const alterTypeHelper = (ddlProvider, options) => { const getChangeTypeScriptsDto = (collectionProperties, fullName, collectionSchema, schemaName) => { - const schemaData = { schemaName }; + const schemaData = { schemaName, dbVersion: options.dbVersion }; return _.toPairs(collectionProperties) .filter(([name, jsonSchema]) => checkFieldPropertiesChanged(jsonSchema.compMod, ['type', 'mode'])) diff --git a/forward_engineering/helpers/alterScriptHelpers/columnHelpers/notNullConstraintsHelper.js b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/notNullConstraintsHelper.js index a56491ed..910589af 100644 --- a/forward_engineering/helpers/alterScriptHelpers/columnHelpers/notNullConstraintsHelper.js +++ b/forward_engineering/helpers/alterScriptHelpers/columnHelpers/notNullConstraintsHelper.js @@ -6,9 +6,9 @@ const { createColumnDefinitionBySchema } = require('./createColumnDefinition'); /** * @return {(collection: Collection) => AlterScriptDto[]} * */ -const getModifyNonNullColumnsScriptDtos = ddlProvider => (collection, collectionSchema, schemaName) => { +const getModifyNonNullColumnsScriptDtos = ddlProvider => (collection, collectionSchema, schemaName, dbVersion) => { const fullTableName = getFullTableName(collection); - const schemaData = { schemaName }; + const schemaData = { schemaName, dbVersion }; const currentRequiredColumnNames = collection.required || []; const previousRequiredColumnNames = collection.role.required || []; diff --git a/forward_engineering/helpers/columnDefinitionHelper.js b/forward_engineering/helpers/columnDefinitionHelper.js index f6fb13ad..56fde45a 100644 --- a/forward_engineering/helpers/columnDefinitionHelper.js +++ b/forward_engineering/helpers/columnDefinitionHelper.js @@ -96,20 +96,33 @@ const addClustered = (statement, columnDefinition) => { return statement + ' CLUSTERED'; }; -const getEncryptedWith = encryption => { - return ( - ' ENCRYPTED WITH (\n' + - '\t\tCOLUMN_ENCRYPTION_KEY=' + - encryption.key + - ',\n' + - '\t\tENCRYPTION_TYPE=' + - encryption.type + - ',\n' + - "\t\tALGORITHM='" + - encryption.algorithm + - "'\n" + - '\t)' - ); +const getEncryptedWith = ({ encryption, dbVersion }) => { + const { key, type, algorithm } = encryption; + + if (!key || !type) { + return ''; + } + + // must be in sync with ENCRYPTION_ALGORITHM dependency of fieldLevelConfig + const noAlgorithmDbVersions = ['2008', '2012', '2014']; + const hasAlgorithm = !noAlgorithmDbVersions.includes(dbVersion); + + if (hasAlgorithm && !algorithm) { + return ''; + } + + const blockIndentation = '\n\t\t'; + + let script = ` ENCRYPTED WITH (`; + + script += `${blockIndentation}COLUMN_ENCRYPTION_KEY=${key}`; + script += `,${blockIndentation}ENCRYPTION_TYPE=${type}`; + + if (hasAlgorithm) { + script += `,${blockIndentation}ALGORITHM='${algorithm}'`; + } + + return `${script}\n\t)`; }; const getColumnsComments = (tableName, terminator, columnDefinitions) => { diff --git a/properties_pane/field_level/fieldLevelConfig.json b/properties_pane/field_level/fieldLevelConfig.json index 8de24cfa..0277a3d4 100644 --- a/properties_pane/field_level/fieldLevelConfig.json +++ b/properties_pane/field_level/fieldLevelConfig.json @@ -417,7 +417,8 @@ making sure that you maintain a proper JSON format. { "propertyName": "Key name", "propertyKeyword": "COLUMN_ENCRYPTION_KEY", - "propertyType": "text" + "propertyType": "text", + "requiredProperty": "true" }, { "propertyName": "Type", @@ -425,12 +426,39 @@ making sure that you maintain a proper JSON format. "propertyType": "select", "options": ["DETERMINISTIC", "RANDOMIZED"], "data": "options", - "valueType": "string" + "valueType": "string", + "requiredProperty": "true" }, { "propertyName": "Algorithm", "propertyKeyword": "ENCRYPTION_ALGORITHM", - "propertyType": "text" + "propertyType": "text", + "requiredProperty": "true", + "defaultValue": "AEAD_AES_256_CBC_HMAC_SHA_256", + "cleanDependency": true, + "dependency": { + "type": "not", + "values": { + "type": "or", + "values": [ + { + "level": "model", + "key": "dbVersion", + "value": "2008" + }, + { + "level": "model", + "key": "dbVersion", + "value": "2012" + }, + { + "level": "model", + "key": "dbVersion", + "value": "2014" + } + ] + } + } } ] },