diff --git a/src/main/ipc-handlers/index.js b/src/main/ipc-handlers/index.js index e51e4bcf..9b5672b9 100644 --- a/src/main/ipc-handlers/index.js +++ b/src/main/ipc-handlers/index.js @@ -1,6 +1,7 @@ import connection from './connection'; import tables from './tables'; import views from './views'; +import triggers from './triggers'; import updates from './updates'; import application from './application'; import database from './database'; @@ -12,6 +13,7 @@ export default () => { connection(connections); tables(connections); views(connections); + triggers(connections); database(connections); users(connections); updates(); diff --git a/src/main/ipc-handlers/triggers.js b/src/main/ipc-handlers/triggers.js new file mode 100644 index 00000000..b7edaeab --- /dev/null +++ b/src/main/ipc-handlers/triggers.js @@ -0,0 +1,43 @@ +import { ipcMain } from 'electron'; + +export default (connections) => { + ipcMain.handle('get-trigger-informations', async (event, params) => { + try { + const result = await connections[params.uid].getTriggerInformations(params); + return { status: 'success', response: result }; + } + catch (err) { + return { status: 'error', response: err.toString() }; + } + }); + + ipcMain.handle('drop-trigger', async (event, params) => { + try { + await connections[params.uid].dropTrigger(params); + return { status: 'success' }; + } + catch (err) { + return { status: 'error', response: err.toString() }; + } + }); + + ipcMain.handle('alter-trigger', async (event, params) => { + try { + await connections[params.uid].alterTrigger(params); + return { status: 'success' }; + } + catch (err) { + return { status: 'error', response: err.toString() }; + } + }); + + ipcMain.handle('create-trigger', async (event, params) => { + try { + await connections[params.uid].createTrigger(params); + return { status: 'success' }; + } + catch (err) { + return { status: 'error', response: err.toString() }; + } + }); +}; diff --git a/src/main/libs/clients/MySQLClient.js b/src/main/libs/clients/MySQLClient.js index 7637a720..65507407 100644 --- a/src/main/libs/clients/MySQLClient.js +++ b/src/main/libs/clients/MySQLClient.js @@ -311,7 +311,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropView (params) { - const sql = `DROP VIEW \`${params.view}\``;// TODO: schema + const sql = `DROP VIEW \`${params.view}\``; return await this.raw(sql); } @@ -342,6 +342,72 @@ export class MySQLClient extends AntaresCore { return await this.raw(sql); } + /** + * SHOW CREATE TRIGGER + * + * @returns {Array.} view informations + * @memberof MySQLClient + */ + async getTriggerInformations ({ schema, trigger }) { + const sql = `SHOW CREATE TRIGGER \`${schema}\`.\`${trigger}\``; + const results = await this.raw(sql); + + return results.rows.map(row => { + return { + definer: row['SQL Original Statement'].match(/(?<=DEFINER=).*?(?=\s)/gs)[0], + sql: row['SQL Original Statement'].match(/BEGIN(.*)END/gs)[0], + name: row.Trigger, + table: row['SQL Original Statement'].match(/(?<=ON `).*?(?=`)/gs)[0], + event1: row['SQL Original Statement'].match(/(BEFORE|AFTER)/gs)[0], + event2: row['SQL Original Statement'].match(/(INSERT|UPDATE|DELETE)/gs)[0] + }; + })[0]; + } + + /** + * DROP TRIGGER + * + * @returns {Array.} parameters + * @memberof MySQLClient + */ + async dropTrigger (params) { + const sql = `DROP TRIGGER \`${params.trigger}\``; + return await this.raw(sql); + } + + /** + * ALTER TRIGGER + * + * @returns {Array.} parameters + * @memberof MySQLClient + */ + async alterTrigger (params) { + const { trigger } = params; + const tempTrigger = Object.assign({}, trigger); + tempTrigger.name = `Antares_${tempTrigger.name}_tmp`; + + try { + await this.createTrigger(tempTrigger); + await this.dropTrigger({ trigger: tempTrigger.name }); + await this.dropTrigger({ trigger: trigger.oldName }); + await this.createTrigger(trigger); + } + catch (err) { + return Promise.reject(err); + } + } + + /** + * CREATE TRIGGER + * + * @returns {Array.} parameters + * @memberof MySQLClient + */ + async createTrigger (trigger) { + const sql = `CREATE ${trigger.definer ? `DEFINER=${trigger.definer} ` : ''}TRIGGER \`${trigger.name}\` ${trigger.event1} ${trigger.event2} ON \`${trigger.table}\` FOR EACH ROW ${trigger.sql}`; + return await this.raw(sql); + } + /** * SHOW COLLATION * @@ -573,7 +639,7 @@ export class MySQLClient extends AntaresCore { * @memberof MySQLClient */ async dropTable (params) { - const sql = `DROP TABLE \`${params.table}\``;// TODO: schema + const sql = `DROP TABLE \`${params.table}\``; return await this.raw(sql); } diff --git a/src/renderer/components/Workspace.vue b/src/renderer/components/Workspace.vue index 44f3f573..59e72aa7 100644 --- a/src/renderer/components/Workspace.vue +++ b/src/renderer/components/Workspace.vue @@ -77,6 +77,12 @@ :connection="connection" :view="workspace.breadcrumbs.view" /> + tab.uid === this.workspace.selected_tab) || diff --git a/src/renderer/components/WorkspaceExploreBarDatabase.vue b/src/renderer/components/WorkspaceExploreBarDatabase.vue index 17bd26a9..58488d2c 100644 --- a/src/renderer/components/WorkspaceExploreBarDatabase.vue +++ b/src/renderer/components/WorkspaceExploreBarDatabase.vue @@ -35,6 +35,90 @@ + +
+
+ + + {{ $tc('word.trigger', 2) }} + + +
+
+ +
+
+ + + {{ $tc('word.storedRoutine', 2) }} + + +
+
+ +
+
+ + + {{ $tc('word.scheduler', 2) }} + + +
+
@@ -72,9 +156,11 @@ export default { }), formatBytes, showDatabaseContext (event, database) { + this.changeBreadcrumbs({ schema: database, table: null }); this.$emit('show-database-context', { event, database }); }, showTableContext (event, table) { + this.setBreadcrumbs({ schema: this.database.name, [table.type]: table.name }); this.$emit('show-table-context', { event, table }); }, piePercentage (val) { @@ -92,6 +178,7 @@ export default {