From f92153d957e8cfbf47a3c6d5f826d9e8edc6a6d5 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 25 Sep 2021 09:59:45 +0200 Subject: [PATCH 01/33] #173 --- packages/api/src/utility/crypting.js | 4 ++-- packages/api/src/utility/platformInfo.js | 2 +- packages/api/src/utility/sshTunnel.js | 6 +++--- .../web/src/modals/ConnectionModalSshTunnelFields.svelte | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/api/src/utility/crypting.js b/packages/api/src/utility/crypting.js index 491ed39ae..d7428df77 100644 --- a/packages/api/src/utility/crypting.js +++ b/packages/api/src/utility/crypting.js @@ -70,14 +70,14 @@ function decryptPasswordField(connection, field) { function encryptConnection(connection) { connection = encryptPasswordField(connection, 'password'); connection = encryptPasswordField(connection, 'sshPassword'); - connection = encryptPasswordField(connection, 'sshKeyFilePassword'); + connection = encryptPasswordField(connection, 'sshKeyfilePassword'); return connection; } function decryptConnection(connection) { connection = decryptPasswordField(connection, 'password'); connection = decryptPasswordField(connection, 'sshPassword'); - connection = decryptPasswordField(connection, 'sshKeyFilePassword'); + connection = decryptPasswordField(connection, 'sshKeyfilePassword'); return connection; } diff --git a/packages/api/src/utility/platformInfo.js b/packages/api/src/utility/platformInfo.js index 2141df45e..2025dc72b 100644 --- a/packages/api/src/utility/platformInfo.js +++ b/packages/api/src/utility/platformInfo.js @@ -37,7 +37,7 @@ const platformInfo = { environment: process.env.NODE_ENV, platform, runningInWebpack: !!process.env.WEBPACK_DEV_SERVER_URL, - defaultKeyFile: path.join(os.homedir(), '.ssh/id_rsa'), + defaultKeyfile: path.join(os.homedir(), '.ssh/id_rsa'), }; module.exports = platformInfo; diff --git a/packages/api/src/utility/sshTunnel.js b/packages/api/src/utility/sshTunnel.js index 25484526a..a330821dd 100644 --- a/packages/api/src/utility/sshTunnel.js +++ b/packages/api/src/utility/sshTunnel.js @@ -16,9 +16,9 @@ const CONNECTION_FIELDS = [ 'sshLogin', 'sshPassword', 'sshMode', - 'sshKeyFile', + 'sshKeyfile', 'sshBastionHost', - 'sshKeyFilePassword', + 'sshKeyfilePassword', ]; const TUNNEL_FIELDS = [...CONNECTION_FIELDS, 'server', 'port']; @@ -31,7 +31,7 @@ async function getSshConnection(connection) { endPort: connection.sshPort || 22, bastionHost: connection.sshBastionHost || '', agentForward: connection.sshMode == 'agent', - passphrase: connection.sshMode == 'keyFile' ? connection.sshKeyFilePassword : undefined, + passphrase: connection.sshMode == 'keyFile' ? connection.sshKeyfilePassword : undefined, username: connection.sshLogin, password: connection.sshMode == 'userPassword' ? connection.sshPassword : undefined, agentSocket: connection.sshMode == 'agent' ? platformInfo.sshAuthSock : undefined, diff --git a/packages/web/src/modals/ConnectionModalSshTunnelFields.svelte b/packages/web/src/modals/ConnectionModalSshTunnelFields.svelte index 3314b9dfd..f7df9f57c 100644 --- a/packages/web/src/modals/ConnectionModalSshTunnelFields.svelte +++ b/packages/web/src/modals/ConnectionModalSshTunnelFields.svelte @@ -22,7 +22,7 @@ $: { if (!$values.sshMode) setFieldValue('sshMode', 'userPassword'); if (!$values.sshPort) setFieldValue('sshPort', '22'); - if (!$values.sshKeyfile && $platformInfo) setFieldValue('sshKeyfile', $platformInfo.defaultKeyFile); + if (!$values.sshKeyfile && $platformInfo) setFieldValue('sshKeyfile', $platformInfo.defaultKeyfile); } From 065af0b4a8c40da97967250bb2282e2fd27244ab Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 25 Sep 2021 12:08:20 +0200 Subject: [PATCH 02/33] #172 --- packages/web/src/appobj/AppObjectList.svelte | 28 +++++++++++++++---- .../web/src/appobj/ConnectionAppObject.svelte | 10 +++++-- packages/web/src/stores.ts | 6 ++++ packages/web/src/utility/common.ts | 6 ++++ packages/web/src/utility/metadataLoaders.ts | 16 ++++++++--- packages/web/src/utility/storageCache.js | 22 +++++++++++++++ 6 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 packages/web/src/utility/storageCache.js diff --git a/packages/web/src/appobj/AppObjectList.svelte b/packages/web/src/appobj/AppObjectList.svelte index a70719aa7..1e0060c6b 100644 --- a/packages/web/src/appobj/AppObjectList.svelte +++ b/packages/web/src/appobj/AppObjectList.svelte @@ -1,5 +1,6 @@ {#if groupFunc} diff --git a/packages/web/src/appobj/ConnectionAppObject.svelte b/packages/web/src/appobj/ConnectionAppObject.svelte index 829a8c85e..5d9faeefe 100644 --- a/packages/web/src/appobj/ConnectionAppObject.svelte +++ b/packages/web/src/appobj/ConnectionAppObject.svelte @@ -1,12 +1,16 @@ - ({ ...db, connection: data }))} module={databaseAppObject} /> + filterName(filter, x.name)).map(db => ({ ...db, connection: data }))} + module={databaseAppObject} +/> From b503ea9a023e3cac363fb716582d140f837455b3 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 25 Sep 2021 12:55:30 +0200 Subject: [PATCH 04/33] upgraded svelte --- packages/web/package.json | 2 +- patches/{svelte+3.35.0.patch => svelte+3.43.0.patch} | 12 ++++++------ yarn.lock | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) rename patches/{svelte+3.35.0.patch => svelte+3.43.0.patch} (75%) diff --git a/packages/web/package.json b/packages/web/package.json index 06dee6a0f..014790d4e 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -41,7 +41,7 @@ "sirv-cli": "^1.0.0", "socket.io-client": "^2.3.0", "sql-formatter": "^2.3.3", - "svelte": "^3.35.0", + "svelte": "^3.43.0", "svelte-check": "^1.0.0", "svelte-markdown": "^0.1.4", "svelte-preprocess": "^4.0.0", diff --git a/patches/svelte+3.35.0.patch b/patches/svelte+3.43.0.patch similarity index 75% rename from patches/svelte+3.35.0.patch rename to patches/svelte+3.43.0.patch index ba2e32c3c..9c26e0966 100644 --- a/patches/svelte+3.35.0.patch +++ b/patches/svelte+3.43.0.patch @@ -1,9 +1,9 @@ diff --git a/node_modules/svelte/internal/index.js b/node_modules/svelte/internal/index.js -index ee20a17..7b6fff8 100644 +index 1cce90d..6220522 100644 --- a/node_modules/svelte/internal/index.js +++ b/node_modules/svelte/internal/index.js -@@ -200,7 +200,7 @@ function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); +@@ -374,7 +374,7 @@ function insert_hydration(target, node, anchor) { + } } function detach(node) { - node.parentNode.removeChild(node); @@ -12,11 +12,11 @@ index ee20a17..7b6fff8 100644 function destroy_each(iterations, detaching) { for (let i = 0; i < iterations.length; i += 1) { diff --git a/node_modules/svelte/internal/index.mjs b/node_modules/svelte/internal/index.mjs -index 4146e56..f5f00c5 100644 +index 6650e85..b746187 100644 --- a/node_modules/svelte/internal/index.mjs +++ b/node_modules/svelte/internal/index.mjs -@@ -196,7 +196,7 @@ function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); +@@ -370,7 +370,7 @@ function insert_hydration(target, node, anchor) { + } } function detach(node) { - node.parentNode.removeChild(node); diff --git a/yarn.lock b/yarn.lock index 27759e55b..82aab56ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10069,10 +10069,10 @@ svelte-select@^3.17.0: resolved "https://registry.yarnpkg.com/svelte-select/-/svelte-select-3.17.0.tgz#6bea0cb8d0c9465d28a2bac562f2de8a61f48a9f" integrity sha512-ITmX/XUiSdkaILmsTviKRkZPaXckM5/FA7Y8BhiUPoamaZG/ZDyOo6ydjFu9fDVFTbwoAUGUi6HBjs+ZdK2AwA== -svelte@^3.35.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.35.0.tgz#e0d0ba60c4852181c2b4fd851194be6fda493e65" - integrity sha512-gknlZkR2sXheu/X+B7dDImwANVvK1R0QGQLd8CNIfxxGPeXBmePnxfzb6fWwTQRsYQG7lYkZXvpXJvxvpsoB7g== +svelte@^3.43.0: + version "3.43.0" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.43.0.tgz#d28d06ec523bf0cea3de15558a3241c339a85762" + integrity sha512-T2pMPHrxXp+SM8pLLUXLQgkdo+JhTls7aqj9cD7z8wT2ccP+OrCAmtQS7h6pvMjitaZhXFNnCK582NxDpy8HSw== symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" From da5b96c0a8988b1a00ddda446c5894df1df5c813 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 25 Sep 2021 12:58:28 +0200 Subject: [PATCH 05/33] keyed app object list (hopefully fixed CRASH in svelte) --- packages/web/src/appobj/AppObjectGroup.svelte | 2 +- packages/web/src/appobj/AppObjectList.svelte | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web/src/appobj/AppObjectGroup.svelte b/packages/web/src/appobj/AppObjectGroup.svelte index 4b87aaa85..ee516479e 100644 --- a/packages/web/src/appobj/AppObjectGroup.svelte +++ b/packages/web/src/appobj/AppObjectGroup.svelte @@ -52,7 +52,7 @@ {/if} - {#each filtered as item} + {#each filtered as item (module.extractKey(item.data))} {#if groupFunc} - {#each _.keys(groups) as group} + {#each _.keys(groups) as group (group)} {/each} {:else} - {#each filtered as data} + {#each filtered as data (module.extractKey(data))} Date: Sat, 25 Sep 2021 13:02:13 +0200 Subject: [PATCH 06/33] Revert "keyed app object list (hopefully fixed CRASH in svelte)" This reverts commit da5b96c0a8988b1a00ddda446c5894df1df5c813. --- packages/web/src/appobj/AppObjectGroup.svelte | 2 +- packages/web/src/appobj/AppObjectList.svelte | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/web/src/appobj/AppObjectGroup.svelte b/packages/web/src/appobj/AppObjectGroup.svelte index ee516479e..4b87aaa85 100644 --- a/packages/web/src/appobj/AppObjectGroup.svelte +++ b/packages/web/src/appobj/AppObjectGroup.svelte @@ -52,7 +52,7 @@ {/if} - {#each filtered as item (module.extractKey(item.data))} + {#each filtered as item} {#if groupFunc} - {#each _.keys(groups) as group (group)} + {#each _.keys(groups) as group} {/each} {:else} - {#each filtered as data (module.extractKey(data))} + {#each filtered as data} Date: Sat, 25 Sep 2021 13:07:38 +0200 Subject: [PATCH 07/33] better quick search UX (preserves expanded state() --- packages/web/src/appobj/AppObjectGroup.svelte | 3 +- packages/web/src/appobj/AppObjectList.svelte | 3 +- .../web/src/appobj/AppObjectListItem.svelte | 31 ++++++++++--------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/web/src/appobj/AppObjectGroup.svelte b/packages/web/src/appobj/AppObjectGroup.svelte index 4b87aaa85..b8fdd6253 100644 --- a/packages/web/src/appobj/AppObjectGroup.svelte +++ b/packages/web/src/appobj/AppObjectGroup.svelte @@ -52,8 +52,9 @@ {/if} - {#each filtered as item} + {#each items as item} {/each} {:else} - {#each filtered as data} + {#each list as data} - +{#if !isHidden} + -{#if isExpanded && subItemsComponent} -
- -
+ {#if isExpanded && subItemsComponent} +
+ +
+ {/if} {/if} From 17a3fec158f9f54f457ac30fc09357a4aae3e19b Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 09:22:03 +0200 Subject: [PATCH 15/33] fix --- packages/web/src/commands/CommandPalette.svelte | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/web/src/commands/CommandPalette.svelte b/packages/web/src/commands/CommandPalette.svelte index d0613280c..284ac70e7 100644 --- a/packages/web/src/commands/CommandPalette.svelte +++ b/packages/web/src/commands/CommandPalette.svelte @@ -1,4 +1,6 @@ @@ -34,6 +51,7 @@ import _ from 'lodash'; import { onMount } from 'svelte'; + import { databaseObjectIcons, handleDatabaseObjectClick } from '../appobj/DatabaseObjectAppObject.svelte'; import FontIcon from '../icons/FontIcon.svelte'; import { commands, @@ -50,7 +68,6 @@ let domInput; let filter = ''; - let selectedPage = 'menu'; const domItems = {}; $: selectedIndex = true ? 0 : filter; @@ -73,8 +90,8 @@ $: database = _.get($currentDatabase, 'name'); $: databaseInfo = useDatabaseInfo({ conid, database }); - $: filteredItems = (selectedPage == 'database' - ? extractDbItems($databaseInfo) + $: filteredItems = ($visibleCommandPalette == 'database' + ? extractDbItems($databaseInfo, { conid, database }) : parentCommand ? parentCommand.getSubCommands() : sortedComands @@ -87,7 +104,7 @@ filter = ''; selectedIndex = 0; } else { - $visibleCommandPalette = false; + $visibleCommandPalette = null; command.onClick(); } } @@ -100,7 +117,7 @@ e.stopPropagation(); handleCommand(filteredItems[selectedIndex]); } - if (e.keyCode == keycodes.escape) $visibleCommandPalette = false; + if (e.keyCode == keycodes.escape) $visibleCommandPalette = null; if (e.keyCode == keycodes.pageDown) selectedIndex = Math.min(selectedIndex + 15, filteredItems.length - 1); if (e.keyCode == keycodes.pageUp) selectedIndex = Math.max(selectedIndex - 15, 0); @@ -109,13 +126,19 @@ $: if (domItems[selectedIndex]) domItems[selectedIndex].scrollIntoView({ block: 'nearest', inline: 'nearest' }); -
($visibleCommandPalette = false)}> +
{ + $visibleCommandPalette = null; + }} +>
{ - selectedPage = 'menu'; + $visibleCommandPalette = 'menu'; domInput.focus(); }} > @@ -123,9 +146,9 @@
{ - selectedPage = 'database'; + $visibleCommandPalette = 'database'; domInput.focus(); }} > @@ -150,7 +173,12 @@ on:click={() => handleCommand(command)} bind:this={domItems[index]} > -
{command.text}
+
+ {#if command.icon} + + {/if} + {command.text} +
{#if command.keyText}
{command.keyText}
{/if} diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index 861f6e789..849202883 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -35,7 +35,7 @@ export const openedConnections = writable([]); export const currentDatabase = writable(null); export const openedTabs = writableWithStorage([], 'openedTabs'); export const extensions = writable(null); -export const visibleCommandPalette = writable(false); +export const visibleCommandPalette = writable(null); export const commands = writable({}); export const currentTheme = writableWithStorage('theme-light', 'currentTheme'); export const activeTabId = derived([openedTabs], ([$openedTabs]) => $openedTabs.find(x => x.selected)?.tabid); diff --git a/packages/web/src/widgets/WidgetIconPanel.svelte b/packages/web/src/widgets/WidgetIconPanel.svelte index 41dd2e07a..440bca657 100644 --- a/packages/web/src/widgets/WidgetIconPanel.svelte +++ b/packages/web/src/widgets/WidgetIconPanel.svelte @@ -66,7 +66,7 @@
{#if !$visibleToolbar} -
($visibleCommandPalette = true)}> +
($visibleCommandPalette = 'menu')}>
{/if} From 1f8021833bbfdfc006f6685e9f92c00170c3e538 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 10:04:29 +0200 Subject: [PATCH 17/33] search in databases --- .../web/src/commands/CommandPalette.svelte | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/web/src/commands/CommandPalette.svelte b/packages/web/src/commands/CommandPalette.svelte index 7f78b3c6a..fa44867f1 100644 --- a/packages/web/src/commands/CommandPalette.svelte +++ b/packages/web/src/commands/CommandPalette.svelte @@ -24,7 +24,7 @@ testEnabled: () => getVisibleCommandPalette() != 'database', }); - function extractDbItems(db, dbConnectionInfo) { + function extractDbItems(db, dbConnectionInfo, connectionList) { const objectList = _.flatten( ['tables', 'collections', 'views', 'matviews', 'procedures', 'functions'].map(objectTypeField => _.sortBy( @@ -33,11 +33,23 @@ onClick: () => handleDatabaseObjectClick({ objectTypeField, ...dbConnectionInfo, ...obj }), icon: databaseObjectIcons[objectTypeField], })), - ['schemaName', 'pureName'] + ['text'] ) ) ); - return objectList; + const databaseList = []; + for (const connection of connectionList || []) { + const conid = connection._id; + const databases = getLocalStorage(`database_list_${conid}`) || []; + for (const db of databases) { + databaseList.push({ + text: `${db.name} on ${getConnectionLabel(connection)}`, + icon: 'img database', + onClick: () => currentDatabase.set({ connection, name: db.name }), + }); + } + } + return [..._.sortBy(databaseList, 'text'), ...objectList]; // return db?.tables?.map(table => ({ // text: table.pureName, @@ -61,9 +73,11 @@ visibleCommandPalette, } from '../stores'; import clickOutside from '../utility/clickOutside'; + import getConnectionLabel from '../utility/getConnectionLabel'; import getElectron from '../utility/getElectron'; import keycodes from '../utility/keycodes'; - import { useDatabaseInfo } from '../utility/metadataLoaders'; + import { useConnectionList, useDatabaseInfo } from '../utility/metadataLoaders'; + import { getLocalStorage } from '../utility/storageCache'; import registerCommand from './registerCommand'; let domInput; @@ -89,9 +103,10 @@ $: conid = _.get($currentDatabase, 'connection._id'); $: database = _.get($currentDatabase, 'name'); $: databaseInfo = useDatabaseInfo({ conid, database }); + $: connectionList = useConnectionList(); $: filteredItems = ($visibleCommandPalette == 'database' - ? extractDbItems($databaseInfo, { conid, database }) + ? extractDbItems($databaseInfo, { conid, database }, $connectionList) : parentCommand ? parentCommand.getSubCommands() : sortedComands From 3b15d315ec4836221f40d942148ed53e7659d089 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 10:10:58 +0200 Subject: [PATCH 18/33] db search in main menu --- app/src/electron.js | 1 + packages/web/src/commands/CommandPalette.svelte | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/electron.js b/app/src/electron.js index ae302b1bc..1a194b9c9 100644 --- a/app/src/electron.js +++ b/app/src/electron.js @@ -50,6 +50,7 @@ function buildMenu() { commandItem('file.open'), commandItem('group.save'), commandItem('group.saveAs'), + commandItem('database.search'), { type: 'separator' }, commandItem('tabs.closeTab'), commandItem('file.exit'), diff --git a/packages/web/src/commands/CommandPalette.svelte b/packages/web/src/commands/CommandPalette.svelte index fa44867f1..87e3e4170 100644 --- a/packages/web/src/commands/CommandPalette.svelte +++ b/packages/web/src/commands/CommandPalette.svelte @@ -5,7 +5,7 @@ id: 'commandPalette.show', category: 'Command palette', name: 'Show', - toolbarName: 'Menu', + toolbarName: 'Menu+Search', toolbarOrder: 0, keyText: 'F1', toolbar: true, @@ -18,6 +18,7 @@ registerCommand({ id: 'database.search', category: 'Database', + toolbarName: 'Database search', name: 'Search', keyText: electron ? 'Ctrl+P' : 'F3', onClick: () => visibleCommandPalette.set('database'), From 8910a6bd0776dc93f78d562c00f8f0c580896791 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 10:13:22 +0200 Subject: [PATCH 19/33] don't clear localStorage in case of crash --- packages/web/src/utility/ErrorHandler.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/utility/ErrorHandler.svelte b/packages/web/src/utility/ErrorHandler.svelte index 4d405e3a4..a87cb9725 100644 --- a/packages/web/src/utility/ErrorHandler.svelte +++ b/packages/web/src/utility/ErrorHandler.svelte @@ -22,7 +22,7 @@ 'Sorry, DbGate has crashed again.\nDo you want to clear local user data to avoid crashing after next reload?' ) ) { - localStorage.clear(); + localStorage.removeItem('openedTabs'); try { await localforage.clear(); } catch (err) { From 2c2b4fc08f3fa7bf799d0a56d2d9ad50994c8cbb Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 11:32:23 +0200 Subject: [PATCH 20/33] delete cascade WIP --- packages/datalib/src/ChangeSet.ts | 110 +++++++++++++++++- .../web/src/modals/ConfirmSqlModal.svelte | 38 +++++- packages/web/src/tabs/TableDataTab.svelte | 11 +- 3 files changed, 153 insertions(+), 6 deletions(-) diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts index 97c7aef12..4b6a2ddbe 100644 --- a/packages/datalib/src/ChangeSet.ts +++ b/packages/datalib/src/ChangeSet.ts @@ -11,6 +11,11 @@ export interface ChangeSetItem { fields?: { [column: string]: string }; } +export interface ChangeSetDeleteCascade { + title: string; + commands: Command[]; +} + export interface ChangeSet { inserts: ChangeSetItem[]; updates: ChangeSetItem[]; @@ -118,7 +123,11 @@ export function setChangeSetValue( }; } -export function setChangeSetRowData(changeSet: ChangeSet, definition: ChangeSetRowDefinition, document: any): ChangeSet { +export function setChangeSetRowData( + changeSet: ChangeSet, + definition: ChangeSetRowDefinition, + document: any +): ChangeSet { if (!changeSet || !definition) return changeSet; let [fieldName, existingItem] = findExistingChangeSetItem(changeSet, definition); if (fieldName == 'deletes') { @@ -257,7 +266,7 @@ function insertToSql( ]; } -function extractCondition(item: ChangeSetItem): Condition { +function extractCondition(item: ChangeSetItem, alias?: string): Condition { return { conditionType: 'and', conditions: _.keys(item.condition).map(columnName => ({ @@ -271,6 +280,7 @@ function extractCondition(item: ChangeSetItem): Condition { pureName: item.pureName, schemaName: item.schemaName, }, + alias, }, }, right: { @@ -318,6 +328,102 @@ export function changeSetToSql(changeSet: ChangeSet, dbinfo: DatabaseInfo): Comm ); } +export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): ChangeSetDeleteCascade[] { + const res: ChangeSetDeleteCascade[] = []; + const allForeignKeys = _.flatten(dbinfo.tables.map(x => x.foreignKeys)); + for (const baseCmd of changeSet.deletes) { + const table = dbinfo.tables.find(x => x.pureName == baseCmd.pureName && x.schemaName == baseCmd.schemaName); + const dependencies = allForeignKeys.filter( + x => x.refSchemaName == table.schemaName && x.refTableName == table.pureName + ); + for (const fk of dependencies) { + const refCmd: Delete = { + commandType: 'delete', + from: { + name: { + pureName: fk.pureName, + schemaName: fk.schemaName, + }, + }, + where: { + conditionType: 'exists', + subQuery: { + commandType: 'select', + from: { + name: { + pureName: fk.pureName, + schemaName: fk.schemaName, + }, + alias: 't1', + relations: [ + { + joinType: 'INNER JOIN', + alias: 't2', + name: { + pureName: fk.refTableName, + schemaName: fk.refSchemaName, + }, + conditions: fk.columns.map(column => ({ + conditionType: 'binary', + operator: '=', + left: { + exprType: 'column', + columnName: column.columnName, + source: { alias: 't1' }, + }, + right: { + exprType: 'column', + columnName: column.refColumnName, + source: { alias: 't2' }, + }, + })), + }, + ], + }, + where: { + conditionType: 'and', + conditions: [ + extractCondition(baseCmd, 't2'), + // @ts-ignore + ...fk.columns.map(column => ({ + conditionType: 'binary', + operator: '=', + left: { + exprType: 'column', + columnName: column.columnName, + source: { alias: 't1' }, + }, + right: { + exprType: 'column', + columnName: column.refColumnName, + source: { + name: { + pureName: fk.refTableName, + schemaName: fk.refSchemaName, + }, + }, + }, + })), + ], + }, + }, + }, + }; + let resItem = res.find(x => x.title == fk.pureName); + if (!resItem) { + resItem = { + title: fk.pureName, + commands: [], + }; + res.push(resItem); + } + resItem.commands.push(refCmd); + } + } + + return res; +} + export function revertChangeSetRowChanges(changeSet: ChangeSet, definition: ChangeSetRowDefinition): ChangeSet { // console.log('definition', definition); const [field, item] = findExistingChangeSetItem(changeSet, definition); diff --git a/packages/web/src/modals/ConfirmSqlModal.svelte b/packages/web/src/modals/ConfirmSqlModal.svelte index 6b3a0c20a..fcdbbddbc 100644 --- a/packages/web/src/modals/ConfirmSqlModal.svelte +++ b/packages/web/src/modals/ConfirmSqlModal.svelte @@ -1,5 +1,6 @@ Date: Tue, 28 Sep 2021 12:28:09 +0200 Subject: [PATCH 21/33] delete cascade --- packages/datalib/src/ChangeSet.ts | 16 ++++++++++++++-- packages/web/src/modals/ConfirmSqlModal.svelte | 11 +++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts index 4b6a2ddbe..4c566cc6e 100644 --- a/packages/datalib/src/ChangeSet.ts +++ b/packages/datalib/src/ChangeSet.ts @@ -333,6 +333,7 @@ export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): C const allForeignKeys = _.flatten(dbinfo.tables.map(x => x.foreignKeys)); for (const baseCmd of changeSet.deletes) { const table = dbinfo.tables.find(x => x.pureName == baseCmd.pureName && x.schemaName == baseCmd.schemaName); + if (!table.primaryKey) continue; const dependencies = allForeignKeys.filter( x => x.refSchemaName == table.schemaName && x.refTableName == table.pureName ); @@ -385,7 +386,7 @@ export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): C conditions: [ extractCondition(baseCmd, 't2'), // @ts-ignore - ...fk.columns.map(column => ({ + ...table.primaryKey.columns.map(column => ({ conditionType: 'binary', operator: '=', left: { @@ -395,7 +396,7 @@ export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): C }, right: { exprType: 'column', - columnName: column.refColumnName, + columnName: column.columnName, source: { name: { pureName: fk.refTableName, @@ -419,6 +420,17 @@ export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): C } resItem.commands.push(refCmd); } + + let resItem = res.find(x => x.title == baseCmd.pureName); + if (!resItem) { + resItem = { + title: baseCmd.pureName, + commands: [], + }; + res.push(resItem); + } + + resItem.commands.push(deleteToSql(baseCmd)); } return res; diff --git a/packages/web/src/modals/ConfirmSqlModal.svelte b/packages/web/src/modals/ConfirmSqlModal.svelte index fcdbbddbc..a7bef44dd 100644 --- a/packages/web/src/modals/ConfirmSqlModal.svelte +++ b/packages/web/src/modals/ConfirmSqlModal.svelte @@ -82,9 +82,16 @@ { + on:click={e => { closeCurrentModal(); - onConfirm(); + onConfirm( + e.detail.deleteReferencesCascade + ? deleteCascadesScripts + .filter(({ script, title }) => e.detail[`deleteReferences_${title}`] !== false) + .map(({ script, title }) => script) + .join('\n') + : null + ); }} /> From 5b4e69fa0a56559b325fdebca4538ea4f6a7024d Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 12:34:54 +0200 Subject: [PATCH 22/33] upgraded typescript --- packages/api/package.json | 2 +- packages/datalib/package.json | 2 +- packages/filterparser/package.json | 2 +- packages/query-splitter/package.json | 2 +- packages/sqltree/package.json | 2 +- packages/tools/package.json | 2 +- packages/web/package.json | 2 +- yarn.lock | 13 ++++--------- 8 files changed, 11 insertions(+), 16 deletions(-) diff --git a/packages/api/package.json b/packages/api/package.json index 8d8ee1eff..39a9896b3 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -65,7 +65,7 @@ "env-cmd": "^10.1.0", "node-loader": "^1.0.2", "nodemon": "^2.0.2", - "typescript": "^3.7.4", + "typescript": "^4.4.3", "webpack": "^4.42.0", "webpack-cli": "^3.3.11" }, diff --git a/packages/datalib/package.json b/packages/datalib/package.json index 984ffa7fe..b39bdcc7b 100644 --- a/packages/datalib/package.json +++ b/packages/datalib/package.json @@ -17,6 +17,6 @@ "devDependencies": { "dbgate-types": "^4.1.1", "@types/node": "^13.7.0", - "typescript": "^3.7.5" + "typescript": "^4.4.3" } } \ No newline at end of file diff --git a/packages/filterparser/package.json b/packages/filterparser/package.json index 9b8a82c74..35f071052 100644 --- a/packages/filterparser/package.json +++ b/packages/filterparser/package.json @@ -18,7 +18,7 @@ "@types/node": "^13.7.0", "jest": "^24.9.0", "ts-jest": "^25.2.1", - "typescript": "^3.7.5" + "typescript": "^4.4.3" }, "dependencies": { "@types/parsimmon": "^1.10.1", diff --git a/packages/query-splitter/package.json b/packages/query-splitter/package.json index e4668e6eb..7d2cce9c2 100644 --- a/packages/query-splitter/package.json +++ b/packages/query-splitter/package.json @@ -32,6 +32,6 @@ "@types/node": "^13.7.0", "jest": "^24.9.0", "ts-jest": "^25.2.1", - "typescript": "^3.7.5" + "typescript": "^4.4.3" } } \ No newline at end of file diff --git a/packages/sqltree/package.json b/packages/sqltree/package.json index aa21d8a98..27f245665 100644 --- a/packages/sqltree/package.json +++ b/packages/sqltree/package.json @@ -28,7 +28,7 @@ "devDependencies": { "@types/node": "^13.7.0", "dbgate-types": "^4.1.1", - "typescript": "^3.7.5" + "typescript": "^4.4.3" }, "dependencies": { "lodash": "^4.17.21" diff --git a/packages/tools/package.json b/packages/tools/package.json index 554098260..a4e4df6a0 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -28,7 +28,7 @@ "dbgate-types": "^4.1.1", "jest": "^24.9.0", "ts-jest": "^25.2.1", - "typescript": "^3.7.5" + "typescript": "^4.4.3" }, "dependencies": { "lodash": "^4.17.21", diff --git a/packages/web/package.json b/packages/web/package.json index 014790d4e..03d07e2a3 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -47,7 +47,7 @@ "svelte-preprocess": "^4.0.0", "svelte-select": "^3.17.0", "tslib": "^2.0.0", - "typescript": "^3.9.3", + "typescript": "^4.4.3", "uuid": "^3.4.0" } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 82aab56ff..9534ce491 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10530,15 +10530,10 @@ typescript@*: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== -typescript@^3.7.4, typescript@^3.7.5: - version "3.7.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" - integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== - -typescript@^3.9.3: - version "3.9.9" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" - integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== +typescript@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== tz-offset@0.0.1: version "0.0.1" From f59c6c9fe5bf61aa0316a936c764986f15cd7a2f Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 12:47:19 +0200 Subject: [PATCH 23/33] delete cascade refactor WIP --- packages/datalib/src/ChangeSet.ts | 131 ++------------------------ packages/datalib/src/deleteCascade.ts | 117 +++++++++++++++++++++++ packages/datalib/src/index.ts | 1 + 3 files changed, 127 insertions(+), 122 deletions(-) create mode 100644 packages/datalib/src/deleteCascade.ts diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts index 4c566cc6e..5fd2cfe7b 100644 --- a/packages/datalib/src/ChangeSet.ts +++ b/packages/datalib/src/ChangeSet.ts @@ -11,11 +11,6 @@ export interface ChangeSetItem { fields?: { [column: string]: string }; } -export interface ChangeSetDeleteCascade { - title: string; - commands: Command[]; -} - export interface ChangeSet { inserts: ChangeSetItem[]; updates: ChangeSetItem[]; @@ -222,7 +217,7 @@ function extractFields(item: ChangeSetItem, allowNulls = true): UpdateField[] { })); } -function insertToSql( +function changeSetInsertToSql( item: ChangeSetItem, dbinfo: DatabaseInfo = null ): [AllowIdentityInsert, Insert, AllowIdentityInsert] { @@ -266,7 +261,7 @@ function insertToSql( ]; } -function extractCondition(item: ChangeSetItem, alias?: string): Condition { +export function extractChangeSetCondition(item: ChangeSetItem, alias?: string): Condition { return { conditionType: 'and', conditions: _.keys(item.condition).map(columnName => ({ @@ -291,7 +286,7 @@ function extractCondition(item: ChangeSetItem, alias?: string): Condition { }; } -function updateToSql(item: ChangeSetItem): Update { +function changeSetUpdateToSql(item: ChangeSetItem): Update { return { from: { name: { @@ -301,11 +296,11 @@ function updateToSql(item: ChangeSetItem): Update { }, commandType: 'update', fields: extractFields(item), - where: extractCondition(item), + where: extractChangeSetCondition(item), }; } -function deleteToSql(item: ChangeSetItem): Delete { +export function changeSetDeleteToSql(item: ChangeSetItem): Delete { return { from: { name: { @@ -314,128 +309,20 @@ function deleteToSql(item: ChangeSetItem): Delete { }, }, commandType: 'delete', - where: extractCondition(item), + where: extractChangeSetCondition(item), }; } export function changeSetToSql(changeSet: ChangeSet, dbinfo: DatabaseInfo): Command[] { return _.compact( _.flatten([ - ...(changeSet.inserts.map(item => insertToSql(item, dbinfo)) as any), - ...changeSet.updates.map(updateToSql), - ...changeSet.deletes.map(deleteToSql), + ...(changeSet.inserts.map(item => changeSetInsertToSql(item, dbinfo)) as any), + ...changeSet.updates.map(changeSetUpdateToSql), + ...changeSet.deletes.map(changeSetDeleteToSql), ]) ); } -export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): ChangeSetDeleteCascade[] { - const res: ChangeSetDeleteCascade[] = []; - const allForeignKeys = _.flatten(dbinfo.tables.map(x => x.foreignKeys)); - for (const baseCmd of changeSet.deletes) { - const table = dbinfo.tables.find(x => x.pureName == baseCmd.pureName && x.schemaName == baseCmd.schemaName); - if (!table.primaryKey) continue; - const dependencies = allForeignKeys.filter( - x => x.refSchemaName == table.schemaName && x.refTableName == table.pureName - ); - for (const fk of dependencies) { - const refCmd: Delete = { - commandType: 'delete', - from: { - name: { - pureName: fk.pureName, - schemaName: fk.schemaName, - }, - }, - where: { - conditionType: 'exists', - subQuery: { - commandType: 'select', - from: { - name: { - pureName: fk.pureName, - schemaName: fk.schemaName, - }, - alias: 't1', - relations: [ - { - joinType: 'INNER JOIN', - alias: 't2', - name: { - pureName: fk.refTableName, - schemaName: fk.refSchemaName, - }, - conditions: fk.columns.map(column => ({ - conditionType: 'binary', - operator: '=', - left: { - exprType: 'column', - columnName: column.columnName, - source: { alias: 't1' }, - }, - right: { - exprType: 'column', - columnName: column.refColumnName, - source: { alias: 't2' }, - }, - })), - }, - ], - }, - where: { - conditionType: 'and', - conditions: [ - extractCondition(baseCmd, 't2'), - // @ts-ignore - ...table.primaryKey.columns.map(column => ({ - conditionType: 'binary', - operator: '=', - left: { - exprType: 'column', - columnName: column.columnName, - source: { alias: 't1' }, - }, - right: { - exprType: 'column', - columnName: column.columnName, - source: { - name: { - pureName: fk.refTableName, - schemaName: fk.refSchemaName, - }, - }, - }, - })), - ], - }, - }, - }, - }; - let resItem = res.find(x => x.title == fk.pureName); - if (!resItem) { - resItem = { - title: fk.pureName, - commands: [], - }; - res.push(resItem); - } - resItem.commands.push(refCmd); - } - - let resItem = res.find(x => x.title == baseCmd.pureName); - if (!resItem) { - resItem = { - title: baseCmd.pureName, - commands: [], - }; - res.push(resItem); - } - - resItem.commands.push(deleteToSql(baseCmd)); - } - - return res; -} - export function revertChangeSetRowChanges(changeSet: ChangeSet, definition: ChangeSetRowDefinition): ChangeSet { // console.log('definition', definition); const [field, item] = findExistingChangeSetItem(changeSet, definition); diff --git a/packages/datalib/src/deleteCascade.ts b/packages/datalib/src/deleteCascade.ts new file mode 100644 index 000000000..d4c09fcb8 --- /dev/null +++ b/packages/datalib/src/deleteCascade.ts @@ -0,0 +1,117 @@ +import _ from 'lodash'; +import { Command, Insert, Update, Delete, UpdateField, Condition, AllowIdentityInsert } from 'dbgate-sqltree'; +import { NamedObjectInfo, DatabaseInfo } from 'dbgate-types'; +import { ChangeSet, extractChangeSetCondition, changeSetDeleteToSql } from './ChangeSet'; + +export interface ChangeSetDeleteCascade { + title: string; + commands: Command[]; +} + +export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): ChangeSetDeleteCascade[] { + const res: ChangeSetDeleteCascade[] = []; + const allForeignKeys = _.flatten(dbinfo.tables.map(x => x.foreignKeys)); + for (const baseCmd of changeSet.deletes) { + const table = dbinfo.tables.find(x => x.pureName == baseCmd.pureName && x.schemaName == baseCmd.schemaName); + if (!table.primaryKey) continue; + const dependencies = allForeignKeys.filter( + x => x.refSchemaName == table.schemaName && x.refTableName == table.pureName + ); + for (const fk of dependencies) { + const refCmd: Delete = { + commandType: 'delete', + from: { + name: { + pureName: fk.pureName, + schemaName: fk.schemaName, + }, + }, + where: { + conditionType: 'exists', + subQuery: { + commandType: 'select', + from: { + name: { + pureName: fk.pureName, + schemaName: fk.schemaName, + }, + alias: 't1', + relations: [ + { + joinType: 'INNER JOIN', + alias: 't2', + name: { + pureName: fk.refTableName, + schemaName: fk.refSchemaName, + }, + conditions: fk.columns.map(column => ({ + conditionType: 'binary', + operator: '=', + left: { + exprType: 'column', + columnName: column.columnName, + source: { alias: 't1' }, + }, + right: { + exprType: 'column', + columnName: column.refColumnName, + source: { alias: 't2' }, + }, + })), + }, + ], + }, + where: { + conditionType: 'and', + conditions: [ + extractChangeSetCondition(baseCmd, 't2'), + // @ts-ignore + ...table.primaryKey.columns.map(column => ({ + conditionType: 'binary', + operator: '=', + left: { + exprType: 'column', + columnName: column.columnName, + source: { alias: 't1' }, + }, + right: { + exprType: 'column', + columnName: column.columnName, + source: { + name: { + pureName: fk.refTableName, + schemaName: fk.refSchemaName, + }, + }, + }, + })), + ], + }, + }, + }, + }; + let resItem = res.find(x => x.title == fk.pureName); + if (!resItem) { + resItem = { + title: fk.pureName, + commands: [], + }; + res.push(resItem); + } + resItem.commands.push(refCmd); + } + + let resItem = res.find(x => x.title == baseCmd.pureName); + if (!resItem) { + resItem = { + title: baseCmd.pureName, + commands: [], + }; + res.push(resItem); + } + + resItem.commands.push(changeSetDeleteToSql(baseCmd)); + } + + return res; +} diff --git a/packages/datalib/src/index.ts b/packages/datalib/src/index.ts index b29344daf..7bff4808e 100644 --- a/packages/datalib/src/index.ts +++ b/packages/datalib/src/index.ts @@ -11,3 +11,4 @@ export * from './runMacro'; export * from './FormViewDisplay'; export * from './TableFormViewDisplay'; export * from './CollectionGridDisplay'; +export * from './deleteCascade'; From 2df98c610ad88ad3a5a3cfb0b83959c7dc7782fc Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 18:14:47 +0200 Subject: [PATCH 24/33] upgraded dependencies --- packages/web/package.json | 14 +++--- yarn.lock | 100 +++++++++++++++++++++++++++++--------- 2 files changed, 83 insertions(+), 31 deletions(-) diff --git a/packages/web/package.json b/packages/web/package.json index 03d07e2a3..6fb18471c 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -14,10 +14,10 @@ "devDependencies": { "@ant-design/colors": "^5.0.0", "@mdi/font": "^5.9.55", - "@rollup/plugin-commonjs": "^17.0.0", - "@rollup/plugin-node-resolve": "^11.0.0", - "@rollup/plugin-replace": "^2.4.1", - "@rollup/plugin-typescript": "^6.0.0", + "@rollup/plugin-commonjs": "^20.0.0", + "@rollup/plugin-node-resolve": "^13.0.5", + "@rollup/plugin-replace": "^3.0.0", + "@rollup/plugin-typescript": "^8.2.5", "@tsconfig/svelte": "^1.0.0", "ace-builds": "^1.4.8", "chart.js": "^2.9.4", @@ -32,7 +32,7 @@ "lodash": "^4.17.21", "randomcolor": "^0.6.2", "resize-observer-polyfill": "^1.5.1", - "rollup": "^2.3.4", + "rollup": "^2.57.0", "rollup-plugin-copy": "^3.3.0", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-livereload": "^2.0.0", @@ -44,9 +44,9 @@ "svelte": "^3.43.0", "svelte-check": "^1.0.0", "svelte-markdown": "^0.1.4", - "svelte-preprocess": "^4.0.0", + "svelte-preprocess": "^4.9.5", "svelte-select": "^3.17.0", - "tslib": "^2.0.0", + "tslib": "^2.3.1", "typescript": "^4.4.3", "uuid": "^3.4.0" } diff --git a/yarn.lock b/yarn.lock index 9534ce491..5cd151926 100644 --- a/yarn.lock +++ b/yarn.lock @@ -942,10 +942,10 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz#aeb16f50649a91af79dbe36574b66d0f9e4d9f71" integrity sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA== -"@rollup/plugin-commonjs@^17.0.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz#757ec88737dffa8aa913eb392fade2e45aef2a2d" - integrity sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew== +"@rollup/plugin-commonjs@^20.0.0": + version "20.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz#3246872dcbcb18a54aaa6277a8c7d7f1b155b745" + integrity sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg== dependencies: "@rollup/pluginutils" "^3.1.0" commondir "^1.0.1" @@ -955,10 +955,10 @@ magic-string "^0.25.7" resolve "^1.17.0" -"@rollup/plugin-node-resolve@^11.0.0": - version "11.2.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.0.tgz#a5ab88c35bb7622d115f44984dee305112b6f714" - integrity sha512-qHjNIKYt5pCcn+5RUBQxK8krhRvf1HnyVgUCcFFcweDS7fhkOLZeYh0mhHK6Ery8/bb9tvN/ubPzmfF0qjDCTA== +"@rollup/plugin-node-resolve@^13.0.5": + version "13.0.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.5.tgz#016abe58796a4ff544d6beac7818921e3d3777fc" + integrity sha512-mVaw6uxtvuGx/XCI4qBQXsDZJUfyx5vp39iE0J/7Hd6wDhEbjHr6aES7Nr9yWbuE0BY+oKp6N7Bq6jX5NCGNmQ== dependencies: "@rollup/pluginutils" "^3.1.0" "@types/resolve" "1.17.1" @@ -967,18 +967,18 @@ is-module "^1.0.0" resolve "^1.19.0" -"@rollup/plugin-replace@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.1.tgz#c411b5ab72809fb1bfc8b487d8d02eef661460d3" - integrity sha512-XwC1oK5rrtRJ0tn1ioLHS6OV5JTluJF7QE1J/q1hN3bquwjnVxjtMyY9iCnoyH9DQbf92CxajB3o98wZbP3oAQ== +"@rollup/plugin-replace@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-3.0.0.tgz#3a4c9665d4e7a4ce2c360cf021232784892f3fac" + integrity sha512-3c7JCbMuYXM4PbPWT4+m/4Y6U60SgsnDT/cCyAyUKwFHg7pTSfsSQzIpETha3a3ig6OdOKzZz87D9ZXIK3qsDg== dependencies: "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" -"@rollup/plugin-typescript@^6.0.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-6.1.0.tgz#289e7f0ea12fd659bd13ad59dda73b9055538b83" - integrity sha512-hJxaiE6WyNOsK+fZpbFh9CUijZYqPQuAOWO5khaGTUkM8DYNNyA2TDlgamecE+qLOG1G1+CwbWMAx3rbqpp6xQ== +"@rollup/plugin-typescript@^8.2.5": + version "8.2.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz#e0319761b2b5105615e5a0c371ae05bc2984b7de" + integrity sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ== dependencies: "@rollup/pluginutils" "^3.1.0" resolve "^1.17.0" @@ -2305,6 +2305,11 @@ bson@^1.1.4: resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a" integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== +buffer-crc32@^0.2.5: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -3700,6 +3705,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^3.1.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -4443,7 +4453,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@^2.3.2, fsevents@~2.3.1: +fsevents@^2.3.2, fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -4710,6 +4720,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.1.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + graceful-fs@^4.2.3, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" @@ -9025,7 +9040,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9097,12 +9112,12 @@ rollup-pluginutils@^2.8.2: dependencies: estree-walker "^0.6.1" -rollup@^2.3.4: - version "2.39.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.39.0.tgz#be4f98c9e421793a8fec82c854fb567c35e22ab6" - integrity sha512-+WR3bttcq7zE+BntH09UxaW3bQo3vItuYeLsyk4dL2tuwbeSKJuvwiawyhEnvRdRgrII0Uzk00FpctHO/zB1kw== +rollup@^2.57.0: + version "2.57.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.57.0.tgz#c1694475eb22e1022477c0f4635fd0ac80713173" + integrity sha512-bKQIh1rWKofRee6mv8SrF2HdP6pea5QkwBZSMImJysFj39gQuiV8MEPBjXOCpzk3wSYp63M2v2wkWBmFC8O/rg== optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" rsvp@^4.8.4: version "4.8.5" @@ -9166,6 +9181,16 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sander@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + integrity sha1-dB4kXiMfB8r7b98PEzrfohalAq0= + dependencies: + es6-promise "^3.1.2" + graceful-fs "^4.1.3" + mkdirp "^0.5.1" + rimraf "^2.5.2" + sane@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" @@ -9550,6 +9575,16 @@ socks@^2.3.3: ip "^1.1.5" smart-buffer "^4.1.0" +sorcery@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/sorcery/-/sorcery-0.10.0.tgz#8ae90ad7d7cb05fc59f1ab0c637845d5c15a52b7" + integrity sha1-iukK19fLBfxZ8asMY3hF1cFaUrc= + dependencies: + buffer-crc32 "^0.2.5" + minimist "^1.2.0" + sander "^0.5.0" + sourcemap-codec "^1.3.0" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -9602,7 +9637,7 @@ source-map@^0.7.3, source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sourcemap-codec@^1.4.4: +sourcemap-codec@^1.3.0, sourcemap-codec@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -10064,6 +10099,18 @@ svelte-preprocess@^4.0.0: detect-indent "^6.0.0" strip-indent "^3.0.0" +svelte-preprocess@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.9.5.tgz#e11bdf3fcdacbd90188cdf29a7371030991f9eba" + integrity sha512-RbJbtuwKbuZq9RyzlljZUmmFNaojrg/zUEyDrS8io7haTcuITQmE4NERx8qiqHreApo6cQst5Qtp4MxUwr58Ew== + dependencies: + "@types/pug" "^2.0.4" + "@types/sass" "^1.16.0" + detect-indent "^6.0.0" + magic-string "^0.25.7" + sorcery "^0.10.0" + strip-indent "^3.0.0" + svelte-select@^3.17.0: version "3.17.0" resolved "https://registry.yarnpkg.com/svelte-select/-/svelte-select-3.17.0.tgz#6bea0cb8d0c9465d28a2bac562f2de8a61f48a9f" @@ -10456,6 +10503,11 @@ tslib@^2.0.0, tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== +tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" From 571be4b3f97545f17b7f0ee106aab0d8f7ab60b0 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 19:03:53 +0200 Subject: [PATCH 25/33] recursive delete cascade --- packages/datalib/src/ChangeSet.ts | 2 +- packages/datalib/src/deleteCascade.ts | 217 ++++++++++-------- .../web/src/modals/ConfirmSqlModal.svelte | 55 +++-- 3 files changed, 153 insertions(+), 121 deletions(-) diff --git a/packages/datalib/src/ChangeSet.ts b/packages/datalib/src/ChangeSet.ts index 5fd2cfe7b..a9a7011b8 100644 --- a/packages/datalib/src/ChangeSet.ts +++ b/packages/datalib/src/ChangeSet.ts @@ -300,7 +300,7 @@ function changeSetUpdateToSql(item: ChangeSetItem): Update { }; } -export function changeSetDeleteToSql(item: ChangeSetItem): Delete { +function changeSetDeleteToSql(item: ChangeSetItem): Delete { return { from: { name: { diff --git a/packages/datalib/src/deleteCascade.ts b/packages/datalib/src/deleteCascade.ts index d4c09fcb8..781582753 100644 --- a/packages/datalib/src/deleteCascade.ts +++ b/packages/datalib/src/deleteCascade.ts @@ -1,117 +1,136 @@ import _ from 'lodash'; import { Command, Insert, Update, Delete, UpdateField, Condition, AllowIdentityInsert } from 'dbgate-sqltree'; -import { NamedObjectInfo, DatabaseInfo } from 'dbgate-types'; -import { ChangeSet, extractChangeSetCondition, changeSetDeleteToSql } from './ChangeSet'; +import { NamedObjectInfo, DatabaseInfo, ForeignKeyInfo, TableInfo } from 'dbgate-types'; +import { ChangeSet, ChangeSetItem, extractChangeSetCondition } from './ChangeSet'; export interface ChangeSetDeleteCascade { title: string; commands: Command[]; } +// function getDeleteScript() + +function processDependencies( + changeSet: ChangeSet, + result: ChangeSetDeleteCascade[], + allForeignKeys: ForeignKeyInfo[], + fkPath: ForeignKeyInfo[], + table: TableInfo, + baseCmd: ChangeSetItem, + dbinfo: DatabaseInfo +) { + const dependencies = allForeignKeys.filter( + x => x.refSchemaName == table.schemaName && x.refTableName == table.pureName + ); + + for (const fk of dependencies) { + if (fk.pureName == baseCmd.pureName) continue; + if (result.find(x => x.title == fk.pureName)) continue; + + const depTable = dbinfo.tables.find(x => x.pureName == fk.pureName && x.schemaName == fk.schemaName); + const subFkPath = [...fkPath, fk]; + if (depTable) { + processDependencies(changeSet, result, allForeignKeys, subFkPath, depTable, baseCmd, dbinfo); + } + + const refCmd: Delete = { + commandType: 'delete', + from: { + name: { + pureName: fk.pureName, + schemaName: fk.schemaName, + }, + }, + where: { + conditionType: 'exists', + subQuery: { + commandType: 'select', + from: { + name: { + pureName: fk.pureName, + schemaName: fk.schemaName, + }, + alias: 't0', + relations: subFkPath.map((fkItem, fkIndex) => ({ + joinType: 'INNER JOIN', + alias: `t${fkIndex + 1}`, + name: { + pureName: fkItem.refTableName, + schemaName: fkItem.refSchemaName, + }, + conditions: fkItem.columns.map(column => ({ + conditionType: 'binary', + operator: '=', + left: { + exprType: 'column', + columnName: column.columnName, + source: { alias: `t${fkIndex}` }, + }, + right: { + exprType: 'column', + columnName: column.refColumnName, + source: { alias: `t${fkIndex + 1}` }, + }, + })), + })), + }, + where: { + conditionType: 'and', + conditions: [ + extractChangeSetCondition(baseCmd, `t${subFkPath.length}`), + // @ts-ignore + ...table.primaryKey.columns.map(column => ({ + conditionType: 'binary', + operator: '=', + left: { + exprType: 'column', + columnName: column.columnName, + source: { alias: 't0' }, + }, + right: { + exprType: 'column', + columnName: column.columnName, + source: { + name: fk, + }, + }, + })), + ], + }, + }, + }, + }; + let resItem = result.find(x => x.title == fk.pureName); + if (!resItem) { + resItem = { + title: fk.pureName, + commands: [], + }; + result.push(resItem); + } + resItem.commands.push(refCmd); + } +} + export function getDeleteCascades(changeSet: ChangeSet, dbinfo: DatabaseInfo): ChangeSetDeleteCascade[] { - const res: ChangeSetDeleteCascade[] = []; + const result: ChangeSetDeleteCascade[] = []; const allForeignKeys = _.flatten(dbinfo.tables.map(x => x.foreignKeys)); for (const baseCmd of changeSet.deletes) { const table = dbinfo.tables.find(x => x.pureName == baseCmd.pureName && x.schemaName == baseCmd.schemaName); if (!table.primaryKey) continue; - const dependencies = allForeignKeys.filter( - x => x.refSchemaName == table.schemaName && x.refTableName == table.pureName - ); - for (const fk of dependencies) { - const refCmd: Delete = { - commandType: 'delete', - from: { - name: { - pureName: fk.pureName, - schemaName: fk.schemaName, - }, - }, - where: { - conditionType: 'exists', - subQuery: { - commandType: 'select', - from: { - name: { - pureName: fk.pureName, - schemaName: fk.schemaName, - }, - alias: 't1', - relations: [ - { - joinType: 'INNER JOIN', - alias: 't2', - name: { - pureName: fk.refTableName, - schemaName: fk.refSchemaName, - }, - conditions: fk.columns.map(column => ({ - conditionType: 'binary', - operator: '=', - left: { - exprType: 'column', - columnName: column.columnName, - source: { alias: 't1' }, - }, - right: { - exprType: 'column', - columnName: column.refColumnName, - source: { alias: 't2' }, - }, - })), - }, - ], - }, - where: { - conditionType: 'and', - conditions: [ - extractChangeSetCondition(baseCmd, 't2'), - // @ts-ignore - ...table.primaryKey.columns.map(column => ({ - conditionType: 'binary', - operator: '=', - left: { - exprType: 'column', - columnName: column.columnName, - source: { alias: 't1' }, - }, - right: { - exprType: 'column', - columnName: column.columnName, - source: { - name: { - pureName: fk.refTableName, - schemaName: fk.refSchemaName, - }, - }, - }, - })), - ], - }, - }, - }, - }; - let resItem = res.find(x => x.title == fk.pureName); - if (!resItem) { - resItem = { - title: fk.pureName, - commands: [], - }; - res.push(resItem); - } - resItem.commands.push(refCmd); - } - let resItem = res.find(x => x.title == baseCmd.pureName); - if (!resItem) { - resItem = { - title: baseCmd.pureName, - commands: [], - }; - res.push(resItem); - } + processDependencies(changeSet, result, allForeignKeys, [], table, baseCmd, dbinfo); - resItem.commands.push(changeSetDeleteToSql(baseCmd)); + // let resItem = result.find(x => x.title == baseCmd.pureName); + // if (!resItem) { + // resItem = { + // title: baseCmd.pureName, + // commands: [], + // }; + // result.push(resItem); + // } + // resItem.commands.push(changeSetDeleteToSql(baseCmd)); } - return res; + return result; } diff --git a/packages/web/src/modals/ConfirmSqlModal.svelte b/packages/web/src/modals/ConfirmSqlModal.svelte index a7bef44dd..76481f6e8 100644 --- a/packages/web/src/modals/ConfirmSqlModal.svelte +++ b/packages/web/src/modals/ConfirmSqlModal.svelte @@ -32,10 +32,12 @@ values[`deleteReferences_${title}`] !== false) - .map(({ script, title }) => script) - .join('\n') + ? [ + ...deleteCascadesScripts + .filter(({ script, title }) => values[`deleteReferences_${title}`] !== false) + .map(({ script, title }) => script), + sql, + ].join('\n') : sql} readOnly /> @@ -43,23 +45,32 @@
{#if !_.isEmpty(deleteCascadesScripts)} - +
+ +
{/if} {#if values.deleteReferencesCascade} - {#each _.sortBy(deleteCascadesScripts, 'title') as deleteTable} - - {/each} + + +
+ {#each _.sortBy(deleteCascadesScripts, 'title') as deleteTable} +
+ +
+ {/each} +
{/if}
@@ -86,10 +97,12 @@ closeCurrentModal(); onConfirm( e.detail.deleteReferencesCascade - ? deleteCascadesScripts - .filter(({ script, title }) => e.detail[`deleteReferences_${title}`] !== false) - .map(({ script, title }) => script) - .join('\n') + ? [ + ...deleteCascadesScripts + .filter(({ script, title }) => e.detail[`deleteReferences_${title}`] !== false) + .map(({ script, title }) => script), + sql, + ].join('\n') : null ); }} From 2ef81942db1896e9c563858bfbba7e3e802608d2 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 19:17:38 +0200 Subject: [PATCH 26/33] delete cascade --- packages/datalib/src/deleteCascade.ts | 1 + .../web/src/modals/ConfirmSqlModal.svelte | 130 ++++++++++-------- packages/web/src/tabs/TableDataTab.svelte | 2 +- 3 files changed, 74 insertions(+), 59 deletions(-) diff --git a/packages/datalib/src/deleteCascade.ts b/packages/datalib/src/deleteCascade.ts index 781582753..598e29f0e 100644 --- a/packages/datalib/src/deleteCascade.ts +++ b/packages/datalib/src/deleteCascade.ts @@ -45,6 +45,7 @@ function processDependencies( conditionType: 'exists', subQuery: { commandType: 'select', + selectAll: true, from: { name: { pureName: fk.pureName, diff --git a/packages/web/src/modals/ConfirmSqlModal.svelte b/packages/web/src/modals/ConfirmSqlModal.svelte index 76481f6e8..49f861aac 100644 --- a/packages/web/src/modals/ConfirmSqlModal.svelte +++ b/packages/web/src/modals/ConfirmSqlModal.svelte @@ -1,11 +1,10 @@ - +
Save changes
- - values[`deleteReferences_${title}`] !== false) - .map(({ script, title }) => script), - sql, - ].join('\n') - : sql} - readOnly - /> - + $values[`deleteReferencesFor_${title}`] !== false) + .map(({ script, title }) => script), + sql, + ].join('\n') + : sql} + readOnly + />
{#if !_.isEmpty(deleteCascadesScripts)} @@ -54,25 +52,39 @@
{/if} - - {#if values.deleteReferencesCascade} - + {#if $values.deleteReferencesCascade} +
+ { + $values = _.omitBy($values, (v, k) => k.startsWith('deleteReferencesFor_')); + }} + /> + { + const newValues = { ...$values }; + for (const item of deleteCascadesScripts) { + newValues[`deleteReferencesFor_${item.title}`] = false; + } + $values = newValues; + }} + /> +
-
- {#each _.sortBy(deleteCascadesScripts, 'title') as deleteTable} -
- -
- {/each} -
- {/if} -
+
+ {#each _.sortBy(deleteCascadesScripts, 'title') as deleteTable} +
+ +
+ {/each} +
+ {/if} {#if isRecreated}
@@ -89,29 +101,27 @@ {/if}
- - { - closeCurrentModal(); - onConfirm( - e.detail.deleteReferencesCascade - ? [ - ...deleteCascadesScripts - .filter(({ script, title }) => e.detail[`deleteReferences_${title}`] !== false) - .map(({ script, title }) => script), - sql, - ].join('\n') - : null - ); - }} - /> - - + { + closeCurrentModal(); + onConfirm( + e.detail.deleteReferencesCascade + ? [ + ...deleteCascadesScripts + .filter(({ script, title }) => e.detail[`deleteReferencesFor_${title}`] !== false) + .map(({ script, title }) => script), + sql, + ].join('\n') + : null + ); + }} + /> +
- + diff --git a/packages/web/src/tabs/TableDataTab.svelte b/packages/web/src/tabs/TableDataTab.svelte index ad78b102e..5e2351c57 100644 --- a/packages/web/src/tabs/TableDataTab.svelte +++ b/packages/web/src/tabs/TableDataTab.svelte @@ -97,7 +97,7 @@ console.log('deleteCascadesScripts', deleteCascadesScripts); showModal(ConfirmSqlModal, { sql, - onConfirm: () => handleConfirmSql(sql), + onConfirm: sqlOverride => handleConfirmSql(sqlOverride || sql), engine: driver.engine, deleteCascadesScripts, }); From 5ae33a320cf95706a4ccf7e0dc8f9c4de29db2fe Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 19:17:57 +0200 Subject: [PATCH 27/33] v4.3.1-beta.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1841e4db4..7d84531af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "4.3.1-beta.1", + "version": "4.3.1-beta.2", "name": "dbgate-all", "workspaces": [ "packages/*", From a1bf7ddb5016ea74b112b1246fd550e6600b2f69 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 19:46:23 +0200 Subject: [PATCH 28/33] fix --- packages/datalib/src/deleteCascade.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/datalib/src/deleteCascade.ts b/packages/datalib/src/deleteCascade.ts index 598e29f0e..b93241056 100644 --- a/packages/datalib/src/deleteCascade.ts +++ b/packages/datalib/src/deleteCascade.ts @@ -19,17 +19,16 @@ function processDependencies( baseCmd: ChangeSetItem, dbinfo: DatabaseInfo ) { + if (result.find(x => x.title == table.pureName)) return; + const dependencies = allForeignKeys.filter( x => x.refSchemaName == table.schemaName && x.refTableName == table.pureName ); for (const fk of dependencies) { - if (fk.pureName == baseCmd.pureName) continue; - if (result.find(x => x.title == fk.pureName)) continue; - const depTable = dbinfo.tables.find(x => x.pureName == fk.pureName && x.schemaName == fk.schemaName); const subFkPath = [...fkPath, fk]; - if (depTable) { + if (depTable && depTable.pureName != baseCmd.pureName) { processDependencies(changeSet, result, allForeignKeys, subFkPath, depTable, baseCmd, dbinfo); } From 97215e31e9293e4d27b173c52a6fc564dda62e38 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 28 Sep 2021 19:46:39 +0200 Subject: [PATCH 29/33] v4.3.1-beta.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d84531af..74e13cfbf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "4.3.1-beta.2", + "version": "4.3.1-beta.3", "name": "dbgate-all", "workspaces": [ "packages/*", From 99876e31588e7a3289087d0eef82d285e9cef825 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Wed, 29 Sep 2021 20:55:34 +0200 Subject: [PATCH 30/33] fixed regression - broken select tag, because of Svelte upgrade --- packages/web/src/forms/SelectField.svelte | 6 ++++-- packages/web/src/modals/ConnectionModalDriverFields.svelte | 3 +-- packages/web/src/modals/SetFilterModal_Select.svelte | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/web/src/forms/SelectField.svelte b/packages/web/src/forms/SelectField.svelte index daa7dedf5..9c72e09a0 100644 --- a/packages/web/src/forms/SelectField.svelte +++ b/packages/web/src/forms/SelectField.svelte @@ -10,6 +10,7 @@ export let isNative = false; export let isMulti = false; export let notSelected = null; + export let defaultValue = ''; let listOpen = false; let isFocused = false; @@ -21,18 +22,19 @@ {#if isNative}