From 01e2cb30870e946988376bc7e3306d682ece3815 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 24 Mar 2020 19:47:53 +0100 Subject: [PATCH] save changes to DB --- .../src/controllers/databaseConnections.js | 8 +++++ .../api/src/proc/databaseConnectionProcess.js | 15 ++++---- packages/engines/mssql/index.js | 34 +++++++++++-------- packages/types/query.d.ts | 5 +-- packages/web/src/datagrid/DataGridCore.js | 22 ++++++++++-- packages/web/src/modals/ConfirmSqlModal.js | 11 ++++-- 6 files changed, 66 insertions(+), 29 deletions(-) diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index 7e235df6..f56ea79b 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -74,4 +74,12 @@ module.exports = { const res = await this.sendRequest(opened, { msgtype: 'queryData', sql }); return res; }, + + // runCommand_meta: 'post', + // async runCommand({ conid, database, sql }) { + // console.log(`Running SQL command , conid=${conid}, database=${database}, sql=${sql}`); + // const opened = await this.ensureOpened(conid, database); + // const res = await this.sendRequest(opened, { msgtype: 'queryData', sql }); + // return res; + // }, }; diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 48fe0a2f..a1b0ea98 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -33,22 +33,23 @@ function waitConnected() { } async function handleQueryData({ msgid, sql }) { - // const select = new Select(); - // if (driver.dialect.limitSelect) select.topRecords = 100; - // if (driver.dialect.rangeSelect) select.range = { offset: 0, limit: 100 }; - // select.from = { schemaName, pureName }; - // select.selectAll = true; - // const sql = select.toSql(driver); - await waitConnected(); const driver = engines(storedConnection); const res = await driver.query(systemConnection, sql); process.send({ msgtype: 'response', msgid, ...res }); } +// async function handleRunCommand({ msgid, sql }) { +// await waitConnected(); +// const driver = engines(storedConnection); +// const res = await driver.query(systemConnection, sql); +// process.send({ msgtype: 'response', msgid, ...res }); +// } + const messageHandlers = { connect: handleConnect, queryData: handleQueryData, + // runCommand: handleRunCommand, }; async function handleMessage({ msgtype, ...other }) { diff --git a/packages/engines/mssql/index.js b/packages/engines/mssql/index.js index 92d21891..1f2f5a3e 100644 --- a/packages/engines/mssql/index.js +++ b/packages/engines/mssql/index.js @@ -1,6 +1,6 @@ -const _ = require("lodash"); -const MsSqlAnalyser = require("./MsSqlAnalyser"); -const MsSqlDumper = require("./MsSqlDumper"); +const _ = require('lodash'); +const MsSqlAnalyser = require('./MsSqlAnalyser'); +const MsSqlDumper = require('./MsSqlDumper'); /** @type {import('@dbgate/types').SqlDialect} */ const dialect = { @@ -10,7 +10,7 @@ const dialect = { stringEscapeChar: "'", quoteIdentifier(s) { return `[${s}]`; - } + }, }; /** @type {import('@dbgate/types').EngineDriver} */ @@ -23,8 +23,8 @@ const driver = { password, database, options: { - enableArithAbort: true - } + enableArithAbort: true, + }, }); pool._nativeModules = nativeModules; return pool; @@ -32,20 +32,24 @@ const driver = { async query(pool, sql) { const resp = await pool.request().query(sql); // console.log(Object.keys(resp.recordset)); - const columns = _.sortBy(_.values(resp.recordset.columns), "index"); - return { rows: resp.recordset, columns }; + // console.log(resp); + const res = {}; + + if (resp.recordset) { + res.columns = _.sortBy(_.values(resp.recordset.columns), 'index'); + res.rows = resp.recordset; + } + if (resp.rowsAffected) { + res.rowsAffected = _.sum(resp.rowsAffected); + } + return res; }, async getVersion(pool) { - const { version } = ( - await this.query(pool, "SELECT @@VERSION AS version") - ).rows[0]; + const { version } = (await this.query(pool, 'SELECT @@VERSION AS version')).rows[0]; return { version }; }, async listDatabases(pool) { - const { rows } = await this.query( - pool, - "SELECT name FROM sys.databases order by name" - ); + const { rows } = await this.query(pool, 'SELECT name FROM sys.databases order by name'); return rows; }, async analyseFull(pool) { diff --git a/packages/types/query.d.ts b/packages/types/query.d.ts index 3d60c7ce..c1da25ce 100644 --- a/packages/types/query.d.ts +++ b/packages/types/query.d.ts @@ -8,6 +8,7 @@ export interface QueryResultColumn { } export interface QueryResult { - rows: any[]; - columns: QueryResultColumn[]; + rows?: any[]; + columns?: QueryResultColumn[]; + rowsAffected?: number; } diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index a3223184..a15b0c6d 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -26,7 +26,7 @@ import DataGridRow from './DataGridRow'; import { countColumnSizes, countVisibleRealColumns } from './gridutil'; import useModalState from '../modals/useModalState'; import ConfirmSqlModal from '../modals/ConfirmSqlModal'; -import { changeSetToSql } from '@dbgate/datalib'; +import { changeSetToSql, createChangeSet } from '@dbgate/datalib'; import { scriptToSql } from '@dbgate/sqltree'; const GridContainer = styled.div` @@ -118,7 +118,7 @@ export default function DataGridCore(props) { const sql = display.getPageQuery(loadedRows.length, 100); - let response = await axios.request({ + const response = await axios.request({ url: 'database-connections/query-data', method: 'post', params: { @@ -312,6 +312,22 @@ export default function DataGridCore(props) { confirmSqlModalState.open(); } + async function handleConfirmSql() { + const response = await axios.request({ + url: 'database-connections/query-data', + method: 'post', + params: { + conid, + database, + }, + data: { sql: confirmSql }, + }); + + setChangeSet(createChangeSet()); + setConfirmSql(null); + display.reload(); + } + function handleGridKeyDown(event) { if ( !event.ctrlKey && @@ -576,7 +592,7 @@ export default function DataGridCore(props) { onScroll={handleRowScroll} viewportRatio={visibleRowCountUpperBound / rowCountNewIncluded} /> - + ); } diff --git a/packages/web/src/modals/ConfirmSqlModal.js b/packages/web/src/modals/ConfirmSqlModal.js index 3c8b6e3d..7f9dfe1a 100644 --- a/packages/web/src/modals/ConfirmSqlModal.js +++ b/packages/web/src/modals/ConfirmSqlModal.js @@ -14,7 +14,7 @@ const SqlWrapper = styled.div` width: 40vw; `; -export default function ConfirmSqlModal({ modalState, sql, engine }) { +export default function ConfirmSqlModal({ modalState, sql, engine, onConfirm }) { return (

Save changes

@@ -23,7 +23,14 @@ export default function ConfirmSqlModal({ modalState, sql, engine }) { - + { + modalState.close(); + onConfirm(); + }} + />