diff --git a/packages/datalib/src/DataDuplicator.ts b/packages/datalib/src/DataDuplicator.ts index b58adc97e..50c0b6571 100644 --- a/packages/datalib/src/DataDuplicator.ts +++ b/packages/datalib/src/DataDuplicator.ts @@ -125,7 +125,7 @@ class DuplicatorItemHolder { // returns list of columns that are weak references and are not resolved async getMissingWeakRefsForRow(row): Promise { - if (!this.duplicator.options.setNullForUnresolvedNullableRefs) { + if (!this.duplicator.options.setNullForUnresolvedNullableRefs || !this.weakReferences?.length) { return []; } diff --git a/packages/web/src/appobj/DatabaseAppObject.svelte b/packages/web/src/appobj/DatabaseAppObject.svelte index 094b3d91f..77c2cb11c 100644 --- a/packages/web/src/appobj/DatabaseAppObject.svelte +++ b/packages/web/src/appobj/DatabaseAppObject.svelte @@ -311,6 +311,30 @@ await dbgateApi.dropAllDbObjects(${JSON.stringify( }); }; + const handleImportWithDbDuplicator = () => { + showModal(ChooseArchiveFolderModal, { + message: 'Choose archive folder for import from', + onConfirm: archiveFolder => { + openNewTab( + { + title: archiveFolder, + icon: 'img duplicator', + tabComponent: 'DataDuplicatorTab', + props: { + conid: connection?._id, + database: name, + }, + }, + { + editor: { + archiveFolder, + }, + } + ); + }, + }); + }; + const driver = findEngineDriver(connection, getExtensions()); const commands = _.flatten((apps || []).map(x => x.commands || [])); @@ -390,6 +414,14 @@ await dbgateApi.dropAllDbObjects(${JSON.stringify( text: 'Shell: Drop all objects', }, + driver?.databaseEngineTypes?.includes('sql') && + hasPermission(`dbops/import`) && { + onClick: handleImportWithDbDuplicator, + text: 'Import with DB duplicator', + }, + + { divider: true }, + commands.length > 0 && [ commands.map((cmd: any) => ({ text: cmd.name, @@ -451,6 +483,7 @@ await dbgateApi.dropAllDbObjects(${JSON.stringify( import { loadSchemaList, switchCurrentDatabase } from '../utility/common'; import { isProApp } from '../utility/proTools'; import ExportDbModelModal from '../modals/ExportDbModelModal.svelte'; + import ChooseArchiveFolderModal from '../modals/ChooseArchiveFolderModal.svelte'; export let data; export let passProps; diff --git a/packages/web/src/modals/ChooseArchiveFolderModal.svelte b/packages/web/src/modals/ChooseArchiveFolderModal.svelte new file mode 100644 index 000000000..8374f10fc --- /dev/null +++ b/packages/web/src/modals/ChooseArchiveFolderModal.svelte @@ -0,0 +1,33 @@ + + + + + Choose archive folder + +
{message}
+ + + + + { + closeCurrentModal(); + onConfirm(e.detail.archiveFolder); + }} + /> + + +
+
diff --git a/packages/web/src/tabs/DataDuplicatorTab.svelte b/packages/web/src/tabs/DataDuplicatorTab.svelte index 12259b825..fe7fa6da7 100644 --- a/packages/web/src/tabs/DataDuplicatorTab.svelte +++ b/packages/web/src/tabs/DataDuplicatorTab.svelte @@ -124,6 +124,7 @@ options: { rollbackAfterFinish: !!$editorState.value?.rollbackAfterFinish, skipRowsWithUnresolvedRefs: !!$editorState.value?.skipRowsWithUnresolvedRefs, + setNullForUnresolvedNullableRefs: !!$editorState.value?.setNullForUnresolvedNullableRefs, }, }); return script.getScript();