diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index fd64a3868..6c617f08f 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -280,7 +280,7 @@ export function testEqualTypes(a: ColumnInfo, b: ColumnInfo, opts: DbDiffOptions if (opts.ignoreDataTypes) { return true; } - + if ((a.dataType || '').toLowerCase() != (b.dataType || '').toLowerCase()) { console.debug( `Column ${a.pureName}.${a.columnName}, ${b.pureName}.${b.columnName}: different data type: ${a.dataType}, ${b.dataType}` @@ -368,6 +368,18 @@ function planAlterTable(plan: AlterPlan, oldTable: TableInfo, newTable: TableInf constraintPairs.filter(x => x[0] == null).forEach(x => plan.createConstraint(x[1])); } +export function testEqualTables( + a: TableInfo, + b: TableInfo, + opts: DbDiffOptions, + db: DatabaseInfo, + driver: EngineDriver +) { + const plan = new AlterPlan(db, driver.dialect, opts); + planAlterTable(plan, a, b, opts); + return plan.operations.length == 0; +} + export function createAlterTablePlan( oldTable: TableInfo, newTable: TableInfo, @@ -470,6 +482,8 @@ export function getAlterDatabaseScript( } export function matchPairedObjects(db1: DatabaseInfo, db2: DatabaseInfo, opts: DbDiffOptions) { + if (!db1 || !db2) return null; + const res = _cloneDeep(db2); for (const objectTypeField of ['tables', 'views', 'procedures', 'matviews', 'functions']) { diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index dcc0ccf27..9581db77d 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -156,6 +156,20 @@ registerCommand({ }, }); +registerCommand({ + id: 'new.modelCompare', + category: 'New', + icon: 'img compare', + name: 'Compare DB Models', + onClick: () => { + openNewTab({ + title: 'Compare', + icon: 'img compare', + tabComponent: 'CompareModelTab', + }); + }, +}); + registerCommand({ id: 'new.freetable', category: 'New', diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 833bf73ed..acff365b7 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -50,6 +50,8 @@ 'icon arrow-begin': 'mdi mdi-arrow-collapse-left', 'icon arrow-end': 'mdi mdi-arrow-collapse-right', 'icon arrow-right': 'mdi mdi-arrow-right', + 'icon arrow-left-bold': 'mdi mdi-arrow-left-bold', + 'icon arrow-right-bold': 'mdi mdi-arrow-right-bold', 'icon triple-left': 'mdi mdi-chevron-triple-left', 'icon triple-right': 'mdi mdi-chevron-triple-right', 'icon format-code': 'mdi mdi-code-tags-check', @@ -97,6 +99,7 @@ 'img favorite': 'mdi mdi-star color-icon-yellow', 'img query-design': 'mdi mdi-vector-polyline-edit color-icon-red', 'img yaml': 'mdi mdi-code-brackets color-icon-red', + 'img compare': 'mdi mdi-compare color-icon-red', 'img free-table': 'mdi mdi-table color-icon-green', 'img macro': 'mdi mdi-hammer-wrench', diff --git a/packages/web/src/impexp/ImportExportConfigurator.svelte b/packages/web/src/impexp/ImportExportConfigurator.svelte index aa9d818d6..dfbddfc4e 100644 --- a/packages/web/src/impexp/ImportExportConfigurator.svelte +++ b/packages/web/src/impexp/ImportExportConfigurator.svelte @@ -149,7 +149,7 @@ setPreviewSource={previewSource.set} />
- +
+ export const matchingProps = []; + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + +
+ + diff --git a/packages/web/src/tabs/index.js b/packages/web/src/tabs/index.js index 5d2bdc252..a5484a095 100644 --- a/packages/web/src/tabs/index.js +++ b/packages/web/src/tabs/index.js @@ -15,6 +15,7 @@ import * as FavoriteEditorTab from './FavoriteEditorTab.svelte'; import * as QueryDesignTab from './QueryDesignTab.svelte'; import * as CommandListTab from './CommandListTab.svelte'; import * as YamlEditorTab from './YamlEditorTab.svelte'; +import * as CompareModelTab from './CompareModelTab.svelte'; export default { TableDataTab, @@ -34,4 +35,5 @@ export default { QueryDesignTab, CommandListTab, YamlEditorTab, + CompareModelTab, }; diff --git a/packages/web/src/utility/computeDiffRows.ts b/packages/web/src/utility/computeDiffRows.ts new file mode 100644 index 000000000..eb4024005 --- /dev/null +++ b/packages/web/src/utility/computeDiffRows.ts @@ -0,0 +1,44 @@ +import { DbDiffOptions, testEqualTables } from 'dbgate-tools'; +import { DatabaseInfo, EngineDriver } from 'dbgate-types'; + +export function computeDiffRows( + sourceDb: DatabaseInfo, + targetDb: DatabaseInfo, + opts: DbDiffOptions, + driver: EngineDriver +) { + if (!sourceDb || !targetDb) return []; + const res = []; + for (const obj of sourceDb.tables) { + const paired = targetDb.tables.find(x => x.pairingId == obj.pairingId); + if (paired) { + res.push({ + source: obj, + target: paired, + state: testEqualTables(obj, paired, opts, targetDb, driver) ? 'equal' : 'changed', + }); + } else { + res.push({ + source: obj, + state: 'removed', + }); + } + } + for (const obj of targetDb.tables) { + const paired = sourceDb.tables.find(x => x.pairingId == obj.pairingId); + if (!paired) { + res.push({ + target: obj, + state: 'added', + }); + } + } + + return res.map(row => ({ + ...row, + sourceSchemaName: row?.source?.schemaName, + sourcePureName: row?.source?.pureName, + targetSchemaName: row?.target?.schemaName, + targetPureName: row?.target?.pureName, + })); +}