diff --git a/packages/tools/src/alterPlan.ts b/packages/tools/src/alterPlan.ts index b3f05de93..a3a0a7382 100644 --- a/packages/tools/src/alterPlan.ts +++ b/packages/tools/src/alterPlan.ts @@ -246,6 +246,16 @@ export class AlterPlan { return res; } + if (op.operationType == 'dropTable') { + return [ + ...(op.oldObject.dependencies || []).map(oldObject => ({ + operationType: 'dropConstraint', + oldObject, + })), + op, + ]; + } + return [op]; }); @@ -371,6 +381,9 @@ export function runAlterOperation(op: AlterOperation, processor: AlterProcessor) case 'dropColumn': processor.dropColumn(op.oldObject); break; + case 'dropTable': + processor.dropTable(op.oldObject); + break; case 'changeConstraint': processor.changeConstraint(op.oldObject, op.newObject); break; diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index 9a1c39559..42eb6ee91 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -285,6 +285,34 @@ export function createAlterTablePlan( return plan; } +export function createAlterDatabasePlan( + oldDb: DatabaseInfo, + newDb: DatabaseInfo, + opts: DbDiffOptions, + db: DatabaseInfo, + driver: EngineDriver +): AlterPlan { + const plan = new AlterPlan(db, driver.dialect); + + for (const objectTypeField of ['tables']) { + for (const oldobj of oldDb[objectTypeField]) { + const newobj = newDb[objectTypeField].find(x => x.pairingId == oldobj.pairingId); + if (objectTypeField == 'tables') { + if (newobj == null) plan.dropTable(oldobj); + else planAlterTable(plan, oldobj, newobj, opts); + } + } + for (const newobj of newDb[objectTypeField]) { + const oldobj = oldDb[objectTypeField].find(x => x.pairingId == newobj.pairingId); + if (objectTypeField == 'tables') { + if (newobj == null) plan.createTable(newobj); + } + } + } + plan.transformPlan(); + return plan; +} + export function getAlterTableScript( oldTable: TableInfo, newTable: TableInfo, @@ -294,6 +322,19 @@ export function getAlterTableScript( ): string { const plan = createAlterTablePlan(oldTable, newTable, opts, db, driver); const dmp = driver.createDumper(); - plan.run(dmp ); + plan.run(dmp); + return dmp.s; +} + +export function getAlterDatabaseScript( + oldDb: DatabaseInfo, + newDb: DatabaseInfo, + opts: DbDiffOptions, + db: DatabaseInfo, + driver: EngineDriver +): string { + const plan = createAlterDatabasePlan(oldDb, newDb, opts, db, driver); + const dmp = driver.createDumper(); + plan.run(dmp); return dmp.s; } diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 5231e1a13..c27a0fb69 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -40,6 +40,10 @@ label: 'Open structure', tab: 'TableStructureTab', }, + { + label: 'Drop table', + isDrop: true, + }, { label: 'Query designer', isQueryDesigner: true, @@ -335,8 +339,8 @@ import AppObjectCore from './AppObjectCore.svelte'; import { currentDatabase, extensions, openedConnections } from '../stores'; import openNewTab from '../utility/openNewTab'; - import { filterName } from 'dbgate-tools'; - import { getConnectionInfo } from '../utility/metadataLoaders'; + import { filterName, generateDbPairingId, getAlterDatabaseScript } from 'dbgate-tools'; + import { getConnectionInfo, getDatabaseInfo } from '../utility/metadataLoaders'; import fullDisplayName from '../utility/fullDisplayName'; import ImportExportModal from '../modals/ImportExportModal.svelte'; import { showModal } from '../modals/modalTools'; @@ -347,6 +351,8 @@ import getElectron from '../utility/getElectron'; import { exportElectronFile } from '../utility/exportElectronFile'; import createQuickExportMenu from '../utility/createQuickExportMenu'; + import ConfirmSqlModal from '../modals/ConfirmSqlModal.svelte'; + import axiosInstance from '../utility/axiosInstance'; export let data; @@ -500,6 +506,36 @@ conid: data.conid, database: data.database, }); + } else if (menu.isDrop) { + const { conid, database } = data; + const db = generateDbPairingId(await getDatabaseInfo({ conid, database })); + console.log('DB', db); + const driver = await getDriver(); + const dbUpdated = { + ...db, + [data.objectTypeField]: (db[data.objectTypeField] || []).filter( + x => x.schemaName != data.schemaName || x.pureName != data.pureName + ), + }; + + const sql = getAlterDatabaseScript(db, dbUpdated, {}, db, driver); + + showModal(ConfirmSqlModal, { + sql, + onConfirm: async () => { + const resp = await axiosInstance.request({ + url: 'database-connections/run-script', + method: 'post', + params: { + conid, + database, + }, + data: { sql }, + }); + await axiosInstance.post('database-connections/sync-model', { conid, database }); + }, + engine: driver.engine, + }); } else { openDatabaseObjectDetail(menu.tab, menu.scriptTemplate, data, menu.forceNewTab, menu.initialData); }