feat(export): support safe background query exports
This commit is contained in:
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user