frontend - removed references to dbgate-engines

This commit is contained in:
Jan Prochazka
2020-11-24 20:15:07 +01:00
parent 644a35d8c3
commit 424aff5d93
10 changed files with 75 additions and 20 deletions

View File

@@ -1,6 +1,20 @@
import { SqlDumper } from "./SqlDumper";
const dialect = {
limitSelect: true,
rangeSelect: true,
offsetFetchRangeSyntax: true,
stringEscapeChar: "'",
fallbackDataType: 'nvarchar(max)',
quoteIdentifier(s) {
return s;
},
};
export const driverBase = { export const driverBase = {
analyserClass: null, analyserClass: null,
dumperClass: null, dumperClass: SqlDumper,
dialect,
async analyseFull(pool) { async analyseFull(pool) {
const analyser = new this.analyserClass(pool, this); const analyser = new this.analyserClass(pool, this);

View File

@@ -1,4 +1,7 @@
import { EngineDriver, ExtensionsDirectory } from 'dbgate-types';
import _camelCase from 'lodash/camelCase'; import _camelCase from 'lodash/camelCase';
import _isString from 'lodash/isString';
import _isPlainObject from 'lodash/isPlainObject';
export function extractShellApiPlugins(functionName, props): string[] { export function extractShellApiPlugins(functionName, props): string[] {
const res = []; const res = [];
@@ -22,3 +25,16 @@ export function extractShellApiFunctionName(functionName) {
} }
return `dbgateApi.${functionName}`; return `dbgateApi.${functionName}`;
} }
export function findEngineDriver(connection, extensions: ExtensionsDirectory): EngineDriver {
if (_isString(connection)) {
return extensions.drivers.find((x) => x.engine == connection);
}
if (_isPlainObject(connection)) {
const { engine } = connection;
if (engine) {
return extensions.drivers.find((x) => x.engine == engine);
}
}
return null;
}

View File

@@ -20,6 +20,7 @@ export interface WriteTableOptions {
export interface EngineDriver { export interface EngineDriver {
engine: string; engine: string;
title: string;
connect(nativeModules, { server, port, user, password, database }): any; connect(nativeModules, { server, port, user, password, database }): any;
query(pool: any, sql: string): Promise<QueryResult>; query(pool: any, sql: string): Promise<QueryResult>;
stream(pool: any, sql: string, options: StreamOptions); stream(pool: any, sql: string, options: StreamOptions);

View File

@@ -1,3 +1,5 @@
import { EngineDriver } from "./engines";
export interface FileFormatDefinition { export interface FileFormatDefinition {
storageType: string; storageType: string;
extension: string; extension: string;
@@ -27,4 +29,5 @@ export interface PluginDefinition {
export interface ExtensionsDirectory { export interface ExtensionsDirectory {
plugins: PluginDefinition[]; plugins: PluginDefinition[];
fileFormats: FileFormatDefinition[]; fileFormats: FileFormatDefinition[];
drivers: EngineDriver[];
} }

View File

@@ -4,13 +4,14 @@ import DataGrid from './DataGrid';
import styled from 'styled-components'; import styled from 'styled-components';
import { TableGridDisplay, createGridConfig, createGridCache } from 'dbgate-datalib'; import { TableGridDisplay, createGridConfig, createGridCache } from 'dbgate-datalib';
import { getFilterValueExpression } from 'dbgate-filterparser'; import { getFilterValueExpression } from 'dbgate-filterparser';
import { findEngineDriver } from 'dbgate-tools';
import { useConnectionInfo, getTableInfo, useDatabaseInfo } from '../utility/metadataLoaders'; import { useConnectionInfo, getTableInfo, useDatabaseInfo } from '../utility/metadataLoaders';
import engines from 'dbgate-engines';
import useSocket from '../utility/SocketProvider'; import useSocket from '../utility/SocketProvider';
import { VerticalSplitter } from '../widgets/Splitter'; import { VerticalSplitter } from '../widgets/Splitter';
import stableStringify from 'json-stable-stringify'; import stableStringify from 'json-stable-stringify';
import ReferenceHeader from './ReferenceHeader'; import ReferenceHeader from './ReferenceHeader';
import SqlDataGridCore from './SqlDataGridCore'; import SqlDataGridCore from './SqlDataGridCore';
import useExtensions from '../utility/useExtensions';
const ReferenceContainer = styled.div` const ReferenceContainer = styled.div`
position: absolute; position: absolute;
@@ -49,6 +50,7 @@ export default function TableDataGrid({
const [childCache, setChildCache] = React.useState(createGridCache()); const [childCache, setChildCache] = React.useState(createGridCache());
const [refReloadToken, setRefReloadToken] = React.useState(0); const [refReloadToken, setRefReloadToken] = React.useState(0);
const [myLoadedTime, setMyLoadedTime] = React.useState(0); const [myLoadedTime, setMyLoadedTime] = React.useState(0);
const extension = useExtensions();
const { childConfig } = config; const { childConfig } = config;
const setChildConfig = (value, reference = undefined) => { const setChildConfig = (value, reference = undefined) => {
@@ -75,7 +77,7 @@ export default function TableDataGrid({
return connection return connection
? new TableGridDisplay( ? new TableGridDisplay(
{ schemaName, pureName }, { schemaName, pureName },
engines(connection), findEngineDriver(connection, extension),
config, config,
setConfig, setConfig,
cache || myCache, cache || myCache,

View File

@@ -2,8 +2,7 @@ import _ from 'lodash';
import ScriptWriter from './ScriptWriter'; import ScriptWriter from './ScriptWriter';
import getAsArray from '../utility/getAsArray'; import getAsArray from '../utility/getAsArray';
import { getConnectionInfo } from '../utility/metadataLoaders'; import { getConnectionInfo } from '../utility/metadataLoaders';
import engines from 'dbgate-engines'; import { findEngineDriver, findObjectLike } from 'dbgate-tools';
import { findObjectLike } from 'dbgate-tools';
import { findFileFormat } from '../utility/fileformats'; import { findFileFormat } from '../utility/fileformats';
export function getTargetName(extensions, source, values) { export function getTargetName(extensions, source, values) {
@@ -26,10 +25,10 @@ function extractApiParameters(values, direction, format) {
return _.fromPairs(pairs); return _.fromPairs(pairs);
} }
async function getConnection(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 });
const driver = engines(conn); const driver = findEngineDriver(conn, extensions);
return [ return [
{ {
..._.pick(conn, ['server', 'engine', 'user', 'password', 'port']), ..._.pick(conn, ['server', 'engine', 'user', 'password', 'port']),
@@ -154,11 +153,13 @@ export default async function createImpExpScript(extensions, values, addEditorIn
const script = new ScriptWriter(); const script = new ScriptWriter();
const [sourceConnection, sourceDriver] = await getConnection( const [sourceConnection, sourceDriver] = await getConnection(
extensions,
values.sourceStorageType, values.sourceStorageType,
values.sourceConnectionId, values.sourceConnectionId,
values.sourceDatabaseName values.sourceDatabaseName
); );
const [targetConnection, targetDriver] = await getConnection( const [targetConnection, targetDriver] = await getConnection(
extensions,
values.targetStorageType, values.targetStorageType,
values.targetConnectionId, values.targetConnectionId,
values.targetDatabaseName values.targetDatabaseName
@@ -223,6 +224,7 @@ export function getActionOptions(extensions, source, values, targetDbinfo) {
export async function createPreviewReader(extensions, values, sourceName) { export async function createPreviewReader(extensions, values, sourceName) {
const [sourceConnection, sourceDriver] = await getConnection( const [sourceConnection, sourceDriver] = await getConnection(
extensions,
values.sourceStorageType, values.sourceStorageType,
values.sourceConnectionId, values.sourceConnectionId,
values.sourceDatabaseName values.sourceDatabaseName

View File

@@ -7,10 +7,12 @@ import { Formik, Form } from 'formik';
import ModalHeader from './ModalHeader'; import ModalHeader from './ModalHeader';
import ModalFooter from './ModalFooter'; import ModalFooter from './ModalFooter';
import ModalContent from './ModalContent'; import ModalContent from './ModalContent';
import useExtensions from '../utility/useExtensions';
// import FormikForm from '../utility/FormikForm'; // import FormikForm from '../utility/FormikForm';
export default function ConnectionModal({ modalState, connection = undefined }) { export default function ConnectionModal({ modalState, connection = undefined }) {
const [sqlConnectResult, setSqlConnectResult] = React.useState('Not connected'); const [sqlConnectResult, setSqlConnectResult] = React.useState('Not connected');
const extensions = useExtensions();
const handleTest = async (values) => { const handleTest = async (values) => {
const resp = await axios.post('connections/test', values); const resp = await axios.post('connections/test', values);
@@ -31,9 +33,15 @@ export default function ConnectionModal({ modalState, connection = undefined })
<Form> <Form>
<ModalContent> <ModalContent>
<FormSelectField label="Database engine" name="engine"> <FormSelectField label="Database engine" name="engine">
<option value="mssql">Microsoft SQL Server</option> <option value=""></option>
{extensions.drivers.map((driver) => (
<option value={driver.engine} key={driver.engine}>
{driver.title}
</option>
))}
{/* <option value="mssql">Microsoft SQL Server</option>
<option value="mysql">MySQL</option> <option value="mysql">MySQL</option>
<option value="postgres">Postgre SQL</option> <option value="postgres">Postgre SQL</option> */}
</FormSelectField> </FormSelectField>
<FormTextField label="Server" name="server" /> <FormTextField label="Server" name="server" />
<FormTextField label="Port" name="port" /> <FormTextField label="Port" name="port" />

View File

@@ -2,14 +2,8 @@ import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import _ from 'lodash'; import _ from 'lodash';
import axios from '../utility/axios'; import axios from '../utility/axios';
import engines from 'dbgate-engines';
import { import { useConnectionInfo, getDbCore, getConnectionInfo, getSqlObjectInfo } from '../utility/metadataLoaders';
useConnectionInfo,
getDbCore,
getConnectionInfo,
getSqlObjectInfo,
} from '../utility/metadataLoaders';
import SqlEditor from '../sqleditor/SqlEditor'; import SqlEditor from '../sqleditor/SqlEditor';
import { useUpdateDatabaseForTab, useSetOpenedTabs, useOpenedTabs } from '../utility/globalState'; import { useUpdateDatabaseForTab, useSetOpenedTabs, useOpenedTabs } from '../utility/globalState';
import QueryToolbar from '../query/QueryToolbar'; import QueryToolbar from '../query/QueryToolbar';
@@ -23,15 +17,18 @@ import useSocket from '../utility/SocketProvider';
import SaveSqlFileModal from '../modals/SaveSqlFileModal'; import SaveSqlFileModal from '../modals/SaveSqlFileModal';
import useModalState from '../modals/useModalState'; import useModalState from '../modals/useModalState';
import sqlFormatter from 'sql-formatter'; import sqlFormatter from 'sql-formatter';
import useExtensions from '../utility/useExtensions';
import { driverBase, findEngineDriver } from 'dbgate-tools';
function useSqlTemplate(sqlTemplate, props) { function useSqlTemplate(sqlTemplate, props) {
const [sql, setSql] = React.useState(''); const [sql, setSql] = React.useState('');
const extensions = useExtensions();
async function loadTemplate() { async function loadTemplate() {
if (sqlTemplate == 'CREATE TABLE') { if (sqlTemplate == 'CREATE TABLE') {
const tableInfo = await getDbCore(props, props.objectTypeField || 'tables'); const tableInfo = await getDbCore(props, props.objectTypeField || 'tables');
const connection = await getConnectionInfo(props); const connection = await getConnectionInfo(props);
const driver = engines(connection.engine); const driver = findEngineDriver(connection, extensions) || driverBase;
const dmp = driver.createDumper(); const dmp = driver.createDumper();
if (tableInfo) dmp.createTable(tableInfo); if (tableInfo) dmp.createTable(tableInfo);
setSql(dmp.s); setSql(dmp.s);
@@ -47,7 +44,7 @@ function useSqlTemplate(sqlTemplate, props) {
const procedureInfo = await getSqlObjectInfo(props); const procedureInfo = await getSqlObjectInfo(props);
const connection = await getConnectionInfo(props); const connection = await getConnectionInfo(props);
const driver = engines(connection.engine); const driver = findEngineDriver(connection, extensions) || driverBase;
const dmp = driver.createDumper(); const dmp = driver.createDumper();
if (procedureInfo) dmp.put('^execute %f', procedureInfo); if (procedureInfo) dmp.put('^execute %f', procedureInfo);
setSql(dmp.s); setSql(dmp.s);

View File

@@ -2,18 +2,20 @@ import React from 'react';
import DataGrid from '../datagrid/DataGrid'; import DataGrid from '../datagrid/DataGrid';
import { ViewGridDisplay, createGridCache, createChangeSet } from 'dbgate-datalib'; import { ViewGridDisplay, createGridCache, createChangeSet } from 'dbgate-datalib';
import { useConnectionInfo, useViewInfo } from '../utility/metadataLoaders'; import { useConnectionInfo, useViewInfo } from '../utility/metadataLoaders';
import engines from 'dbgate-engines';
import useUndoReducer from '../utility/useUndoReducer'; import useUndoReducer from '../utility/useUndoReducer';
import usePropsCompare from '../utility/usePropsCompare'; import usePropsCompare from '../utility/usePropsCompare';
import { useUpdateDatabaseForTab } from '../utility/globalState'; import { useUpdateDatabaseForTab } from '../utility/globalState';
import useGridConfig from '../utility/useGridConfig'; import useGridConfig from '../utility/useGridConfig';
import SqlDataGridCore from '../datagrid/SqlDataGridCore'; import SqlDataGridCore from '../datagrid/SqlDataGridCore';
import useExtensions from '../utility/useExtensions';
import { findEngineDriver } from 'dbgate-tools';
export default function ViewDataTab({ conid, database, schemaName, pureName, tabVisible, toolbarPortalRef, tabid }) { export default function ViewDataTab({ conid, database, schemaName, pureName, tabVisible, toolbarPortalRef, tabid }) {
const viewInfo = useViewInfo({ conid, database, schemaName, pureName }); const viewInfo = useViewInfo({ conid, database, schemaName, pureName });
const [config, setConfig] = useGridConfig(tabid); const [config, setConfig] = useGridConfig(tabid);
const [cache, setCache] = React.useState(createGridCache()); const [cache, setCache] = React.useState(createGridCache());
const [changeSetState, dispatchChangeSet] = useUndoReducer(createChangeSet()); const [changeSetState, dispatchChangeSet] = useUndoReducer(createChangeSet());
const extensions = useExtensions()
useUpdateDatabaseForTab(tabVisible, conid, database); useUpdateDatabaseForTab(tabVisible, conid, database);
const connection = useConnectionInfo({ conid }); const connection = useConnectionInfo({ conid });
@@ -25,7 +27,7 @@ export default function ViewDataTab({ conid, database, schemaName, pureName, tab
viewInfo && connection viewInfo && connection
? new ViewGridDisplay( ? new ViewGridDisplay(
viewInfo, viewInfo,
engines(connection), findEngineDriver(connection, extensions),
//@ts-ignore //@ts-ignore
config, config,
setConfig, setConfig,

View File

@@ -10,11 +10,21 @@ export function ExtensionsProvider({ children }) {
return <ExtensionsContext.Provider value={extensions}>{children}</ExtensionsContext.Provider>; return <ExtensionsContext.Provider value={extensions}>{children}</ExtensionsContext.Provider>;
} }
function buildDrivers(plugins) {
const res = [];
for (const { content } of plugins) {
if (content.driver) res.push(content.driver);
if (content.drivers) res.push(...content.drivers);
}
return res;
}
export function buildExtensions(plugins) { export function buildExtensions(plugins) {
/** @type {import('dbgate-types').ExtensionsDirectory} */ /** @type {import('dbgate-types').ExtensionsDirectory} */
const extensions = { const extensions = {
plugins, plugins,
fileFormats: buildFileFormats(plugins), fileFormats: buildFileFormats(plugins),
drivers: buildDrivers(plugins),
}; };
return extensions; return extensions;
} }