drop table context menu

This commit is contained in:
Jan Prochazka
2021-09-10 20:08:17 +02:00
parent 37c305461f
commit 016e96d0e6
3 changed files with 93 additions and 3 deletions

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);
}