From e117caf70823cab6a3fd672663ed35b4347f2944 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 16 Jul 2022 07:21:23 +0200 Subject: [PATCH 01/20] typo --- packages/web/src/datagrid/DataGridCore.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 775df46ed..ae241f989 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -56,7 +56,7 @@ id: 'dataGrid.cloneRows', category: 'Data grid', name: 'Clone rows', - toolbarName: 'Clone', + toolbarName: 'Clone row(s)', keyText: 'CtrlOrCommand+Shift+C', testEnabled: () => getCurrentDataGrid()?.getGrider()?.editable, onClick: () => getCurrentDataGrid().cloneRows(), From c6e3b52bc60270e4699c31936893d23de5597a51 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 16 Jul 2022 07:21:35 +0200 Subject: [PATCH 02/20] v5.0.7-beta.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42c9040dc..609364fae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "5.0.7-beta.4", + "version": "5.0.7-beta.5", "name": "dbgate-all", "workspaces": [ "packages/*", From 8c934355abc4ed3e3ec2b1035429d702014e38db Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 16 Jul 2022 07:21:54 +0200 Subject: [PATCH 03/20] v5.0.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 609364fae..eefa19c26 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, - "version": "5.0.7-beta.5", + "version": "5.0.7", "name": "dbgate-all", "workspaces": [ "packages/*", From 01d1f08597226fb29f8d24a70f543b8f23d683eb Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 16 Jul 2022 07:28:43 +0200 Subject: [PATCH 04/20] changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f78fe074f..1cd2694a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,15 @@ Builds: - linux - application for linux - win - application for Windows +### 5.0.7 +- FIXED: Fixed some problems with SSH tunnel (upgraded SSH client) #315 +- FIXED: Fixed MognoDB executing find query #312 +- ADDED: Interval filters for date/time columns #311 +- ADDED: Ability to clone rows #309 +- ADDED: connecting option Trust server certificate for SQL Server #305 +- ADDED: Autorefresh, reload table every x second #303 +- FIXED(app): Changing editor theme and font size in Editor Themes #300 + ### 5.0.6 - ADDED: Search in columns - CHANGED: Upgraded mongodb driver From c368ad8d54ab8af130d722089e3854da9e493bfa Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 16 Jul 2022 11:41:08 +0200 Subject: [PATCH 05/20] support specifying windows domain #305 --- packages/web/src/settings/ConnectionDriverFields.svelte | 4 ++++ plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js | 5 +++-- plugins/dbgate-plugin-mssql/src/frontend/driver.js | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index cc5b04d77..997b78c7d 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -164,6 +164,10 @@ /> {/if} +{#if driver?.showConnectionField('windowsDomain', $values)} + +{/if} + {#if driver?.showConnectionField('isReadOnly', $values)} {/if} diff --git a/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js b/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js index 67f6a4ed6..56b467530 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js +++ b/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js @@ -22,7 +22,7 @@ function extractTediousColumns(columns, addDriverNativeColumn = false) { return res; } -async function tediousConnect({ server, port, user, password, database, ssl, trustServerCertificate }) { +async function tediousConnect({ server, port, user, password, database, ssl, trustServerCertificate, windowsDomnain }) { return new Promise((resolve, reject) => { const connectionOptions = { encrypt: !!ssl, @@ -43,10 +43,11 @@ async function tediousConnect({ server, port, user, password, database, ssl, tru server, authentication: { - type: 'default', + type: windowsDomnain ? 'ntlm' : 'default', options: { userName: user, password: password, + ...(windowsDomnain ? { domain: windowsDomnain } : {}), }, }, diff --git a/plugins/dbgate-plugin-mssql/src/frontend/driver.js b/plugins/dbgate-plugin-mssql/src/frontend/driver.js index f696916cc..14711e1fe 100644 --- a/plugins/dbgate-plugin-mssql/src/frontend/driver.js +++ b/plugins/dbgate-plugin-mssql/src/frontend/driver.js @@ -127,13 +127,16 @@ const driver = { ['authType', 'server', 'port', 'user', 'password', 'defaultDatabase', 'singleDatabase', 'isReadOnly'].includes( field ) || - (field == 'trustServerCertificate' && values.authType != 'sql' && values.authType != 'sspi'), + (field == 'trustServerCertificate' && values.authType != 'sql' && values.authType != 'sspi') || + (field == 'windowsDomain' && values.authType != 'sql' && values.authType != 'sspi'), + // (field == 'useDatabaseUrl' && values.authType != 'sql' && values.authType != 'sspi') getQuerySplitterOptions: () => mssqlSplitterOptions, engine: 'mssql@dbgate-plugin-mssql', title: 'Microsoft SQL Server', defaultPort: 1433, defaultAuthTypeName: 'tedious', + // databaseUrlPlaceholder: 'e.g. server=localhost&authentication.type=default&authentication.type.user=myuser&authentication.type.password=pwd&options.database=mydb', getNewObjectTemplates() { return [ From a4e5630f8902e522d3bc2e9d42c42e60cee61c07 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 16 Jul 2022 20:53:11 +0200 Subject: [PATCH 06/20] custom expressions in query designer #306 --- .../web/src/designer/DesignerQueryDumper.ts | 53 +++++++++++-------- packages/web/src/designer/types.ts | 2 + .../src/elements/QueryDesignColumns.svelte | 27 +++++++++- packages/web/src/elements/TableControl.svelte | 2 + 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/packages/web/src/designer/DesignerQueryDumper.ts b/packages/web/src/designer/DesignerQueryDumper.ts index d25bb2f22..6d367024b 100644 --- a/packages/web/src/designer/DesignerQueryDumper.ts +++ b/packages/web/src/designer/DesignerQueryDumper.ts @@ -8,6 +8,7 @@ import { mergeConditions, Source, ResultField, + Expression, } from 'dbgate-sqltree'; import { EngineDriver } from 'dbgate-types'; import { DesignerInfo, DesignerTableInfo, DesignerReferenceInfo, DesignerJoinType } from './types'; @@ -120,7 +121,7 @@ export class DesignerQueryDumper { select.having, _.cloneDeepWith(condition, expr => { if (expr.exprType == 'placeholder') { - return this.getColumnOutputExpression(column, selectIsGrouped); + return this.getColumnResultField(column, selectIsGrouped); } }) ); @@ -128,10 +129,29 @@ export class DesignerQueryDumper { } } - getColumnOutputExpression(col, selectIsGrouped): ResultField { + getColumnExpression(col): Expression { const source = findQuerySource(this.designer, col.designerId); + const { columnName, isCustomExpression, customExpression } = col; + + const res: Expression = isCustomExpression + ? { + exprType: 'raw', + sql: customExpression, + } + : { + exprType: 'column', + columnName, + source, + }; + return res; + } + + getColumnResultField(col, selectIsGrouped): ResultField { const { columnName } = col; let { alias } = col; + + const exprCore = this.getColumnExpression(col); + if (selectIsGrouped && !col.isGrouped) { // use aggregate const aggregate = col.aggregate == null || col.aggregate == '---' ? 'MAX' : col.aggregate; @@ -142,20 +162,12 @@ export class DesignerQueryDumper { func: aggregate == 'COUNT DISTINCT' ? 'COUNT' : aggregate, argsPrefix: aggregate == 'COUNT DISTINCT' ? 'DISTINCT' : null, alias, - args: [ - { - exprType: 'column', - columnName, - source, - }, - ], + args: [exprCore], }; } else { return { - exprType: 'column', - columnName, + ...exprCore, alias, - source, }; } } @@ -179,24 +191,21 @@ export class DesignerQueryDumper { } } - const topLevelColumns = (this.designer.columns || []).filter(col => - topLevelTables.find(tbl => tbl.designerId == col.designerId) + const topLevelColumns = (this.designer.columns || []).filter( + col => + topLevelTables.find(tbl => tbl.designerId == col.designerId) || (col.isCustomExpression && col.customExpression) ); const selectIsGrouped = !!topLevelColumns.find(x => x.isGrouped || (x.aggregate && x.aggregate != '---')); const outputColumns = topLevelColumns.filter(x => x.isOutput); if (outputColumns.length == 0) { res.selectAll = true; } else { - res.columns = outputColumns.map(col => this.getColumnOutputExpression(col, selectIsGrouped)); + res.columns = outputColumns.map(col => this.getColumnResultField(col, selectIsGrouped)); } const groupedColumns = topLevelColumns.filter(x => x.isGrouped); if (groupedColumns.length > 0) { - res.groupBy = groupedColumns.map(col => ({ - exprType: 'column', - columnName: col.columnName, - source: findQuerySource(this.designer, col.designerId), - })); + res.groupBy = groupedColumns.map(col => this.getColumnExpression(col)); } const orderColumns = _.sortBy( @@ -205,10 +214,8 @@ export class DesignerQueryDumper { ); if (orderColumns.length > 0) { res.orderBy = orderColumns.map(col => ({ - exprType: 'column', + ...this.getColumnExpression(col), direction: col.sortOrder < 0 ? 'DESC' : 'ASC', - columnName: col.columnName, - source: findQuerySource(this.designer, col.designerId), })); } diff --git a/packages/web/src/designer/types.ts b/packages/web/src/designer/types.ts index 000549de2..ee77e1e2f 100644 --- a/packages/web/src/designer/types.ts +++ b/packages/web/src/designer/types.ts @@ -31,6 +31,8 @@ export type DesignerColumnInfo = { sortOrder?: number; filter?: string; groupFilter?: string; + isCustomExpression?: boolean; + customExpression?: string; }; export type DesignerSettings = { diff --git a/packages/web/src/elements/QueryDesignColumns.svelte b/packages/web/src/elements/QueryDesignColumns.svelte index c643d2ec1..de73284df 100644 --- a/packages/web/src/elements/QueryDesignColumns.svelte +++ b/packages/web/src/elements/QueryDesignColumns.svelte @@ -13,8 +13,10 @@ import SelectField from '../forms/SelectField.svelte'; import TextField from '../forms/TextField.svelte'; import InlineButton from '../buttons/InlineButton.svelte'; + import uuidv1 from 'uuid/v1'; import TableControl from './TableControl.svelte'; + import FormStyledButton from '../buttons/FormStyledButton.svelte'; export let value; export let onChange; @@ -35,6 +37,13 @@ })); }; + const addExpressionColumn = () => { + onChange(current => ({ + ...current, + columns: [...(current.columns || []), { isCustomExpression: true, isOutput: true, designerId: uuidv1() }], + })); + }; + $: columns = value?.columns; $: tables = value?.tables; $: hasGroupedColumn = !!(columns || []).find(x => x.isGrouped); @@ -44,7 +53,7 @@ getTableDisplayName(row, tables) }, { fieldName: 'isOutput', header: 'Output', slot: 0 }, { fieldName: 'alias', header: 'Alias', slot: 1 }, @@ -56,6 +65,19 @@ { fieldName: 'actions', header: '', slot: 7 }, ]} > + + {#if row.isCustomExpression} + { + changeColumn({ ...row, customExpression: e.target.value }); + }} + /> + {:else} + {row.columnName} + {/if} + + removeColumn(row)}>Remove + \ No newline at end of file + diff --git a/packages/web/src/elements/TableControl.svelte b/packages/web/src/elements/TableControl.svelte index d22a01524..0647aca69 100644 --- a/packages/web/src/elements/TableControl.svelte +++ b/packages/web/src/elements/TableControl.svelte @@ -92,6 +92,8 @@ {:else if col.slot == 5} {:else if col.slot == 6} {:else if col.slot == 7} + {:else if col.slot == 8} + {:else if col.slot == 9} {/if} {:else} {row[col.fieldName] || ''} From d563a40d0fcc38b669a4d00377528ae5f95066d0 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sat, 16 Jul 2022 21:03:08 +0200 Subject: [PATCH 07/20] qury designer - improved style --- packages/web/src/elements/QueryDesignColumns.svelte | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/web/src/elements/QueryDesignColumns.svelte b/packages/web/src/elements/QueryDesignColumns.svelte index de73284df..dc6195066 100644 --- a/packages/web/src/elements/QueryDesignColumns.svelte +++ b/packages/web/src/elements/QueryDesignColumns.svelte @@ -68,6 +68,7 @@ {#if row.isCustomExpression} { changeColumn({ ...row, customExpression: e.target.value }); @@ -89,6 +90,7 @@ { changeColumn({ ...row, alias: e.target.value }); @@ -108,6 +110,7 @@ {#if !row.isGrouped} { changeColumn({ ...row, aggregate: e.detail }); @@ -119,6 +122,7 @@ { changeColumn({ ...row, sortOrder: parseInt(e.detail) }); @@ -156,7 +160,7 @@ removeColumn(row)}>Remove - +