Files
dbgate/packages/web/src/utility/exportFileTools.ts
2022-04-24 15:03:04 +02:00

204 lines
5.9 KiB
TypeScript

import { ScriptWriter, ScriptWriterJson } from 'dbgate-tools';
import getElectron from './getElectron';
import { showSnackbar, showSnackbarInfo, showSnackbarError, closeSnackbar } from '../utility/snackbar';
import resolveApi from './resolveApi';
import { apiCall, apiOff, apiOn } from './api';
import { normalizeExportColumnMap } from '../impexp/createImpExpScript';
import { getCurrentConfig } from '../stores';
import { showModal } from '../modals/modalTools';
import RunScriptModal from '../modals/RunScriptModal.svelte';
export async function importSqlDump(inputFile, connection) {
const script = getCurrentConfig().allowShellScripting ? new ScriptWriter() : new ScriptWriterJson();
script.importDatabase({
inputFile,
connection,
});
showModal(RunScriptModal, { script: script.getScript(), header: 'Importing database' });
// await runImportExportScript({
// script: script.getScript(),
// runningMessage: 'Importing database',
// canceledMessage: 'Database import canceled',
// finishedMessage: 'Database import finished',
// });
}
export async function exportSqlDump(outputFile, connection, databaseName, pureFileName) {
const script = getCurrentConfig().allowShellScripting ? new ScriptWriter() : new ScriptWriterJson();
script.dumpDatabase({
connection,
databaseName,
outputFile,
});
showModal(RunScriptModal, {
script: script.getScript(),
header: 'Exporting database',
onOpenResult:
pureFileName && !getElectron()
? () => {
window.open(`${resolveApi()}/uploads/get?file=${pureFileName}`, '_blank');
}
: null,
openResultLabel: 'Download SQL file',
});
}
async function runImportExportScript({ script, runningMessage, canceledMessage, finishedMessage, afterFinish = null }) {
const electron = getElectron();
const resp = await apiCall('runners/start', { script });
const runid = resp.runid;
let isCanceled = false;
const snackId = showSnackbar({
message: runningMessage,
icon: 'icon loading',
buttons: [
{
label: 'Cancel',
onClick: () => {
isCanceled = true;
apiCall('runners/cancel', { runid });
},
},
],
});
function handleRunnerDone() {
closeSnackbar(snackId);
apiOff(`runner-done-${runid}`, handleRunnerDone);
if (isCanceled) {
showSnackbarError(canceledMessage);
} else {
showSnackbarInfo(finishedMessage);
if (afterFinish) afterFinish();
}
}
apiOn(`runner-done-${runid}`, handleRunnerDone);
}
export async function saveExportedFile(filters, defaultPath, extension, dataName, getScript: (filaPath: string) => {}) {
const electron = getElectron();
let filePath;
let pureFileName;
if (electron) {
filePath = await electron.showSaveDialog({
filters,
defaultPath,
properties: ['showOverwriteConfirmation'],
});
} else {
const resp = await apiCall('files/generate-uploads-file', { extension });
filePath = resp.filePath;
pureFileName = resp.fileName;
}
if (!filePath) return;
const script = getScript(filePath);
runImportExportScript({
script,
runningMessage: `Exporting ${dataName}`,
canceledMessage: `Export ${dataName} canceled`,
finishedMessage: `Export ${dataName} finished`,
afterFinish: () => {
if (!electron) {
window.open(`${resolveApi()}/uploads/get?file=${pureFileName}`, '_blank');
}
},
});
}
export async function exportQuickExportFile(dataName, reader, format, columnMap = null) {
await saveExportedFile(
[{ name: format.label, extensions: [format.extension] }],
`${dataName}.${format.extension}`,
format.extension,
dataName,
filePath => {
const script = getCurrentConfig().allowShellScripting ? new ScriptWriter() : new ScriptWriterJson();
const sourceVar = script.allocVariable();
script.assign(sourceVar, reader.functionName, reader.props);
const targetVar = script.allocVariable();
const writer = format.createWriter(filePath, dataName);
script.assign(targetVar, writer.functionName, writer.props);
const colmap = normalizeExportColumnMap(columnMap);
let colmapVar = null;
if (colmap) {
colmapVar = script.allocVariable();
script.assignValue(colmapVar, colmap);
}
script.copyStream(sourceVar, targetVar, colmapVar);
script.endLine();
return script.getScript();
}
);
}
// export async function exportSqlDump(connection, databaseName) {
// await saveExportedFile(
// [{ name: 'SQL files', extensions: ['sql'] }],
// `${databaseName}.sql`,
// 'sql',
// `${databaseName}-dump`,
// filePath => {
// const script = getCurrentConfig().allowShellScripting ? new ScriptWriter() : new ScriptWriterJson();
// script.dumpDatabase({
// connection,
// databaseName,
// outputFile: filePath,
// });
// return script.getScript();
// }
// );
// }
export async function saveFileToDisk(
filePathFunc,
options: any = { formatLabel: 'HTML page', formatExtension: 'html' }
) {
const { formatLabel, formatExtension } = options;
const electron = getElectron();
if (electron) {
const filters = [{ name: formatLabel, extensions: [formatExtension] }];
const filePath = await electron.showSaveDialog({
filters,
defaultPath: `file.${formatExtension}`,
properties: ['showOverwriteConfirmation'],
});
if (!filePath) return;
await filePathFunc(filePath);
electron.openExternal('file:///' + filePath);
} else {
const resp = await apiCall('files/generate-uploads-file');
await filePathFunc(resp.filePath);
window.open(`${resolveApi()}/uploads/get?file=${resp.fileName}`, '_blank');
}
}
export function openWebLink(href) {
const electron = getElectron();
if (electron) {
electron.send('open-link', href);
} else {
window.open(href, '_blank');
}
}