From 9d348f8ef714f741159e18afefd3149514d54668 Mon Sep 17 00:00:00 2001 From: zipg Date: Thu, 6 Aug 2026 16:32:39 +0800 Subject: [PATCH] fix(export): keep MySQL database export snapshots alive --- .../export/ExportProgressPopover.vue | 23 ++++- .../__tests__/ExportProgressPopover.spec.ts | 90 +++++++++++++++++++ .../src/composables/useExportTracker.ts | 15 ++-- .../useScheduledDatabaseBackups.ts | 40 +++++---- apps/desktop/src/i18n/locales/en.ts | 3 +- apps/desktop/src/i18n/locales/es.ts | 3 +- apps/desktop/src/i18n/locales/it.ts | 3 +- apps/desktop/src/i18n/locales/ja.ts | 3 +- apps/desktop/src/i18n/locales/ko.ts | 3 +- apps/desktop/src/i18n/locales/pt-BR.ts | 3 +- apps/desktop/src/i18n/locales/zh-CN.ts | 3 +- apps/desktop/src/i18n/locales/zh-TW.ts | 3 +- crates/dbx-core/src/database_export.rs | 6 ++ crates/dbx-core/src/query.rs | 64 +++++++++++++ .../dbx-core/tests/live_manual_transaction.rs | 47 ++++++++++ .../app-tests/scheduledDatabaseBackup.test.ts | 13 +++ packages/app-tests/useExportTracker.test.ts | 3 +- 17 files changed, 290 insertions(+), 35 deletions(-) diff --git a/apps/desktop/src/components/export/ExportProgressPopover.vue b/apps/desktop/src/components/export/ExportProgressPopover.vue index a473cd0e7..5896aeabf 100644 --- a/apps/desktop/src/components/export/ExportProgressPopover.vue +++ b/apps/desktop/src/components/export/ExportProgressPopover.vue @@ -68,7 +68,10 @@ const progressValue = (task: ExportTask) => { }; const taskTitle = (task: ExportTask) => { - if (task.kind === "database-export") return t("exportProgress.databaseExportTitle", { name: task.tableName }); + if (task.kind === "database-export") { + const key = task.databaseExportSource === "scheduled" ? "exportProgress.databaseBackupTitle" : "exportProgress.databaseExportTitle"; + return t(key, { name: task.tableName }); + } if (task.kind === "sql-file") return t("exportProgress.sqlFileTitle", { name: task.tableName }); if (task.kind === "data-transfer") return t("exportProgress.dataTransferTitle", { name: task.tableName }); return `${task.tableName}.${task.format}`; @@ -113,6 +116,18 @@ const elapsedText = (task: ExportTask) => { return t("exportProgress.elapsed", { duration: formatDataTransferDuration(finishedAt - task.startedAt) }); }; +const databaseObjectText = (task: ExportTask) => { + if (task.kind !== "database-export" || !isActive(task.status) || !task.currentObject) return ""; + if (task.preparing || !task.totalObjects) { + return t("databaseExport.preparingObject", { object: task.currentObject }); + } + return t("databaseExport.currentTable", { + table: task.currentObject, + current: (task.objectIndex ?? 0).toLocaleString(), + total: task.totalObjects.toLocaleString(), + }); +}; + const statusIcon = (task: ExportTask) => { if (isActive(task.status)) { if (task.kind === "database-export") return DatabaseBackup; @@ -172,7 +187,7 @@ function failureDetailCount(task: ExportTask) {