single database configuration

This commit is contained in:
Jan Prochazka
2020-12-10 11:11:03 +01:00
parent 3921913742
commit 698756b9d2
6 changed files with 61 additions and 7 deletions

View File

@@ -7,6 +7,7 @@
"scripts": { "scripts": {
"start:api": "yarn workspace dbgate-api start", "start:api": "yarn workspace dbgate-api start",
"start:api:portal": "yarn workspace dbgate-api start:portal", "start:api:portal": "yarn workspace dbgate-api start:portal",
"start:api:covid": "yarn workspace dbgate-api start:covid",
"start:web": "yarn workspace dbgate-web start", "start:web": "yarn workspace dbgate-web start",
"start:sqltree": "yarn workspace dbgate-sqltree start", "start:sqltree": "yarn workspace dbgate-sqltree start",
"start:tools": "yarn workspace dbgate-tools start", "start:tools": "yarn workspace dbgate-tools start",

10
packages/api/.covid-env Normal file
View File

@@ -0,0 +1,10 @@
CONNECTIONS=mysql
LABEL_mysql=MySql
SERVER_mysql=dbgate.org
USER_mysql=reader
PASSWORD_mysql=CovidReader2020
PORT_mysql=3326
ENGINE_mysql=mysql@dbgate-plugin-mysql
SINGLE_CONNECTION=mysql
SINGLE_DATABASE=covid

View File

@@ -45,6 +45,7 @@
"scripts": { "scripts": {
"start": "nodemon src/index.js", "start": "nodemon src/index.js",
"start:portal": "env-cmd nodemon src/index.js", "start:portal": "env-cmd nodemon src/index.js",
"start:covid": "env-cmd -f .covid-env nodemon src/index.js",
"ts": "tsc", "ts": "tsc",
"build": "webpack" "build": "webpack"
}, },

View File

@@ -15,6 +15,13 @@ module.exports = {
runAsPortal: !!process.env.CONNECTIONS, runAsPortal: !!process.env.CONNECTIONS,
toolbar, toolbar,
startupPages, startupPages,
singleDatabase:
process.env.SINGLE_CONNECTION && process.env.SINGLE_DATABASE
? {
conid: process.env.SINGLE_CONNECTION,
database: process.env.SINGLE_DATABASE,
}
: null,
}; };
}, },
}; };

View File

@@ -1,7 +1,7 @@
import _ from 'lodash'; import _ from 'lodash';
import React from 'react'; import React from 'react';
import useStorage from './useStorage'; import useStorage from './useStorage';
import { useConnectionInfo, useConfig } from './metadataLoaders'; import { useConnectionInfo, useConfig, getConnectionInfo } from './metadataLoaders';
import usePrevious from './usePrevious'; import usePrevious from './usePrevious';
import useNewQuery from '../query/useNewQuery'; import useNewQuery from '../query/useNewQuery';
import useShowModal from '../modals/showModal'; import useShowModal from '../modals/showModal';
@@ -48,11 +48,11 @@ function createStorageState(storageKey, defaultValue) {
const [CurrentWidgetProvider, useCurrentWidget, useSetCurrentWidget] = createGlobalState('database'); const [CurrentWidgetProvider, useCurrentWidget, useSetCurrentWidget] = createGlobalState('database');
export { CurrentWidgetProvider, useCurrentWidget, useSetCurrentWidget }; export { CurrentWidgetProvider, useCurrentWidget, useSetCurrentWidget };
const [CurrentDatabaseProvider, useCurrentDatabase, useSetCurrentDatabaseCore] = createGlobalState(null); const [CurrentDatabaseProvider, useCurrentDatabaseCore, useSetCurrentDatabaseCore] = createGlobalState(null);
function useSetCurrentDatabase() { function useSetCurrentDatabase() {
const setDb = useSetCurrentDatabaseCore(); const setDb = useSetCurrentDatabaseCore();
const db = useCurrentDatabase(); const db = useCurrentDatabaseCore();
return (value) => { return (value) => {
if (_.get(db, 'name') !== _.get(value, 'name') || _.get(db, 'connection._id') != _.get(value, 'connection._id')) { if (_.get(db, 'name') !== _.get(value, 'name') || _.get(db, 'connection._id') != _.get(value, 'connection._id')) {
setDb(value); setDb(value);
@@ -60,6 +60,33 @@ function useSetCurrentDatabase() {
}; };
} }
function useCurrentDatabase() {
const config = useConfig();
const db = useCurrentDatabaseCore();
const [connection, setConnection] = React.useState(null);
const loadSingleConnection = async () => {
if (config && config.singleDatabase) {
const conn = await getConnectionInfo({ conid: config.singleDatabase.conid });
setConnection(conn);
}
};
React.useEffect(() => {
loadSingleConnection();
}, [config]);
if (config && config.singleDatabase) {
if (connection) {
return {
connection,
name: config.singleDatabase.database,
};
}
return null;
}
return db;
}
export { CurrentDatabaseProvider, useCurrentDatabase, useSetCurrentDatabase }; export { CurrentDatabaseProvider, useCurrentDatabase, useSetCurrentDatabase };
const [OpenedTabsProvider, useOpenedTabs, useSetOpenedTabs] = createStorageState('openedTabs', []); const [OpenedTabsProvider, useOpenedTabs, useSetOpenedTabs] = createStorageState('openedTabs', []);

View File

@@ -14,6 +14,7 @@ import {
useServerStatus, useServerStatus,
useDatabaseStatus, useDatabaseStatus,
useDatabaseInfo, useDatabaseInfo,
useConfig,
} from '../utility/metadataLoaders'; } from '../utility/metadataLoaders';
import { import {
SearchBoxWrapper, SearchBoxWrapper,
@@ -131,7 +132,11 @@ function SqlObjectListWrapper() {
const db = useCurrentDatabase(); const db = useCurrentDatabase();
if (!db) { if (!db) {
return <ErrorInfo message="Database not selected" icon="img alert" />; return (
<WidgetsInnerContainer>
<ErrorInfo message="Database not selected" icon="img alert" />
</WidgetsInnerContainer>
);
} }
const { name, connection } = db; const { name, connection } = db;
@@ -141,11 +146,14 @@ function SqlObjectListWrapper() {
} }
export default function DatabaseWidget() { export default function DatabaseWidget() {
const config = useConfig();
return ( return (
<WidgetColumnBar> <WidgetColumnBar>
<WidgetColumnBarItem title="Connections" name="connections" height="50%"> {!config.singleDatabase && (
<ConnectionList /> <WidgetColumnBarItem title="Connections" name="connections" height="50%">
</WidgetColumnBarItem> <ConnectionList />
</WidgetColumnBarItem>
)}
<WidgetColumnBarItem title="Tables, views, functions" name="dbObjects"> <WidgetColumnBarItem title="Tables, views, functions" name="dbObjects">
<SqlObjectListWrapper /> <SqlObjectListWrapper />
</WidgetColumnBarItem> </WidgetColumnBarItem>