diff --git a/packages/tools/src/driverBase.ts b/packages/tools/src/driverBase.ts index 4f675028d..fc4cf1c52 100644 --- a/packages/tools/src/driverBase.ts +++ b/packages/tools/src/driverBase.ts @@ -40,4 +40,10 @@ export const driverBase = { await this.query(pool, sqlItem, { discardResult: true }); } }, + getNewObjectTemplates() { + if (!this.dialect?.nosql) { + return [{ label: 'New view', sql: 'CREATE VIEW myview\nAS\nSELECT * FROM table1' }]; + } + return []; + }, }; diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index 5c8bc6050..2f1d2719d 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -37,6 +37,11 @@ export interface ReadCollectionOptions { limit?: number; } +export interface NewObjectTemplate { + label: string; + sql: string; +} + export interface EngineDriver { engine: string; title: string; @@ -81,6 +86,7 @@ export interface EngineDriver { createDatabase(pool: any, name: string): Promise; getQuerySplitterOptions(usage: 'stream' | 'script'): any; script(pool: any, sql: string): Promise; + getNewObjectTemplates(): NewObjectTemplate[]; analyserClass?: any; dumperClass?: any; diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 9b289fa51..a86210cb4 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -32,6 +32,7 @@ import CloseSearchButton from '../elements/CloseSearchButton.svelte'; import { findEngineDriver } from 'dbgate-tools'; import { extensions } from '../stores'; + import newQuery from '../query/newQuery'; export let conid; export let database; @@ -64,11 +65,24 @@ }; function createAddMenu() { + const res = []; if (driver?.dialect?.nosql) { - return [{ label: 'New collection', command: 'new.collection' }]; + res.push({ command: 'new.collection' }); } else { - return [{ label: 'New table', command: 'new.table' }]; + res.push({ command: 'new.table' }); } + if (driver) + res.push( + ...driver.getNewObjectTemplates().map(tpl => ({ + text: tpl.label, + onClick: () => { + newQuery({ + initialData: tpl.sql, + }); + }, + })) + ); + return res; } diff --git a/plugins/dbgate-plugin-mssql/src/frontend/driver.js b/plugins/dbgate-plugin-mssql/src/frontend/driver.js index bfbdf9a27..b56be2ab2 100644 --- a/plugins/dbgate-plugin-mssql/src/frontend/driver.js +++ b/plugins/dbgate-plugin-mssql/src/frontend/driver.js @@ -60,6 +60,15 @@ const driver = { title: 'Microsoft SQL Server', defaultPort: 1433, defaultAuthTypeName: 'tedious', + + getNewObjectTemplates() { + return [ + { label: 'New view', sql: 'CREATE VIEW myview\nAS\nSELECT * FROM table1' }, + { label: 'New procedure', sql: 'CREATE PROCEDURE myproc (@arg1 INT)\nAS\nBEGIN\n SELECT * FROM table1\nEND' }, + { label: 'New function', sql: 'CREATE FUNCTION myfunc (@arg1 INT) RETURNS INT\nAS\nBEGIN\n RETURN 1;\nEND' }, + { label: 'New table valued function', sql: 'CREATE FUNCTION myfunc (@arg1 INT) RETURNS TABLE \nAS\nRETURN SELECT * FROM table1' }, + ]; + }, }; module.exports = driver;