From f59aeda28ecbc52d6289d7844abefd3c97387184 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Fri, 14 Mar 2025 14:44:35 +0000 Subject: [PATCH 01/15] Update pro ref --- workflow-templates/includes.tpl.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow-templates/includes.tpl.yaml b/workflow-templates/includes.tpl.yaml index 9bac92a85..61e2d34b0 100644 --- a/workflow-templates/includes.tpl.yaml +++ b/workflow-templates/includes.tpl.yaml @@ -7,7 +7,7 @@ checkout-and-merge-pro: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: e4e157db83a2785057ef4778c3297abe758a7505 + ref: 32bb976b7a07547641d1e8517c86e7c4d70bd088 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro From 27e0517f9ab55588022c81c89a4d7d35db063c70 Mon Sep 17 00:00:00 2001 From: CI workflows Date: Fri, 14 Mar 2025 14:44:48 +0000 Subject: [PATCH 02/15] chore: auto-update github workflows --- .github/workflows/build-app-pro-beta.yaml | 2 +- .github/workflows/build-app-pro.yaml | 2 +- .github/workflows/build-cloud-pro.yaml | 2 +- .github/workflows/build-docker-pro.yaml | 2 +- .github/workflows/build-npm-pro.yaml | 2 +- .github/workflows/e2e-pro.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-app-pro-beta.yaml b/.github/workflows/build-app-pro-beta.yaml index d3d64bf70..93e99a798 100644 --- a/.github/workflows/build-app-pro-beta.yaml +++ b/.github/workflows/build-app-pro-beta.yaml @@ -39,7 +39,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: e4e157db83a2785057ef4778c3297abe758a7505 + ref: 32bb976b7a07547641d1e8517c86e7c4d70bd088 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-app-pro.yaml b/.github/workflows/build-app-pro.yaml index 603b5e5d5..9b7deed62 100644 --- a/.github/workflows/build-app-pro.yaml +++ b/.github/workflows/build-app-pro.yaml @@ -39,7 +39,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: e4e157db83a2785057ef4778c3297abe758a7505 + ref: 32bb976b7a07547641d1e8517c86e7c4d70bd088 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-cloud-pro.yaml b/.github/workflows/build-cloud-pro.yaml index 372d2512e..1f0be4388 100644 --- a/.github/workflows/build-cloud-pro.yaml +++ b/.github/workflows/build-cloud-pro.yaml @@ -39,7 +39,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: e4e157db83a2785057ef4778c3297abe758a7505 + ref: 32bb976b7a07547641d1e8517c86e7c4d70bd088 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-docker-pro.yaml b/.github/workflows/build-docker-pro.yaml index c87ee971a..41a8d6f97 100644 --- a/.github/workflows/build-docker-pro.yaml +++ b/.github/workflows/build-docker-pro.yaml @@ -44,7 +44,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: e4e157db83a2785057ef4778c3297abe758a7505 + ref: 32bb976b7a07547641d1e8517c86e7c4d70bd088 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/build-npm-pro.yaml b/.github/workflows/build-npm-pro.yaml index cd1b99166..141f429bb 100644 --- a/.github/workflows/build-npm-pro.yaml +++ b/.github/workflows/build-npm-pro.yaml @@ -32,7 +32,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: e4e157db83a2785057ef4778c3297abe758a7505 + ref: 32bb976b7a07547641d1e8517c86e7c4d70bd088 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro diff --git a/.github/workflows/e2e-pro.yaml b/.github/workflows/e2e-pro.yaml index 8edcbb014..d21285668 100644 --- a/.github/workflows/e2e-pro.yaml +++ b/.github/workflows/e2e-pro.yaml @@ -26,7 +26,7 @@ jobs: repository: dbgate/dbgate-pro token: ${{ secrets.GH_TOKEN }} path: dbgate-pro - ref: e4e157db83a2785057ef4778c3297abe758a7505 + ref: 32bb976b7a07547641d1e8517c86e7c4d70bd088 - name: Merge dbgate/dbgate-pro run: | mkdir ../dbgate-pro From d5f8e01dd8516a8973c7eccaf9d121d5145321cf Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 17 Mar 2025 10:50:17 +0100 Subject: [PATCH 03/15] changelog for 6.3.0 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fe547910..daaa3c712 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,15 @@ Builds: - linux - application for linux - win - application for Windows +### 6.3.0 - not released +- ADDED: Support for libSQL and Turso (Premium) +- ADDED: Native backup and restore database for MySQL and PostgreSQL (Premium) +- REMOVED: DbGate internal dump export for MySQL (replaced with call of mysqldump) +- REMOVED: Import SQL dump with internal DbGate capabilities (replaced by calling of mysql and psql utilities) +- FIXED: Many fixes in stream processing (imoprt/export), especialy for MongoDB +- ADDED: Indicating progress of import/export tasks, better error reporting +- CHANGED: #1060 - Changed shortcut for AI assistant + ### 6.2.1 - ADDED: Commit/rollback and autocommit in scripts #1039 - FIXED: Doesn't import all the records from MongoDB #1044 From 3bb4652a4918c36d4afc977b0770a14dc0bdcb72 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 17 Mar 2025 13:55:58 +0100 Subject: [PATCH 04/15] SYNC: health status --- packages/api/src/controllers/auth.js | 1 + packages/api/src/controllers/runners.js | 4 ++++ packages/api/src/controllers/sessions.js | 3 +++ packages/api/src/main.js | 7 +++++++ packages/api/src/utility/healthStatus.js | 25 ++++++++++++++++++++++++ 5 files changed, 40 insertions(+) create mode 100644 packages/api/src/utility/healthStatus.js diff --git a/packages/api/src/controllers/auth.js b/packages/api/src/controllers/auth.js index 509d4c9c1..0d474b8ef 100644 --- a/packages/api/src/controllers/auth.js +++ b/packages/api/src/controllers/auth.js @@ -43,6 +43,7 @@ function authMiddleware(req, res, next) { '/connections/dblogin-app', '/connections/dblogin-auth', '/connections/dblogin-auth-token', + '/health', ]; // console.log('********************* getAuthProvider()', getAuthProvider()); diff --git a/packages/api/src/controllers/runners.js b/packages/api/src/controllers/runners.js index eabb2f1c2..39e205e82 100644 --- a/packages/api/src/controllers/runners.js +++ b/packages/api/src/controllers/runners.js @@ -171,6 +171,7 @@ module.exports = { this.rejectRequest(runid, { message: 'No data returned, maybe input data source is too big' }); logger.info({ code, pid: subprocess.pid }, 'Exited process'); socket.emit(`runner-done-${runid}`, code); + this.opened = this.opened.filter(x => x.runid != runid); }); subprocess.on('error', error => { // console.log('... ERROR subprocess', error); @@ -180,6 +181,7 @@ module.exports = { severity: 'error', message: error.toString(), }); + this.opened = this.opened.filter(x => x.runid != runid); }); const newOpened = { runid, @@ -224,6 +226,7 @@ module.exports = { if (onFinished) { onFinished(); } + this.opened = this.opened.filter(x => x.runid != runid); }); subprocess.on('spawn', () => { this.dispatchMessage(runid, `Started external process ${command}`); @@ -241,6 +244,7 @@ module.exports = { }); } socket.emit(`runner-done-${runid}`); + this.opened = this.opened.filter(x => x.runid != runid); }); if (stdinFilePath) { diff --git a/packages/api/src/controllers/sessions.js b/packages/api/src/controllers/sessions.js index 5091fa6a8..08e3e11e2 100644 --- a/packages/api/src/controllers/sessions.js +++ b/packages/api/src/controllers/sessions.js @@ -127,6 +127,9 @@ module.exports = { this.dispatchMessage(sesid, 'Query session closed'); socket.emit(`session-closed-${sesid}`); }); + subprocess.on('error', () => { + this.opened = this.opened.filter(x => x.sesid != sesid); + }); subprocess.send({ msgtype: 'connect', diff --git a/packages/api/src/main.js b/packages/api/src/main.js index b3b51671c..22001ad26 100644 --- a/packages/api/src/main.js +++ b/packages/api/src/main.js @@ -38,6 +38,7 @@ const { getLogger } = require('dbgate-tools'); const { getDefaultAuthProvider } = require('./auth/authProvider'); const startCloudUpgradeTimer = require('./utility/cloudUpgrade'); const { isProApp } = require('./utility/checkLicense'); +const getHealthStatus = require('./utility/healthStatus'); const logger = getLogger('main'); @@ -117,6 +118,12 @@ function start() { }); }); + app.get(getExpressPath('/health'), async function (req, res) { + res.setHeader('Content-Type', 'application/json'); + const health = await getHealthStatus(); + res.end(JSON.stringify(health, null, 2)); + }); + app.use(bodyParser.json({ limit: '50mb' })); app.use( diff --git a/packages/api/src/utility/healthStatus.js b/packages/api/src/utility/healthStatus.js new file mode 100644 index 000000000..0b3ec80ba --- /dev/null +++ b/packages/api/src/utility/healthStatus.js @@ -0,0 +1,25 @@ +const os = require('os'); + +const databaseConnections = require('../controllers/databaseConnections'); +const serverConnections = require('../controllers/serverConnections'); +const sessions = require('../controllers/sessions'); +const runners = require('../controllers/runners'); + +async function getHealthStatus() { + const memory = process.memoryUsage(); + + return { + status: 'ok', + databaseConnectionCount: databaseConnections.opened.length, + serverConnectionCount: serverConnections.opened.length, + sessionCount: sessions.opened.length, + memory, + systemMemory: { + total: os.totalmem(), + free: os.freemem(), + }, + runProcessCount: runners.opened.length, + }; +} + +module.exports = getHealthStatus; From 2c9fc7b4a74a53c9b7d87cb3c6a548fd9704d7a3 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 17 Mar 2025 14:11:31 +0100 Subject: [PATCH 05/15] SYNC: health --- packages/api/src/utility/healthStatus.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/api/src/utility/healthStatus.js b/packages/api/src/utility/healthStatus.js index 0b3ec80ba..3a458e0d8 100644 --- a/packages/api/src/utility/healthStatus.js +++ b/packages/api/src/utility/healthStatus.js @@ -7,18 +7,20 @@ const runners = require('../controllers/runners'); async function getHealthStatus() { const memory = process.memoryUsage(); + const cpuUsage = process.cpuUsage(); return { status: 'ok', databaseConnectionCount: databaseConnections.opened.length, serverConnectionCount: serverConnections.opened.length, sessionCount: sessions.opened.length, + runProcessCount: runners.opened.length, memory, + cpuUsage, systemMemory: { total: os.totalmem(), free: os.freemem(), }, - runProcessCount: runners.opened.length, }; } From 70816b48e846b9cfc28a963930d4edc3d7066170 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 17 Mar 2025 15:07:08 +0100 Subject: [PATCH 06/15] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index daaa3c712..01fb92b9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Builds: - FIXED: Many fixes in stream processing (imoprt/export), especialy for MongoDB - ADDED: Indicating progress of import/export tasks, better error reporting - CHANGED: #1060 - Changed shortcut for AI assistant +- ADDED: /health endpoint with diagnostic info ### 6.2.1 - ADDED: Commit/rollback and autocommit in scripts #1039 From 5511ea188727de3d366cdcf14ab60b2a853f6970 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Mon, 17 Mar 2025 15:43:33 +0100 Subject: [PATCH 07/15] dark theme detect, startup with dark theme --- packages/web/src/stores.ts | 15 ++++++++++--- packages/web/src/widgets/AppStartInfo.svelte | 23 ++++++++++++++++++-- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index e49b4d394..fbcb73cb2 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -26,6 +26,10 @@ export interface TabDefinition { focused?: boolean; } +function getSystemTheme() { + return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'theme-dark' : 'theme-light'; +} + export function writableWithStorage(defaultValue: T, storageName) { const init = localStorage.getItem(storageName); const res = writable(init ? safeJsonParse(init, defaultValue, true) : defaultValue); @@ -100,8 +104,8 @@ export const extensions = writable(null); export const visibleCommandPalette = writable(null); export const commands = writable({}); export const currentTheme = getElectron() - ? writableSettingsValue('theme-light', 'currentTheme') - : writableWithStorage('theme-light', 'currentTheme'); + ? writableSettingsValue(getSystemTheme(), 'currentTheme') + : writableWithStorage(getSystemTheme(), 'currentTheme'); export const currentEditorTheme = getElectron() ? writableSettingsValue(null, 'currentEditorTheme') : writableWithStorage(null, 'currentEditorTheme'); @@ -194,8 +198,13 @@ export const connectionAppObjectSearchSettings = writableWithStorage( ); export const currentThemeDefinition = derived([currentTheme, extensions], ([$currentTheme, $extensions]) => - $extensions.themes.find(x => x.themeClassName == $currentTheme) + $extensions?.themes?.find(x => x.themeClassName == $currentTheme) ); +currentThemeDefinition.subscribe(value => { + if (value?.themeType) { + localStorage.setItem('currentThemeType', value?.themeType); + } +}); export const openedConnectionsWithTemporary = derived( [openedConnections, temporaryOpenedConnections, openedSingleDatabaseConnections], ([$openedConnections, $temporaryOpenedConnections, $openedSingleDatabaseConnections]) => diff --git a/packages/web/src/widgets/AppStartInfo.svelte b/packages/web/src/widgets/AppStartInfo.svelte index 7f46b0542..0597874da 100644 --- a/packages/web/src/widgets/AppStartInfo.svelte +++ b/packages/web/src/widgets/AppStartInfo.svelte @@ -1,8 +1,14 @@ -
+
@@ -15,21 +21,34 @@