diff --git a/packages/datalib/src/index.ts b/packages/datalib/src/index.ts index 96252dcc..445e24bc 100644 --- a/packages/datalib/src/index.ts +++ b/packages/datalib/src/index.ts @@ -5,3 +5,4 @@ export * from "./ViewGridDisplay"; export * from "./JslGridDisplay"; export * from "./ChangeSet"; export * from "./filterName"; +export * from "./nameTools"; diff --git a/packages/datalib/src/nameTools.ts b/packages/datalib/src/nameTools.ts new file mode 100644 index 00000000..e000d3c8 --- /dev/null +++ b/packages/datalib/src/nameTools.ts @@ -0,0 +1,25 @@ +export function fullNameFromString(name) { + const m = name.match(/\[([^\]]+)\]\.\[([^\]]+)\]/); + if (m) { + return { + schemaName: m[1], + pureName: m[2], + }; + } + return { + schemaName: null, + pureName: name, + }; +} + +export function fullNameToString({ schemaName, pureName }) { + if (schemaName) { + return `[${schemaName}].[${pureName}]`; + } + return pureName; +} + +export function quoteFullName(dialect, { schemaName, pureName }) { + if (schemaName) return `${dialect.quoteIdentifier(schemaName)}.${dialect.quoteIdentifier(pureName)}`; + return `${dialect.quoteIdentifier(pureName)}`; +} diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index d9c5f86c..e884e03a 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -28,6 +28,7 @@ import { deleteChangeSetRows, batchUpdateChangeSet, setChangeSetValue, + fullNameToString, } from '@dbgate/datalib'; import { scriptToSql } from '@dbgate/sqltree'; import { copyTextToClipboard } from '../utility/clipboard'; @@ -603,9 +604,7 @@ export default function DataGridCore(props) { sourceStorageType: 'database', sourceConnectionId: conid, sourceDatabaseName: database, - sourceTables: [ - `${display.baseTable && display.baseTable.schemaName}.${display.baseTable && display.baseTable.pureName}`, - ], + sourceTables: display.baseTable ? [fullNameToString(display.baseTable)] : [], }} /> )); diff --git a/packages/web/src/impexp/ScriptWriter.js b/packages/web/src/impexp/ScriptWriter.js index 5da762f3..486f39e9 100644 --- a/packages/web/src/impexp/ScriptWriter.js +++ b/packages/web/src/impexp/ScriptWriter.js @@ -2,25 +2,26 @@ export default class ScriptWriter { constructor() { this.s = ''; this.put('const dbgateApi = require("@dbgate/api");'); + this.put(); this.put('async function run() {'); } - put(s) { + put(s = '') { this.s += s; this.s += '\n'; } finish() { - this.put('await dbgateApi.copyStream(queryReader, csvWriter);'); - this.put('dbgateApi.runScript(run);'); this.put('}'); + this.put(); + this.put('dbgateApi.runScript(run);'); } assign(variableName, functionName, props) { - this.put(`const ${variableName} = await dbgateApi.${functionName}(${JSON.stringify(props)});`); + this.put(` const ${variableName} = await dbgateApi.${functionName}(${JSON.stringify(props)});`); } copyStream(sourceVar, targetVar) { - this.put(`await dbgateApi.copyStream(${sourceVar}, ${targetVar});`); + this.put(` await dbgateApi.copyStream(${sourceVar}, ${targetVar});`); } } diff --git a/packages/web/src/impexp/createImpExpScript.js b/packages/web/src/impexp/createImpExpScript.js index 39cb61fa..f2b9f3b0 100644 --- a/packages/web/src/impexp/createImpExpScript.js +++ b/packages/web/src/impexp/createImpExpScript.js @@ -1,24 +1,9 @@ +import _ from 'lodash'; import ScriptCreator from './ScriptCreator'; import getAsArray from '../utility/getAsArray'; import { getConnectionInfo } from '../utility/metadataLoaders'; import engines from '@dbgate/engines'; - -function splitFullName(name) { - const i = name.indexOf('.'); - if (i >= 0) - return { - schemaName: name.substr(0, i), - pureName: name.substr(i + 1), - }; - return { - schemaName: null, - pureName: name, - }; -} -function quoteFullName(dialect, { schemaName, pureName }) { - if (schemaName) return `${dialect.quoteIdentifier(schemaName)}.${dialect.quoteIdentifier(pureName)}`; - return `${dialect.quoteIdentifier(pureName)}`; -} +import { quoteFullName, fullNameFromString } from '@dbgate/datalib'; export default async function createImpExpScript(values) { const script = new ScriptCreator(); @@ -29,10 +14,10 @@ export default async function createImpExpScript(values) { const connection = await getConnectionInfo({ conid: values.sourceConnectionId }); const driver = engines(connection); - const fullName = splitFullName(table); + const fullName = fullNameFromString(table); script.assign(sourceVar, 'queryReader', { connection: { - ...connection, + ..._.pick(connection, ['server', 'engine', 'user', 'password', 'port']), database: values.sourceDatabaseName, }, sql: `select * from ${quoteFullName(driver.dialect, fullName)}`, diff --git a/packages/web/src/utility/forms.js b/packages/web/src/utility/forms.js index e9ad0300..776d9cc0 100644 --- a/packages/web/src/utility/forms.js +++ b/packages/web/src/utility/forms.js @@ -7,6 +7,7 @@ import FormStyledButton from '../widgets/FormStyledButton'; import { useConnectionList, useDatabaseList, useDatabaseInfo } from './metadataLoaders'; import useSocket from './SocketProvider'; import getAsArray from './getAsArray'; +import { fullNameToString } from '@dbgate/datalib'; export const FormRow = styled.div` display: flex; @@ -143,7 +144,7 @@ export function FormTablesSelect({ conidName, databaseName, name }) { const tablesOptions = React.useMemo( () => [...((dbinfo && dbinfo.tables) || []), ...((dbinfo && dbinfo.views) || [])].map((x) => ({ - value: `${x.schemaName}.${x.pureName}`, + value: fullNameToString(x), label: x.pureName, })), [dbinfo]