From 0b13850ecae3efe18f03f15b41d60be420639455 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Thu, 10 Oct 2024 13:09:34 +0200 Subject: [PATCH] query parameters #913 --- packages/api/package.json | 2 +- packages/tools/package.json | 2 +- packages/web/package.json | 2 +- packages/web/src/icons/FontIcon.svelte | 2 + .../src/modals/QueryParametersModal.svelte | 39 ++++++++++ packages/web/src/tabs/QueryTab.svelte | 72 +++++++++++++++++++ plugins/dbgate-plugin-mongo/package.json | 2 +- plugins/dbgate-plugin-mssql/package.json | 2 +- plugins/dbgate-plugin-mysql/package.json | 2 +- plugins/dbgate-plugin-oracle/package.json | 2 +- plugins/dbgate-plugin-postgres/package.json | 2 +- plugins/dbgate-plugin-redis/package.json | 2 +- plugins/dbgate-plugin-sqlite/package.json | 2 +- yarn.lock | 8 +-- 14 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 packages/web/src/modals/QueryParametersModal.svelte diff --git a/packages/api/package.json b/packages/api/package.json index a9295f354..991c8611c 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -28,7 +28,7 @@ "cors": "^2.8.5", "cross-env": "^6.0.3", "dbgate-datalib": "^5.0.0-alpha.1", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-sqltree": "^5.0.0-alpha.1", "dbgate-tools": "^5.0.0-alpha.1", "debug": "^4.3.4", diff --git a/packages/tools/package.json b/packages/tools/package.json index bf6bf7647..e36901ee0 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -31,7 +31,7 @@ "typescript": "^4.4.3" }, "dependencies": { - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-sqltree": "^5.0.0-alpha.1", "debug": "^4.3.4", "json-stable-stringify": "^1.0.1", diff --git a/packages/web/package.json b/packages/web/package.json index 5a451bc62..b54816efc 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -25,7 +25,7 @@ "chartjs-adapter-moment": "^1.0.0", "cross-env": "^7.0.3", "dbgate-datalib": "^5.0.0-alpha.1", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-sqltree": "^5.0.0-alpha.1", "dbgate-tools": "^5.0.0-alpha.1", "dbgate-types": "^5.0.0-alpha.1", diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 14416be2d..5aeca271f 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -199,6 +199,8 @@ 'icon type-null': 'mdi mdi-code-equal', 'icon type-unknown': 'mdi mdi-help-box', + 'icon at': 'mdi mdi-at', + 'img ok': 'mdi mdi-check-circle color-icon-green', 'img ok-inv': 'mdi mdi-check-circle color-icon-inv-green', 'img alert': 'mdi mdi-alert-circle color-icon-blue', diff --git a/packages/web/src/modals/QueryParametersModal.svelte b/packages/web/src/modals/QueryParametersModal.svelte new file mode 100644 index 000000000..56a6610d3 --- /dev/null +++ b/packages/web/src/modals/QueryParametersModal.svelte @@ -0,0 +1,39 @@ + + + + + Edit query parameters + + {#each parameterNames as parameterName, index} + + {/each} + + + + + + diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index 3ec0ed36d..45956a0ef 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -86,6 +86,9 @@ import ToolStripSaveButton from '../buttons/ToolStripSaveButton.svelte'; import ToolStripCommandSplitButton from '../buttons/ToolStripCommandSplitButton.svelte'; import { getClipboardText } from '../utility/clipboard'; + import ToolStripDropDownButton from '../buttons/ToolStripDropDownButton.svelte'; + import { extractQueryParameters, replaceQueryParameters } from 'dbgate-query-splitter'; + import QueryParametersModal from '../modals/QueryParametersModal.svelte'; export let tabid; export let conid; @@ -94,6 +97,33 @@ export const activator = createActivator('QueryTab', false); + const QUERY_PARAMETER_STYLES = [ + { + value: '', + text: '(no parameters)', + }, + { + value: '?', + text: '? (positional)', + }, + { + value: '@', + text: '@variable', + }, + { + value: ':', + text: ':variable', + }, + { + value: '$', + text: '$variable', + }, + { + value: '#', + text: '#variable', + }, + ]; + const tabVisible: any = getContext('tabVisible'); const timerLabel = useTimerLabel(); @@ -179,8 +209,38 @@ visibleResultTabs = !visibleResultTabs; } + function getParameterSplitterOptions() { + if (!queryParameterStyle) { + return null; + } + + if (!driver) { + return null; + } + + return { ...driver.getQuerySplitterOptions('editor'), queryParameterStyle }; + } + async function executeCore(sql, startLine = 0) { if (busy) return; + + const parameters = extractQueryParameters(sql, getParameterSplitterOptions()); + + if (parameters.length > 0) { + showModal(QueryParametersModal, { + parameterNames: parameters, + parameterValues: parameters.reduce((acc, x) => ({ ...acc, [x]: '' }), {}), + onExecute: values => { + const newSql = replaceQueryParameters(sql, values, getParameterSplitterOptions()); + executeCoreWithParams(newSql, startLine); + }, + }); + } else { + executeCoreWithParams(sql, startLine); + } + } + + async function executeCoreWithParams(sql, startLine = 0) { if (!sql || !sql.trim()) { showSnackbarError('Skipped executing empty query'); return; @@ -349,6 +409,7 @@ } let isInitialized = false; + let queryParameterStyle = ':'; @@ -421,6 +482,17 @@ {#if resultCount == 1} {/if} + + QUERY_PARAMETER_STYLES.map(param => ({ + label: param.text, + onClick: () => { + queryParameterStyle = param.value; + }, + }))} + label={QUERY_PARAMETER_STYLES.find(x => x.value == queryParameterStyle)?.text} + icon="icon at" + /> diff --git a/plugins/dbgate-plugin-mongo/package.json b/plugins/dbgate-plugin-mongo/package.json index f2b8ca04e..f12580424 100644 --- a/plugins/dbgate-plugin-mongo/package.json +++ b/plugins/dbgate-plugin-mongo/package.json @@ -33,7 +33,7 @@ "devDependencies": { "bson": "^6.8.0", "dbgate-plugin-tools": "^1.0.7", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-tools": "^5.0.0-alpha.1", "is-promise": "^4.0.0", "lodash": "^4.17.21", diff --git a/plugins/dbgate-plugin-mssql/package.json b/plugins/dbgate-plugin-mssql/package.json index d3181a7e7..ea4d980b8 100644 --- a/plugins/dbgate-plugin-mssql/package.json +++ b/plugins/dbgate-plugin-mssql/package.json @@ -33,7 +33,7 @@ "devDependencies": { "async-lock": "^1.2.6", "dbgate-plugin-tools": "^1.0.7", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-tools": "^5.0.0-alpha.1", "tedious": "^18.2.0", "webpack": "^5.91.0", diff --git a/plugins/dbgate-plugin-mysql/package.json b/plugins/dbgate-plugin-mysql/package.json index 651ab334c..1c01475ce 100644 --- a/plugins/dbgate-plugin-mysql/package.json +++ b/plugins/dbgate-plugin-mysql/package.json @@ -33,7 +33,7 @@ "devDependencies": { "antares-mysql-dumper": "^0.0.1", "dbgate-plugin-tools": "^1.0.7", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-tools": "^5.0.0-alpha.1", "mysql2": "^3.11.3", "webpack": "^5.91.0", diff --git a/plugins/dbgate-plugin-oracle/package.json b/plugins/dbgate-plugin-oracle/package.json index 75e241c28..8db9248f5 100644 --- a/plugins/dbgate-plugin-oracle/package.json +++ b/plugins/dbgate-plugin-oracle/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "dbgate-plugin-tools": "^1.0.8", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-tools": "^5.0.0-alpha.1", "lodash": "^4.17.21", "webpack": "^5.91.0", diff --git a/plugins/dbgate-plugin-postgres/package.json b/plugins/dbgate-plugin-postgres/package.json index 4dbd569e7..3b80049c0 100644 --- a/plugins/dbgate-plugin-postgres/package.json +++ b/plugins/dbgate-plugin-postgres/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "dbgate-plugin-tools": "^1.0.7", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-tools": "^5.0.0-alpha.1", "lodash": "^4.17.21", "pg": "^8.11.5", diff --git a/plugins/dbgate-plugin-redis/package.json b/plugins/dbgate-plugin-redis/package.json index 6be782def..d49c3d575 100644 --- a/plugins/dbgate-plugin-redis/package.json +++ b/plugins/dbgate-plugin-redis/package.json @@ -30,7 +30,7 @@ }, "devDependencies": { "dbgate-plugin-tools": "^1.0.7", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "dbgate-tools": "^5.0.0-alpha.1", "lodash": "^4.17.21", "webpack": "^5.91.0", diff --git a/plugins/dbgate-plugin-sqlite/package.json b/plugins/dbgate-plugin-sqlite/package.json index a12c759e3..850d62a6a 100644 --- a/plugins/dbgate-plugin-sqlite/package.json +++ b/plugins/dbgate-plugin-sqlite/package.json @@ -32,7 +32,7 @@ "devDependencies": { "dbgate-tools": "^5.0.0-alpha.1", "dbgate-plugin-tools": "^1.0.4", - "dbgate-query-splitter": "^4.10.5", + "dbgate-query-splitter": "^4.11.2", "byline": "^5.0.0", "webpack": "^5.91.0", "webpack-cli": "^5.1.4" diff --git a/yarn.lock b/yarn.lock index 731e20b4e..6eb67e0bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4129,10 +4129,10 @@ dbgate-plugin-xml@^5.0.0-alpha.1: resolved "https://registry.yarnpkg.com/dbgate-plugin-xml/-/dbgate-plugin-xml-5.2.7.tgz#0762af51ba6f100e75a63907ea6c679e827c9f7c" integrity sha512-gBXy4qetf7eJQW6lM01B+OKLnKB8MKesojdYKysD9oZ+YpQCX8Tq7aHJCrN14FiyIDinpX61kmFH1+LGJ2RkxQ== -dbgate-query-splitter@^4.10.5: - version "4.10.5" - resolved "https://registry.yarnpkg.com/dbgate-query-splitter/-/dbgate-query-splitter-4.10.5.tgz#bef9f2c2232b14aab6d3a0d490739ad216a1b45b" - integrity sha512-AWcKcU3hbS8rAYrA52bwzdwtLv1llZgJ7Ut8AVPVWm5i38J4EdRFA2nMnx4Y5GLPqA1SRSUFsjBsNWWaHa/BAg== +dbgate-query-splitter@^4.11.1: + version "4.11.1" + resolved "https://registry.yarnpkg.com/dbgate-query-splitter/-/dbgate-query-splitter-4.11.1.tgz#8bbf8e1d5bc1dbc7ca43be5cf7b7fa9ac0fed0c7" + integrity sha512-5qcSRmnTkdZFWy9m7iiE1PtaE0fkwFx0HuUV5M/EjF6susz1DXStg05rWvybK9y7Sgvu5SjQlV1C3cvsEnSNSw== debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9"