import from archive

This commit is contained in:
Jan Prochazka
2020-10-18 11:53:35 +02:00
parent e833853d3f
commit 6792b652fb
6 changed files with 88 additions and 21 deletions

View File

@@ -0,0 +1,11 @@
const path = require('path');
const { archivedir } = require('../utility/directories');
const jsonLinesReader = require('./jsonLinesReader');
function archiveReader({ folderName, fileName }) {
const jsonlFile = path.join(archivedir(), folderName, `${fileName}.jsonl`);
const res = jsonLinesReader({ fileName: jsonlFile });
return res;
}
module.exports = archiveReader;

View File

@@ -12,6 +12,7 @@ const jsonLinesWriter = require('./jsonLinesWriter');
const jsonLinesReader = require('./jsonLinesReader'); const jsonLinesReader = require('./jsonLinesReader');
const jslDataReader = require('./jslDataReader'); const jslDataReader = require('./jslDataReader');
const archiveWriter = require('./archiveWriter'); const archiveWriter = require('./archiveWriter');
const archiveReader = require('./archiveReader');
module.exports = { module.exports = {
queryReader, queryReader,
@@ -28,4 +29,5 @@ module.exports = {
consoleObjectWriter, consoleObjectWriter,
jslDataReader, jslDataReader,
archiveWriter, archiveWriter,
archiveReader,
}; };

View File

@@ -618,25 +618,26 @@ export default function DataGridCore(props) {
} }
function exportGrid() { function exportGrid() {
showModal((modalState) => ( const initialValues = {};
<ImportExportModal if (jslid) {
modalState={modalState} const archiveMatch = jslid.match(/^archive:\/\/([^/]+)\/(.*)$/);
initialValues={{ if (archiveMatch) {
// sourceStorageType: jslid ? 'jsldata' : 'database', initialValues.sourceStorageType = 'archive';
// sourceJslId: jslid, initialValues.sourceArchiveFolder = archiveMatch[1];
// sourceConnectionId: jslid ? undefined : conid, initialValues.sourceList = [archiveMatch[2]];
// sourceDatabaseName: jslid ? undefined : database, } else {
// sourceSchemaName: jslid ? undefined : display.baseTable && display.baseTable.schemaName, initialValues.sourceStorageType = 'jsldata';
// sourceList: jslid ? ['query-data'] : display.baseTable ? [display.baseTable.pureName] : [], initialValues.sourceJslId = jslid;
sourceStorageType: jslid ? 'jsldata' : 'query', initialValues.sourceList = ['query-data'];
sourceJslId: jslid, }
sourceConnectionId: jslid ? undefined : conid, } else {
sourceDatabaseName: jslid ? undefined : database, initialValues.sourceStorageType = 'query';
sourceSql: display.getExportQuery(), initialValues.sourceConnectionId = conid;
sourceList: jslid ? ['query-data'] : display.baseTable ? [display.baseTable.pureName] : [], initialValues.sourceDatabaseName = database;
}} initialValues.sourceSql = display.getExportQuery();
/> initialValues.sourceList = display.baseTable ? [display.baseTable.pureName] : [];
)); }
showModal((modalState) => <ImportExportModal modalState={modalState} initialValues={initialValues} />);
} }
function setCellValue(chs, cell, value) { function setCellValue(chs, cell, value) {

View File

@@ -10,8 +10,9 @@ import {
FormTablesSelect, FormTablesSelect,
FormSchemaSelect, FormSchemaSelect,
FormArchiveFolderSelect, FormArchiveFolderSelect,
FormArchiveFilesSelect,
} from '../utility/forms'; } from '../utility/forms';
import { useConnectionInfo, useDatabaseInfo } from '../utility/metadataLoaders'; import { useArchiveFiles, useConnectionInfo, useDatabaseInfo } from '../utility/metadataLoaders';
import TableControl, { TableColumn } from '../utility/TableControl'; import TableControl, { TableColumn } from '../utility/TableControl';
import { TextField, SelectField } from '../utility/inputs'; import { TextField, SelectField } from '../utility/inputs';
import { getActionOptions, getTargetName, isFileStorage } from './createImpExpScript'; import { getActionOptions, getTargetName, isFileStorage } from './createImpExpScript';
@@ -167,6 +168,7 @@ function SourceTargetConfig({
]; ];
const storageType = values[storageTypeField]; const storageType = values[storageTypeField];
const dbinfo = useDatabaseInfo({ conid: values[connectionIdField], database: values[databaseNameField] }); const dbinfo = useDatabaseInfo({ conid: values[connectionIdField], database: values[databaseNameField] });
const archiveFiles = useArchiveFiles({ folder: values[archiveFolderField] });
return ( return (
<Column> <Column>
{direction == 'source' && <Label>Source configuration</Label>} {direction == 'source' && <Label>Source configuration</Label>}
@@ -241,6 +243,26 @@ function SourceTargetConfig({
</> </>
)} )}
{storageType == 'archive' && direction == 'source' && (
<>
<Label>Source files</Label>
<FormArchiveFilesSelect folderName={values[archiveFolderField]} name={tablesField} />
<div>
<FormStyledButton
type="button"
value="All files"
onClick={() =>
setFieldValue(
'sourceList',
_.uniq([...(values.sourceList || []), ...(archiveFiles && archiveFiles.map((x) => x.name))])
)
}
/>
<FormStyledButton type="button" value="Remove all" onClick={() => setFieldValue('sourceList', [])} />
</div>
</>
)}
{isFileStorage(storageType) && direction == 'source' && <FilesInput />} {isFileStorage(storageType) && direction == 'source' && <FilesInput />}
</Column> </Column>
); );

View File

@@ -68,6 +68,15 @@ function getSourceExpr(sourceName, values, sourceConnection, sourceDriver) {
if (sourceStorageType == 'jsldata') { if (sourceStorageType == 'jsldata') {
return ['jslDataReader', { jslid: values.sourceJslId }]; return ['jslDataReader', { jslid: values.sourceJslId }];
} }
if (sourceStorageType == 'archive') {
return [
'archiveReader',
{
folderName: values.sourceArchiveFolder,
fileName: sourceName,
},
];
}
throw new Error(`Unknown source storage type: ${sourceStorageType}`); throw new Error(`Unknown source storage type: ${sourceStorageType}`);
} }

View File

@@ -5,7 +5,13 @@ import Creatable from 'react-select/creatable';
import { TextField, SelectField } from './inputs'; import { TextField, SelectField } from './inputs';
import { Field, useFormikContext } from 'formik'; import { Field, useFormikContext } from 'formik';
import FormStyledButton from '../widgets/FormStyledButton'; import FormStyledButton from '../widgets/FormStyledButton';
import { useConnectionList, useDatabaseList, useDatabaseInfo, useArchiveFolders } from './metadataLoaders'; import {
useConnectionList,
useDatabaseList,
useDatabaseInfo,
useArchiveFolders,
useArchiveFiles,
} from './metadataLoaders';
import useSocket from './SocketProvider'; import useSocket from './SocketProvider';
import getAsArray from './getAsArray'; import getAsArray from './getAsArray';
import axios from './axios'; import axios from './axios';
@@ -174,6 +180,22 @@ export function FormTablesSelect({ conidName, databaseName, schemaName, name })
return <FormReactSelect options={tablesOptions} name={name} isMulti />; return <FormReactSelect options={tablesOptions} name={name} isMulti />;
} }
export function FormArchiveFilesSelect({ folderName, name }) {
// const { values } = useFormikContext();
const files = useArchiveFiles({ folder: folderName });
const filesOptions = React.useMemo(
() =>
(files || []).map((x) => ({
value: x.name,
label: x.name,
})),
[files]
);
if (filesOptions.length == 0) return <div>Not available</div>;
return <FormReactSelect options={filesOptions} name={name} isMulti />;
}
export function FormArchiveFolderSelect({ name }) { export function FormArchiveFolderSelect({ name }) {
const { setFieldValue } = useFormikContext(); const { setFieldValue } = useFormikContext();
const folders = useArchiveFolders(); const folders = useArchiveFolders();