This commit is contained in:
SPRINX0\prochazka
2024-10-30 09:22:45 +01:00
5 changed files with 58 additions and 5 deletions

View File

@@ -10,7 +10,6 @@ const connectUtility = require('dbgate-api/src/utility/connectUtility');
function checkStructure(structure, model, { checkRenameDeletedObjects = false, disallowExtraObjects = false }) { function checkStructure(structure, model, { checkRenameDeletedObjects = false, disallowExtraObjects = false }) {
const expected = databaseInfoFromYamlModel(model); const expected = databaseInfoFromYamlModel(model);
expect(structure.tables.length).toEqual(expected.tables.length);
for (const expectedTable of expected.tables) { for (const expectedTable of expected.tables) {
const realTable = structure.tables.find(x => x.pureName == expectedTable.pureName); const realTable = structure.tables.find(x => x.pureName == expectedTable.pureName);
@@ -50,8 +49,13 @@ function checkStructure(structure, model, { checkRenameDeletedObjects = false, d
} }
async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) { async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) {
const { testEmptyLastScript, checkDeletedObjects, finalCheckAgainstModel, finalCheckAgainstFirstModel } = const {
options || {}; testEmptyLastScript,
checkDeletedObjects,
finalCheckAgainstModel,
finalCheckAgainstFirstModel,
dbdiffOptionsExtra,
} = options || {};
let index = 0; let index = 0;
for (const loadedDbModel of dbModelsYaml) { for (const loadedDbModel of dbModelsYaml) {
const { sql, isEmpty } = await generateDeploySql({ const { sql, isEmpty } = await generateDeploySql({
@@ -59,6 +63,7 @@ async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) {
connection: conn.isPreparedOnly ? conn : undefined, connection: conn.isPreparedOnly ? conn : undefined,
driver, driver,
loadedDbModel, loadedDbModel,
dbdiffOptionsExtra,
}); });
console.debug('Generated deploy script:', sql); console.debug('Generated deploy script:', sql);
expect(sql.toUpperCase().includes('DROP ')).toBeFalsy(); expect(sql.toUpperCase().includes('DROP ')).toBeFalsy();
@@ -73,6 +78,7 @@ async function testDatabaseDeploy(conn, driver, dbModelsYaml, options) {
connection: conn.isPreparedOnly ? conn : undefined, connection: conn.isPreparedOnly ? conn : undefined,
driver, driver,
loadedDbModel, loadedDbModel,
dbdiffOptionsExtra,
}); });
index++; index++;
@@ -447,4 +453,36 @@ describe('Deploy database', () => {
); );
}) })
); );
test.each(engines.map(engine => [engine.label, engine]))(
'Mark table removed - %s',
testWrapper(async (conn, driver, engine) => {
await testDatabaseDeploy(
conn,
driver,
[
[
{
name: 't1.table.yaml',
json: {
name: 't1',
columns: [
{ name: 'id', type: 'int' },
{ name: 'val', type: 'int' },
],
primaryKey: ['id'],
},
},
],
[],
],
{
checkRenameDeletedObjects: true,
dbdiffOptionsExtra: {
allowTableMarkDropped: true,
},
}
);
})
);
}); });

View File

@@ -9,6 +9,7 @@ async function deployDb({
modelFolder, modelFolder,
loadedDbModel, loadedDbModel,
modelTransforms, modelTransforms,
dbdiffOptionsExtra,
}) { }) {
const { sql } = await generateDeploySql({ const { sql } = await generateDeploySql({
connection, connection,
@@ -18,6 +19,7 @@ async function deployDb({
modelFolder, modelFolder,
loadedDbModel, loadedDbModel,
modelTransforms, modelTransforms,
dbdiffOptionsExtra,
}); });
// console.log('RUNNING DEPLOY SCRIPT:', sql); // console.log('RUNNING DEPLOY SCRIPT:', sql);
await executeQuery({ connection, systemConnection, driver, sql, logScriptItems: true }); await executeQuery({ connection, systemConnection, driver, sql, logScriptItems: true });

View File

@@ -19,6 +19,7 @@ async function generateDeploySql({
modelFolder = undefined, modelFolder = undefined,
loadedDbModel = undefined, loadedDbModel = undefined,
modelTransforms = undefined, modelTransforms = undefined,
dbdiffOptionsExtra = {},
}) { }) {
if (!driver) driver = requireEngineDriver(connection); if (!driver) driver = requireEngineDriver(connection);
@@ -48,6 +49,8 @@ async function generateDeploySql({
noDropSqlObject: true, noDropSqlObject: true,
noRenameTable: true, noRenameTable: true,
noRenameColumn: true, noRenameColumn: true,
...dbdiffOptionsExtra,
}; };
const currentModelPaired = matchPairedObjects(deployedModel, currentModel, opts); const currentModelPaired = matchPairedObjects(deployedModel, currentModel, opts);
const currentModelPairedPreloaded = await enrichWithPreloadedRows(deployedModel, currentModelPaired, dbhan, driver); const currentModelPairedPreloaded = await enrichWithPreloadedRows(deployedModel, currentModelPaired, dbhan, driver);

View File

@@ -441,7 +441,7 @@ export class AlterPlan {
// console.log('*****************RECREATED NEEDED', op, operationType, isAllowed); // console.log('*****************RECREATED NEEDED', op, operationType, isAllowed);
// console.log(this.dialect); // console.log(this.dialect);
if (this.opts.noDropTable) { if (this.opts.noDropTable && !this.opts.allowTableRecreateWhenNoDrop) {
// skip this operation, as it cannot be achieved // skip this operation, as it cannot be achieved
return []; return [];
} }

View File

@@ -35,9 +35,17 @@ export interface DbDiffOptions {
ignoreConstraintNames?: boolean; ignoreConstraintNames?: boolean;
noDropTable?: boolean; noDropTable?: boolean;
allowTableRecreateWhenNoDrop?: boolean;
allowTableMarkDropped?: boolean;
noDropColumn?: boolean; noDropColumn?: boolean;
allowColumnMarkDropped?: boolean;
noDropConstraint?: boolean; noDropConstraint?: boolean;
noDropSqlObject?: boolean; noDropSqlObject?: boolean;
allowSqlObjectMarkDropped?: boolean;
noRenameTable?: boolean; noRenameTable?: boolean;
noRenameColumn?: boolean; noRenameColumn?: boolean;
@@ -565,7 +573,9 @@ export function createAlterDatabasePlan(
const newobj = (newDb[objectTypeField] || []).find(x => x.pairingId == oldobj.pairingId); const newobj = (newDb[objectTypeField] || []).find(x => x.pairingId == oldobj.pairingId);
if (objectTypeField == 'tables') { if (objectTypeField == 'tables') {
if (newobj == null) { if (newobj == null) {
if (!opts.noDropTable) { if (opts.allowTableMarkDropped) {
plan.renameTable(oldobj, '_deleted_' + oldobj.pureName);
} else if (!opts.noDropTable) {
plan.dropTable(oldobj); plan.dropTable(oldobj);
} }
} else { } else {