save changes to DB

This commit is contained in:
Jan Prochazka 2020-03-24 19:47:53 +01:00
parent 464662cb18
commit 01e2cb3087
6 changed files with 66 additions and 29 deletions

View File

@ -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;
// },
};

View File

@ -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 }) {

View File

@ -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) {

View File

@ -8,6 +8,7 @@ export interface QueryResultColumn {
}
export interface QueryResult {
rows: any[];
columns: QueryResultColumn[];
rows?: any[];
columns?: QueryResultColumn[];
rowsAffected?: number;
}

View File

@ -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}
/>
<ConfirmSqlModal modalState={confirmSqlModalState} sql={confirmSql} engine={display.engine} />
<ConfirmSqlModal modalState={confirmSqlModalState} sql={confirmSql} engine={display.engine} onConfirm={handleConfirmSql} />
</GridContainer>
);
}

View File

@ -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 (
<ModalBase modalState={modalState}>
<h2>Save changes</h2>
@ -23,7 +23,14 @@ export default function ConfirmSqlModal({ modalState, sql, engine }) {
</SqlWrapper>
<FormRow>
<input type="button" value="OK" onClick={modalState.close} />
<input
type="button"
value="OK"
onClick={() => {
modalState.close();
onConfirm();
}}
/>
<input type="button" value="Close" onClick={modalState.close} />
</FormRow>
</ModalBase>