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"