diff --git a/packages/api/src/controllers/sessions.js b/packages/api/src/controllers/sessions.js index 14c8a7bed..f05034bb9 100644 --- a/packages/api/src/controllers/sessions.js +++ b/packages/api/src/controllers/sessions.js @@ -97,6 +97,12 @@ module.exports = { socket.emit(`session-initialize-file-${jslid}`); }, + handle_changedCurrentDatabase(sesid, props) { + const { database } = props; + this.dispatchMessage(sesid, `Current database changed to ${database}`); + socket.emit(`session-changedb-${sesid}`, { database }); + }, + handle_ping() {}, create_meta: true, diff --git a/packages/api/src/utility/handleQueryStream.js b/packages/api/src/utility/handleQueryStream.js index 617991ea3..063d9bef4 100644 --- a/packages/api/src/utility/handleQueryStream.js +++ b/packages/api/src/utility/handleQueryStream.js @@ -148,6 +148,7 @@ class StreamHandler { // this.error = this.error.bind(this); this.done = this.done.bind(this); this.info = this.info.bind(this); + this.changedCurrentDatabase = this.changedCurrentDatabase.bind(this); // use this for cancelling - not implemented // this.stream = null; @@ -166,6 +167,10 @@ class StreamHandler { } } + changedCurrentDatabase(database) { + process.send({ msgtype: 'changedCurrentDatabase', database, sesid: this.sesid }); + } + recordset(columns) { if (this.rowsLimitOverflow) { return; diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index 0daf4c172..c583ff88a 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -21,6 +21,7 @@ export interface StreamOptions { error?: (error) => void; done?: (result) => void; info?: (info) => void; + changedCurrentDatabase?: (database: string) => void; } export type CollectionOperationInfo = diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index fd55fee86..1b9ae4374 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -265,9 +265,11 @@ if (sid) { apiOn(`session-done-${sid}`, handleSessionDone); apiOn(`session-closed-${sid}`, handleSessionClosed); + apiOn(`session-changedb-${sid}`, handleChangedDatabase); return () => { apiOff(`session-done-${sid}`, handleSessionDone); apiOff(`session-closed-${sid}`, handleSessionClosed); + apiOff(`session-changedb-${sid}`, handleChangedDatabase); }; } return () => {}; @@ -566,6 +568,17 @@ handleSessionDone(); }; + const handleChangedDatabase = async props => { + changeTab(tabid, tab => ({ + ...tab, + props: { + ...tab.props, + conid, + database: props.database, + }, + })); + }; + const { editorState, editorValue, setEditorData } = useEditorData({ tabid, loadFromArgs: diff --git a/plugins/dbgate-plugin-mysql/src/backend/drivers.js b/plugins/dbgate-plugin-mysql/src/backend/drivers.js index 2db777679..6167b719d 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/drivers.js +++ b/plugins/dbgate-plugin-mysql/src/backend/drivers.js @@ -130,6 +130,9 @@ const drivers = driverBases.map(driverBase => ({ time: new Date(), severity: 'info', }); + if (row.stateChanges?.schema) { + options.changedCurrentDatabase(row.stateChanges.schema); + } } else { if (columns) { options.row(zipDataRow(row, columns));