feat(export): support safe background query exports

This commit is contained in:
zhangyaxi authored and GitHub committed 2026-07-29 03:18:06 +08:00
1 parent 2f44d36018
commit a07def6042
17 files changed
+577 -195

No files matched your search

@@ -128,6 +128,7 @@ export interface UseDataGridExportOptions {
filePath: string | null;
}>;
exportCancelHandler?: Ref<(() => Promise<void>) | null>;
exportCanMinimize?: Ref<boolean>;
}
interface CopyInsertData {
@@ -140,6 +141,7 @@ interface CopyInsertData {
export function useDataGridExport(options: UseDataGridExportOptions) {
const { t } = useI18n();
const { toast } = useToast();
const tracker = useExportTracker();
const exportGuard: ActionActivationGuard = {};
const { addTask, updateTableExportTask, registerTaskCancelHandler, unregisterTaskCancelHandler, removeTask } = useExportTracker();
@@ -185,6 +187,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
exportProgressDialog,
exportProgressState,
exportCancelHandler,
exportCanMinimize,
} = options;
const selectedCellMatrix = selectedCellMatrixOption;
const allColumns = allColumnsOption ?? columns;
@@ -906,11 +909,14 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
};
}
if (exportProgressDialog) exportProgressDialog.value = true;
if (exportCanMinimize) exportCanMinimize.value = true;
const exportId = uuid();
const task = tracker.addTask(meta.tableName, format, outputPath);
const exportId = task.exportId;
if (exportCancelHandler) {
exportCancelHandler.value = () => api.cancelTableExport(exportId);
}
tracker.registerTaskCancelHandler(exportId, () => api.cancelTableExport(exportId));
const editorSettings = useSettingsStore().editorSettings;
const rowLimit = editorSettings.exportRowLimitEnabled ? editorSettings.exportRowLimit : null;
@@ -946,6 +952,7 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
errorMessage: progress.errorMessage || null,
};
}
tracker.updateTableExportTask(exportId, progress);
},
);
if (progress.status === "Done") {
@@ -953,6 +960,8 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
}
} finally {
if (exportCancelHandler) exportCancelHandler.value = null;
tracker.unregisterTaskCancelHandler(exportId);
if (exportCanMinimize) exportCanMinimize.value = false;
}
return true;
}
@@ -997,9 +1006,12 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
};
}
if (exportProgressDialog) exportProgressDialog.value = true;
if (exportCanMinimize) exportCanMinimize.value = true;
tracker.addTask("Query Result", format, outputPath, exportId);
if (exportCancelHandler) {
exportCancelHandler.value = () => api.cancelQueryResultExport(exportId, request.executionId);
}
tracker.registerTaskCancelHandler(exportId, () => api.cancelQueryResultExport(exportId, request.executionId));
try {
const terminalProgress = await api.startQueryResultExport(request, (progress) => {
@@ -1014,12 +1026,15 @@ export function useDataGridExport(options: UseDataGridExportOptions) {
errorMessage: progress.errorMessage || null,
};
}
tracker.updateTableExportTask(exportId, progress);
});
if (terminalProgress.status === "Done") {
toast(t("grid.exported"));
}
} finally {
if (exportCancelHandler) exportCancelHandler.value = null;
tracker.unregisterTaskCancelHandler(exportId);
if (exportCanMinimize) exportCanMinimize.value = false;
}
return true;
}
@@ -229,10 +229,10 @@ export function useExportTracker() {
.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, "$1-$2-$3-$4-$5");
}
function addTask(tableName: string, format: string, filePath: string): ExportTask {
const exportId = generateUUID();
function addTask(tableName: string, format: string, filePath: string, exportId?: string): ExportTask {
const id = exportId ?? generateUUID();
const task = reactive<ExportTask>({
exportId,
exportId: id,
kind: "table-export",
tableName,
format,
@@ -242,7 +242,7 @@ export function useExportTracker() {
status: "Running",
errorMessage: null,
});
taskMap.set(exportId, task);
taskMap.set(id, task);
return task;
}