diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index 8096fff9e..3a50d538e 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -11,6 +11,7 @@ const { generateDbPairingId, matchPairedObjects, extendDatabaseInfo, + modelCompareDbDiffOptions, } = require('dbgate-tools'); const { html, parse } = require('diff2html'); const { handleProcessCommunication } = require('../utility/processComm'); @@ -231,6 +232,11 @@ module.exports = { structure_meta: 'get', async structure({ conid, database }) { + if (conid == '__model') { + const model = await importDbModel(database); + return model; + } + const opened = await this.ensureOpened(conid, database); return opened.structure; // const existing = this.opened.find((x) => x.conid == conid && x.database == database); @@ -298,9 +304,7 @@ module.exports = { // }, async getUnifiedDiff({ sourceConid, sourceDatabase, targetConid, targetDatabase }) { - const dbDiffOptions = { - // schemaMode: 'ignore', - }; + const dbDiffOptions = sourceConid == '__model' ? modelCompareDbDiffOptions : {}; const sourceDb = generateDbPairingId( extendDatabaseInfo(await this.structure({ conid: sourceConid, database: sourceDatabase })) diff --git a/packages/api/src/shell/generateDeploySql.js b/packages/api/src/shell/generateDeploySql.js index 2bcf75411..acc7bd7f9 100644 --- a/packages/api/src/shell/generateDeploySql.js +++ b/packages/api/src/shell/generateDeploySql.js @@ -4,6 +4,7 @@ const { matchPairedObjects, databaseInfoFromYamlModel, extendDatabaseInfo, + modelCompareDbDiffOptions, } = require('dbgate-tools'); const importDbModel = require('../utility/importDbModel'); const requireEngineDriver = require('../utility/requireEngineDriver'); @@ -28,9 +29,7 @@ async function generateDeploySql({ ); const currentModel = generateDbPairingId(extendDatabaseInfo(analysedStructure)); const opts = { - ignoreCase: true, - schemaMode: 'ignore', - ignoreConstraintNames: true, + ...modelCompareDbDiffOptions, noDropTable: true, noDropColumn: true, diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index bcbf4e9ac..06a5691c1 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -523,3 +523,9 @@ export function matchPairedObjects(db1: DatabaseInfo, db2: DatabaseInfo, opts: D return res; } + +export const modelCompareDbDiffOptions: DbDiffOptions = { + ignoreCase: true, + schemaMode: 'ignore', + ignoreConstraintNames: true, +}; diff --git a/packages/web/src/impexp/FormConnectionSelect.svelte b/packages/web/src/impexp/FormConnectionSelect.svelte index 957e2d74d..4f7911f32 100644 --- a/packages/web/src/impexp/FormConnectionSelect.svelte +++ b/packages/web/src/impexp/FormConnectionSelect.svelte @@ -3,15 +3,19 @@ import FormSelectField from '../forms/FormSelectField.svelte'; import getConnectionLabel from '../utility/getConnectionLabel'; import { useConnectionList } from '../utility/metadataLoaders'; + export let allowChooseModel = false; $: connections = useConnectionList(); - $: connectionOptions = _.sortBy( - ($connections || []).map(conn => ({ - value: conn._id, - label: getConnectionLabel(conn), - })), - 'label' - ); + $: connectionOptions = [ + ...(allowChooseModel ? [{ label: '(DB Model)', value: '__model' }] : []), + ..._.sortBy( + ($connections || []).map(conn => ({ + value: conn._id, + label: getConnectionLabel(conn), + })), + 'label' + ), + ]; diff --git a/packages/web/src/tabs/CompareModelTab.svelte b/packages/web/src/tabs/CompareModelTab.svelte index 522d62c8b..8242e9764 100644 --- a/packages/web/src/tabs/CompareModelTab.svelte +++ b/packages/web/src/tabs/CompareModelTab.svelte @@ -76,6 +76,7 @@ computeDbDiffRows, computeTableDiffColumns, getCreateObjectScript, + modelCompareDbDiffOptions, } from 'dbgate-tools'; import _, { startsWith } from 'lodash'; @@ -89,6 +90,7 @@ import VerticalSplitter from '../elements/VerticalSplitter.svelte'; import FormFieldTemplateTiny from '../forms/FormFieldTemplateTiny.svelte'; import FormProviderCore from '../forms/FormProviderCore.svelte'; + import FormSelectField from '../forms/FormSelectField.svelte'; import FontIcon from '../icons/FontIcon.svelte'; import FormConnectionSelect from '../impexp/FormConnectionSelect.svelte'; import FormDatabaseSelect from '../impexp/FormDatabaseSelect.svelte'; @@ -102,7 +104,7 @@ import { changeTab } from '../utility/common'; import contextMenu, { getContextMenu, registerMenu } from '../utility/contextMenu'; import createActivator, { getActiveComponent } from '../utility/createActivator'; - import { useConnectionInfo, useDatabaseInfo } from '../utility/metadataLoaders'; + import { useArchiveFolders, useConnectionInfo, useDatabaseInfo } from '../utility/metadataLoaders'; import resolveApi from '../utility/resolveApi'; import { showSnackbarSuccess } from '../utility/snackbar'; @@ -119,9 +121,7 @@ // targetDatabase: null, // }); - const dbDiffOptions: any = { - // schemaMode: 'ignore', - }; + $: dbDiffOptions = $values?.sourceConid == '__model' ? modelCompareDbDiffOptions : {}; $: sourceDbValue = useDatabaseInfo({ conid: $values?.sourceConid, database: $values?.sourceDatabase }); $: targetDbValue = useDatabaseInfo({ conid: $values?.targetConid, database: $values?.targetDatabase }); @@ -133,7 +133,7 @@ $: driver = findEngineDriver($connection, $extensions); $: targetDbPaired = matchPairedObjects(sourceDb, targetDb, dbDiffOptions); - $: diffRows = computeDbDiffRows(sourceDb, targetDbPaired, dbDiffOptions, driver); + $: diffRows = _.sortBy(computeDbDiffRows(sourceDb, targetDbPaired, dbDiffOptions, driver), x => stateOrder(x.state)); $: diffColumns = computeTableDiffColumns( diffRows[pairIndex]?.source, diffRows[pairIndex]?.target, @@ -149,6 +149,8 @@ driver ).sql; + $: archiveFolders = useArchiveFolders(); + $: changeTab(tabid, tab => ({ ...tab, title: $values?.targetDatabase, @@ -274,16 +276,27 @@ label="Source server" templateProps={{ noMargin: true }} isNative + allowChooseModel />
- + {#if $values?.sourceConid == '__model'} + ({ label: x.name, value: `archive:${x.name}` }))} + /> + {:else} + + {/if}
@@ -310,7 +323,7 @@
stateOrder(x.state))} + rows={diffRows} bind:selectedIndex={pairIndex} selectable disableFocusOutline