diff --git a/packages/web/src/modals/ImportExportModal.svelte b/packages/web/src/modals/ImportExportModal.svelte index 92b20983d..6d4b2071c 100644 --- a/packages/web/src/modals/ImportExportModal.svelte +++ b/packages/web/src/modals/ImportExportModal.svelte @@ -3,6 +3,7 @@ import { writable } from 'svelte/store'; import HorizontalSplitter from '../elements/HorizontalSplitter.svelte'; import LargeButton from '../elements/LargeButton.svelte'; + import LoadingInfo from '../elements/LoadingInfo.svelte'; import VerticalSplitter from '../elements/VerticalSplitter.svelte'; import FormProvider from '../forms/FormProvider.svelte'; @@ -146,6 +147,10 @@
+ + {#if busy} + + {/if}
diff --git a/plugins/dbgate-plugin-xml/src/backend/reader.js b/plugins/dbgate-plugin-xml/src/backend/reader.js index 47ecc7d37..234c5bd2d 100644 --- a/plugins/dbgate-plugin-xml/src/backend/reader.js +++ b/plugins/dbgate-plugin-xml/src/backend/reader.js @@ -5,10 +5,21 @@ const NodeXmlStream = require('node-xml-stream'); class ParseStream extends stream.Transform { constructor({ itemElementName }) { super({ objectMode: true }); + + let element = itemElementName; + + this.push({ + __isStreamHeader: true, + __isDynamicStructure: true, + }); + this.rowsWritten = 0; this.parser = new NodeXmlStream(); this.stack = []; this.parser.on('opentag', (name, attrs) => { + if (!element && this.stack.length == 1) { + element = name; + } this.stack.push({ name, attrs, nodes: {} }); }); this.parser.on('text', (text) => { @@ -17,9 +28,12 @@ class ParseStream extends stream.Transform { } }); this.parser.on('closetag', (name, attrs) => { - if (name == itemElementName) { - this.rowsWritten += 1; - this.push({ ...this.stack[this.stack.length - 1].attrs, ...this.stack[this.stack.length - 1].nodes }); + if (name == element) { + const obj = { ...this.stack[this.stack.length - 1].attrs, ...this.stack[this.stack.length - 1].nodes }; + if (Object.keys(obj).length > 0) { + this.rowsWritten += 1; + this.push(obj); + } } this.stack.splice(-1); });