mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-19 18:56:00 +00:00
204 lines
5.9 KiB
TypeScript
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');
|
|
}
|
|
}
|