diff --git a/packages/api/src/proc/sessionProcess.js b/packages/api/src/proc/sessionProcess.js index 60bab4b4a..3fa35e8b4 100644 --- a/packages/api/src/proc/sessionProcess.js +++ b/packages/api/src/proc/sessionProcess.js @@ -97,7 +97,8 @@ class StreamHandler { } row(row) { // console.log('ACCEPT ROW', row); - this.currentWriter.row(row); + if (this.currentWriter) this.currentWriter.row(row); + else if (row.message) process.send({ msgtype: 'info', info: { message: row.message } }); // this.onRow(this.jslid); } // error(error) { diff --git a/packages/engines/mysql/MySqlAnalyser.js b/packages/engines/mysql/MySqlAnalyser.js index ae6ab2068..d448a46d7 100644 --- a/packages/engines/mysql/MySqlAnalyser.js +++ b/packages/engines/mysql/MySqlAnalyser.js @@ -62,6 +62,26 @@ class MySqlAnalyser extends DatabaseAnalayser { return res; } + getRequestedViewNames(allViewNames) { + if (this.singleObjectFilter) { + const { typeField, pureName } = this.singleObjectFilter; + if (typeField == 'views') return [pureName]; + } + if (this.modifications) { + return this.modifications.filter((x) => x.objectTypeField == 'views').map((x) => x.newName); + } + return allViewNames; + } + + async getViewTexts(allViewNames) { + const res = {}; + for (const viewName of this.getRequestedViewNames(allViewNames)) { + const resp = await this.driver.query(this.pool, `SHOW CREATE VIEW \`${viewName}\``); + res[viewName] = resp.rows[0]['Create View']; + } + return res; + } + async _runAnalysis() { const tables = await this.driver.query(this.pool, this.createQuery('tables')); const columns = await this.driver.query(this.pool, this.createQuery('columns')); @@ -70,6 +90,8 @@ class MySqlAnalyser extends DatabaseAnalayser { const views = await this.driver.query(this.pool, this.createQuery('views')); const programmables = await this.driver.query(this.pool, this.createQuery('programmables')); + const viewTexts = await this.getViewTexts(views.rows.map((x) => x.pureName)); + return this.mergeAnalyseResult({ tables: tables.rows.map((table) => ({ ...table, @@ -80,6 +102,7 @@ class MySqlAnalyser extends DatabaseAnalayser { views: views.rows.map((view) => ({ ...view, columns: columns.rows.filter((col) => col.pureName == view.pureName).map(getColumnInfo), + createSql: viewTexts[view.pureName], })), procedures: programmables.rows.filter((x) => x.objectType == 'PROCEDURE').map(fp.omit(['objectType'])), functions: programmables.rows.filter((x) => x.objectType == 'FUNCTION').map(fp.omit(['objectType'])), diff --git a/packages/engines/mysql/sql/programmables.js b/packages/engines/mysql/sql/programmables.js index ea702a928..1fb502634 100644 --- a/packages/engines/mysql/sql/programmables.js +++ b/packages/engines/mysql/sql/programmables.js @@ -2,7 +2,8 @@ module.exports = ` select ROUTINE_NAME as pureName, ROUTINE_TYPE as objectType, + LAST_ALTERED as modifyDate, ROUTINE_DEFINITION as createSql from information_schema.routines -where ROUTINE_SCHEMA = '#DATABASE#' +where ROUTINE_SCHEMA = '#DATABASE#' and ROUTINE_NAME =[OBJECT_NAME_CONDITION] `; diff --git a/packages/engines/mysql/sql/views.js b/packages/engines/mysql/sql/views.js index 0c34a0df3..ea4d8ef35 100644 --- a/packages/engines/mysql/sql/views.js +++ b/packages/engines/mysql/sql/views.js @@ -1,7 +1,7 @@ module.exports = ` select TABLE_NAME as pureName, - VIEW_DEFINITION as createSql -from information_schema.views -where TABLE_SCHEMA = '#DATABASE#' and TABLE_NAME =[OBJECT_NAME_CONDITION]; + coalesce(UPDATE_TIME, CREATE_TIME) as modifyDate +from information_schema.tables +where TABLE_SCHEMA = '#DATABASE#' and TABLE_NAME =[OBJECT_NAME_CONDITION] and TABLE_TYPE = 'VIEW'; `; diff --git a/packages/web/src/tabs/QueryTab.js b/packages/web/src/tabs/QueryTab.js index 16934219e..f5762a3db 100644 --- a/packages/web/src/tabs/QueryTab.js +++ b/packages/web/src/tabs/QueryTab.js @@ -39,7 +39,7 @@ function useSqlTemplate(sqlTemplate, props) { } if (sqlTemplate == 'CREATE OBJECT') { const objectInfo = await getSqlObjectInfo(props); - setSql(objectInfo.createSql); + if (objectInfo) setSql(objectInfo.createSql); } if (sqlTemplate == 'EXECUTE PROCEDURE') { const procedureInfo = await getSqlObjectInfo(props);