ability to create string mongo IDs when importing

This commit is contained in:
Jan Prochazka
2021-12-09 09:10:07 +01:00
parent 5cc78c4e50
commit 82ae588d9a
7 changed files with 50 additions and 9 deletions

View File

@@ -48,6 +48,7 @@ export interface EngineDriver {
beforeConnectionSave?: (values: any) => any; beforeConnectionSave?: (values: any) => any;
databaseUrlPlaceholder?: string; databaseUrlPlaceholder?: string;
defaultAuthTypeName?: string; defaultAuthTypeName?: string;
importExportArgs?: any[];
connect({ server, port, user, password, database }): Promise<any>; connect({ server, port, user, password, database }): Promise<any>;
close(pool): Promise<any>; close(pool): Promise<any>;
query(pool: any, sql: string, options?: QueryOptions): Promise<QueryResult>; query(pool: any, sql: string, options?: QueryOptions): Promise<QueryResult>;

View File

@@ -14,12 +14,13 @@
import { findFileFormat, getFileFormatDirections } from '../plugins/fileformats'; import { findFileFormat, getFileFormatDirections } from '../plugins/fileformats';
import SqlEditor from '../query/SqlEditor.svelte'; import SqlEditor from '../query/SqlEditor.svelte';
import { currentArchive, currentDatabase, extensions } from '../stores'; import { currentArchive, currentDatabase, extensions } from '../stores';
import { useArchiveFiles, useDatabaseInfo } from '../utility/metadataLoaders'; import { useArchiveFiles, useConnectionInfo, useDatabaseInfo } from '../utility/metadataLoaders';
import FilesInput from './FilesInput.svelte'; import FilesInput from './FilesInput.svelte';
import FormConnectionSelect from './FormConnectionSelect.svelte'; import FormConnectionSelect from './FormConnectionSelect.svelte';
import FormDatabaseSelect from './FormDatabaseSelect.svelte'; import FormDatabaseSelect from './FormDatabaseSelect.svelte';
import FormSchemaSelect from './FormSchemaSelect.svelte'; import FormSchemaSelect from './FormSchemaSelect.svelte';
import FormTablesSelect from './FormTablesSelect.svelte'; import FormTablesSelect from './FormTablesSelect.svelte';
import { findEngineDriver } from 'dbgate-tools';
export let direction; export let direction;
export let storageTypeField; export let storageTypeField;
@@ -52,6 +53,8 @@
$: dbinfo = useDatabaseInfo({ conid: $values[connectionIdField], database: $values[databaseNameField] }); $: dbinfo = useDatabaseInfo({ conid: $values[connectionIdField], database: $values[databaseNameField] });
$: archiveFiles = useArchiveFiles({ folder: $values[archiveFolderField] }); $: archiveFiles = useArchiveFiles({ folder: $values[archiveFolderField] });
$: format = findFileFormat($extensions, storageType); $: format = findFileFormat($extensions, storageType);
$: connectionInfo = useConnectionInfo({ conid: $values[connectionIdField] });
$: driver = findEngineDriver($connectionInfo, $extensions);
</script> </script>
<div class="column"> <div class="column">
@@ -159,12 +162,20 @@
<FilesInput {setPreviewSource} /> <FilesInput {setPreviewSource} />
{/if} {/if}
{#if format && format.args} {#if format?.args}
<FormArgumentList <FormArgumentList
args={format.args.filter(arg => !arg.direction || arg.direction == direction)} args={format.args.filter(arg => !arg.direction || arg.direction == direction)}
namePrefix={`${direction}_${format.storageType}_`} namePrefix={`${direction}_${format.storageType}_`}
/> />
{/if} {/if}
{#if driver?.importExportArgs}
<FormArgumentList
args={driver?.importExportArgs.filter(arg => !arg.direction || arg.direction == direction)}
namePrefix={`${direction}_${driver.engine}_`}
/>
{/if}
</div> </div>
<style> <style>

View File

@@ -17,7 +17,7 @@ export function getTargetName(extensions, source, values) {
return source; return source;
} }
function extractApiParameters(values, direction, format) { function extractFormatApiParameters(values, direction, format) {
const pairs = (format.args || []) const pairs = (format.args || [])
.filter(arg => arg.apiName) .filter(arg => arg.apiName)
.map(arg => [arg.apiName, values[`${direction}_${format.storageType}_${arg.name}`]]) .map(arg => [arg.apiName, values[`${direction}_${format.storageType}_${arg.name}`]])
@@ -25,6 +25,14 @@ function extractApiParameters(values, direction, format) {
return _.fromPairs(pairs); return _.fromPairs(pairs);
} }
function extractDriverApiParameters(values, direction, driver) {
const pairs = (driver.importExportArgs || [])
.filter(arg => arg.apiName)
.map(arg => [arg.apiName, values[`${direction}_${driver.engine}_${arg.name}`]])
.filter(x => x[1] != null);
return _.fromPairs(pairs);
}
async function getConnection(extensions, storageType, conid, database) { async function getConnection(extensions, storageType, conid, database) {
if (storageType == 'database' || storageType == 'query') { if (storageType == 'database' || storageType == 'query') {
const conn = await getConnectionInfo({ conid }); const conn = await getConnectionInfo({ conid });
@@ -48,6 +56,7 @@ function getSourceExpr(extensions, sourceName, values, sourceConnection, sourceD
'tableReader', 'tableReader',
{ {
connection: sourceConnection, connection: sourceConnection,
...extractDriverApiParameters(values, 'source', sourceDriver),
...fullName, ...fullName,
}, },
]; ];
@@ -57,6 +66,7 @@ function getSourceExpr(extensions, sourceName, values, sourceConnection, sourceD
'queryReader', 'queryReader',
{ {
connection: sourceConnection, connection: sourceConnection,
...extractDriverApiParameters(values, 'source', sourceDriver),
sql: values.sourceSql, sql: values.sourceSql,
}, },
]; ];
@@ -69,7 +79,7 @@ function getSourceExpr(extensions, sourceName, values, sourceConnection, sourceD
format.readerFunc, format.readerFunc,
{ {
..._.omit(sourceFile, ['isDownload']), ..._.omit(sourceFile, ['isDownload']),
...extractApiParameters(values, 'source', format), ...extractFormatApiParameters(values, 'source', format),
}, },
]; ];
} }
@@ -121,7 +131,7 @@ function getTargetExpr(extensions, sourceName, values, targetConnection, targetD
: { : {
fileName: getTargetName(extensions, sourceName, values), fileName: getTargetName(extensions, sourceName, values),
}), }),
...extractApiParameters(values, 'target', format), ...extractFormatApiParameters(values, 'target', format),
}, },
]; ];
} }
@@ -132,6 +142,7 @@ function getTargetExpr(extensions, sourceName, values, targetConnection, targetD
connection: targetConnection, connection: targetConnection,
schemaName: values.targetSchemaName, schemaName: values.targetSchemaName,
pureName: getTargetName(extensions, sourceName, values), pureName: getTargetName(extensions, sourceName, values),
...extractDriverApiParameters(values, 'target', targetDriver),
...getFlagsFroAction(values[`actionType_${sourceName}`]), ...getFlagsFroAction(values[`actionType_${sourceName}`]),
}, },
]; ];

View File

@@ -63,8 +63,6 @@
} }
} }
// $: targetArchiveFolder = importToArchive ? `import-${moment().format('YYYY-MM-DD-hh-mm-ss')}` : $currentArchive;
$: effect = useEffect(() => registerRunnerDone(runnerId)); $: effect = useEffect(() => registerRunnerDone(runnerId));
function registerRunnerDone(rid) { function registerRunnerDone(rid) {

View File

@@ -1,3 +1,5 @@
const ObjectId = require('mongodb').ObjectId;
function createBulkInsertStream(driver, stream, pool, name, options) { function createBulkInsertStream(driver, stream, pool, name, options) {
const collectionName = name.pureName; const collectionName = name.pureName;
const db = pool.__getDatabase(); const db = pool.__getDatabase();
@@ -19,11 +21,17 @@ function createBulkInsertStream(driver, stream, pool, name, options) {
) )
return; return;
} }
if (options.createStringId) {
row = {
_id: new ObjectId().toString(),
...row,
}
}
writable.buffer.push(row); writable.buffer.push(row);
}; };
writable.checkStructure = async () => { writable.checkStructure = async () => {
if (options.dropIfExists || options.truncate) { if (options.dropIfExists) {
console.log(`Dropping collection ${collectionName}`); console.log(`Dropping collection ${collectionName}`);
await db.collection(collectionName).drop(); await db.collection(collectionName).drop();
} }

View File

@@ -59,7 +59,9 @@ const driver = {
? `mongodb://${user}:${password}@${server}:${port}` ? `mongodb://${user}:${password}@${server}:${port}`
: `mongodb://${server}:${port}`; : `mongodb://${server}:${port}`;
const options = {}; const options = {
useUnifiedTopology: true,
};
if (ssl) { if (ssl) {
options.tls = true; options.tls = true;
options.tlsCAFile = ssl.ca; options.tlsCAFile = ssl.ca;

View File

@@ -44,6 +44,16 @@ const driver = {
return ['server', 'port', 'user', 'password', 'defaultDatabase', 'singleDatabase'].includes(field); return ['server', 'port', 'user', 'password', 'defaultDatabase', 'singleDatabase'].includes(field);
}, },
importExportArgs: [
{
type: 'checkbox',
name: 'createStringId',
label: 'Create string _id attribute',
apiName: 'createStringId',
direction: 'target',
},
],
getCollectionUpdateScript(changeSet) { getCollectionUpdateScript(changeSet) {
let res = ''; let res = '';
for (const insert of changeSet.inserts) { for (const insert of changeSet.inserts) {