diff --git a/app/src/mainMenuDefinition.js b/app/src/mainMenuDefinition.js index b74a94136..8e676db79 100644 --- a/app/src/mainMenuDefinition.js +++ b/app/src/mainMenuDefinition.js @@ -4,6 +4,7 @@ module.exports = ({ editMenu, isMac }) => [ submenu: [ { command: 'new.connection', hideDisabled: true }, { command: 'new.sqliteDatabase', hideDisabled: true }, + { command: 'new.duckdbDatabase', hideDisabled: true }, { divider: true }, { command: 'new.query', hideDisabled: true }, { command: 'new.queryDesign', hideDisabled: true }, diff --git a/packages/api/src/controllers/connections.js b/packages/api/src/controllers/connections.js index bf6b86544..8662f5e3e 100644 --- a/packages/api/src/controllers/connections.js +++ b/packages/api/src/controllers/connections.js @@ -435,6 +435,22 @@ module.exports = { return res; }, + newDuckdbDatabase_meta: true, + async newDuckdbDatabase({ file }) { + const duckdbDir = path.join(filesdir(), 'duckdb'); + if (!(await fs.exists(duckdbDir))) { + await fs.mkdir(duckdbDir); + } + const databaseFile = path.join(duckdbDir, `${file}.duckdb`); + const res = await this.save({ + engine: 'duckdb@dbgate-plugin-duckdb', + databaseFile, + singleDatabase: true, + defaultDatabase: `${file}.duckdb`, + }); + return res; + }, + dbloginWeb_meta: { raw: true, method: 'get', diff --git a/packages/api/testduck.db b/packages/api/testduck.db index 9b9f42b80..90a8e2dd2 100644 Binary files a/packages/api/testduck.db and b/packages/api/testduck.db differ diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index 8b99b6584..2be460669 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -46,6 +46,7 @@ import { openImportExportTab } from '../utility/importExportTools'; import newTable from '../tableeditor/newTable'; import { isProApp } from '../utility/proTools'; import { openWebLink } from '../utility/simpleTools'; +import { _t } from '../translations'; // function themeCommand(theme: ThemeDefinition) { // return { @@ -389,12 +390,12 @@ registerCommand({ category: 'New', icon: 'img sqlite-database', name: 'SQLite database', - menuName: 'New SQLite database', + menuName: _t('command.new.sqliteDatabase', { defaultMessage: 'New SQLite database' }), onClick: () => { showModal(InputTextModal, { value: 'newdb', - label: 'New database name', - header: 'Create SQLite database', + label: _t('command.new.sqliteDatabase', { defaultMessage: 'New SQLite database' }), + header: _t('command.new.sqliteDatabase.header', { defaultMessage: 'Create SQLite database' }), onConfirm: async file => { const resp = await apiCall('connections/new-sqlite-database', { file }); const connection = resp; @@ -404,6 +405,26 @@ registerCommand({ }, }); +registerCommand({ + id: 'new.duckdbDatabase', + category: 'New', + icon: 'img sqlite-database', + name: 'DuckDB database', + menuName: _t('command.new.duckdbDatabase', { defaultMessage: 'New DuckDB database' }), + onClick: () => { + showModal(InputTextModal, { + value: 'newdb', + label: _t('command.new.duckdbDatabase', { defaultMessage: 'New DuckDB database' }), + header: _t('command.new.duckdbDatabase.header', { defaultMessage: 'Create DuckDB database' }), + onConfirm: async file => { + const resp = await apiCall('connections/new-duckdb-database', { file }); + const connection = resp; + switchCurrentDatabase({ connection, name: `${file}.duckdb` }); + }, + }); + }, +}); + registerCommand({ id: 'tabs.changelog', category: 'Tabs', diff --git a/translations/en.json b/translations/en.json index d47f7e144..3eadc7994 100644 --- a/translations/en.json +++ b/translations/en.json @@ -26,6 +26,10 @@ "command.datagrid.undo": "Undo", "command.datagrid.viewJsonDocument": "View row as JSON document", "command.datagrid.viewJsonValue": "View cell as JSON document", + "command.new.duckdbDatabase": "New DuckDB database", + "command.new.duckdbDatabase.header": "Create DuckDB database", + "command.new.sqliteDatabase": "New SQLite database", + "command.new.sqliteDatabase.header": "Create SQLite database", "command.tabs.addToFavorites": "Add current tab to favorites", "command.tabs.closeAll": "Close all tabs", "command.tabs.closeTab": "Close tab", @@ -51,7 +55,6 @@ "connection.newQuery": "New Query (server)", "connection.refresh": "Refresh", "connection.serverSummary": "Server summary", - "connection.sqlRestore": "Restore/import SQL dump", "connection.viewDetails": "View details", "error.driverNotFound": "Invalid database connection, driver not found", "importExport.sourceFiles": "Source files", @@ -61,6 +64,7 @@ "schema.delete": "Delete schema", "schema.resetToDefault": "Reset to default", "schema.schemaName": "Schema name", + "settings.behaviour.jsonPreviewWrap": "Wrap json in preview", "settings.localization": "Localization", "tab.administration": "Administration", "widget.databaseContent": "Database content",