From d35aeaa08cbc781eaa45fe0bda417d61be842b28 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Thu, 28 May 2026 16:11:29 +0800 Subject: [PATCH] fix: continue transfer after table failure --- .../transfer/DataTransferDialog.vue | 59 ++++++++++++++++--- apps/desktop/src/i18n/locales/en.ts | 1 + apps/desktop/src/i18n/locales/es.ts | 1 + apps/desktop/src/i18n/locales/zh-CN.ts | 1 + apps/desktop/src/lib/http.ts | 2 +- apps/desktop/src/lib/tauri.ts | 28 +++++---- apps/desktop/src/lib/transferProgressState.ts | 1 - crates/dbx-web/src/routes/transfer.rs | 33 +++++++++-- .../app-tests/transferProgressState.test.ts | 17 +++++- src-tauri/src/commands/transfer.rs | 36 +++++++---- 10 files changed, 138 insertions(+), 41 deletions(-) diff --git a/apps/desktop/src/components/transfer/DataTransferDialog.vue b/apps/desktop/src/components/transfer/DataTransferDialog.vue index e765ba008..a2969d7e3 100644 --- a/apps/desktop/src/components/transfer/DataTransferDialog.vue +++ b/apps/desktop/src/components/transfer/DataTransferDialog.vue @@ -279,9 +279,11 @@ async function startTransfer() { try { await api.startTransfer(request, (progress) => { - transferProgress.value.set(progress.table, progress); - transferProgress.value = new Map(transferProgress.value); - currentTable.value = progress.table; + if (progress.table) { + transferProgress.value.set(progress.table, progress); + transferProgress.value = new Map(transferProgress.value); + currentTable.value = progress.table; + } const nextState = nextTransferTerminalState( { @@ -317,13 +319,38 @@ function getConnectionType(id: string): DatabaseType { return store.connections.find((c) => c.id === id)?.db_type ?? "mysql"; } +const processedStatuses = new Set(["tableDone", "done", "error", "cancelled"]); + +function formatRowCount(count: number) { + return count.toLocaleString(); +} + +function formatTableRows(progress: TransferProgress) { + if (typeof progress.totalRows === "number") { + return `${formatRowCount(progress.rowsTransferred)} / ${formatRowCount(progress.totalRows)}`; + } + return formatRowCount(progress.rowsTransferred); +} + const completedTables = computed( - () => [...transferProgress.value.values()].filter((p) => p.status === "tableDone" || p.status === "done").length, + () => [...transferProgress.value.values()].filter((p) => processedStatuses.has(p.status)).length, ); +const failedTables = computed(() => [...transferProgress.value.values()].filter((p) => p.status === "error").length); + const totalTransferred = computed(() => [...transferProgress.value.values()].reduce((sum, p) => sum + p.rowsTransferred, 0), ); + +const knownTotalRows = computed(() => + [...transferProgress.value.values()].reduce((sum, p) => sum + (typeof p.totalRows === "number" ? p.totalRows : 0), 0), +); + +const overallRowsLabel = computed(() => + knownTotalRows.value > 0 + ? `${formatRowCount(totalTransferred.value)} / ${formatRowCount(knownTotalRows.value)}` + : formatRowCount(totalTransferred.value), +);