diff --git a/integration-tests/__tests__/schema-tests.spec.js b/integration-tests/__tests__/schema-tests.spec.js index 4edeb3c5e..5f5b4f04e 100644 --- a/integration-tests/__tests__/schema-tests.spec.js +++ b/integration-tests/__tests__/schema-tests.spec.js @@ -24,11 +24,13 @@ describe('Schema tests', () => { await baseStructure(conn, driver); const structure1 = await driver.analyseFull(conn); expect(structure1.schemas.find(x => x.schemaName == 'myschema')).toBeFalsy(); + const count = structure1.schemas.length; expect(structure1.tables.length).toEqual(2); await runCommandOnDriver(conn, driver, dmp => dmp.createSchema('myschema')); const structure2 = await driver.analyseIncremental(conn, structure1); expect(structure2.schemas.find(x => x.schemaName == 'myschema')).toBeTruthy(); expect(structure2.tables.length).toEqual(2); + expect(structure2.schemas.length).toEqual(count + 1); const structure3 = await driver.analyseIncremental(conn, structure2); expect(structure3).toBeNull(); @@ -53,6 +55,20 @@ describe('Schema tests', () => { expect(structure3).toBeNull(); }) ); + + test.each(engines.filter(x => x.supportSchemas).map(engine => [engine.label, engine]))( + 'Create table - keep schemas - %s', + testWrapper(async (conn, driver, engine) => { + await baseStructure(conn, driver); + const structure1 = await driver.analyseFull(conn); + const count = structure1.schemas.length; + expect(structure1.tables.length).toEqual(2); + await driver.query(conn, `create table t3 (id int not null primary key)`); + const structure2 = await driver.analyseIncremental(conn, structure1); + expect(structure2.tables.length).toEqual(3); + expect(structure2.schemas.length).toEqual(count); + }) + ); }); describe('Base analyser test', () => { diff --git a/packages/tools/src/DatabaseAnalyser.ts b/packages/tools/src/DatabaseAnalyser.ts index ab5a8dc12..9ebceaac4 100644 --- a/packages/tools/src/DatabaseAnalyser.ts +++ b/packages/tools/src/DatabaseAnalyser.ts @@ -132,7 +132,10 @@ export class DatabaseAnalyser { this.modifications = structureModifications; if (structureUpdated) this.structure = structureUpdated; logger.info({ modifications: this.modifications }, 'DB modifications detected:'); - return this.addEngineField(this.mergeAnalyseResult(await this._runAnalysis())); + return { + ...this.addEngineField(this.mergeAnalyseResult(await this._runAnalysis())), + schemas, + }; } mergeAnalyseResult(newlyAnalysed) { diff --git a/packages/web/src/elements/ObjectFieldsEditor.svelte b/packages/web/src/elements/ObjectFieldsEditor.svelte index 5deac34a3..337625f1a 100644 --- a/packages/web/src/elements/ObjectFieldsEditor.svelte +++ b/packages/web/src/elements/ObjectFieldsEditor.svelte @@ -4,8 +4,6 @@ import FormArgumentList from '../forms/FormArgumentList.svelte'; import { writable } from 'svelte/store'; import FormProviderCore from '../forms/FormProviderCore.svelte'; - import createRef from '../utility/createRef'; - import FormSchemaSelect from '../impexp/FormSchemaSelect.svelte'; import FormTextField from '../forms/FormTextField.svelte'; import FormSelectField from '../forms/FormSelectField.svelte'; @@ -39,6 +37,7 @@ {#if schemaList?.length > 0} ({ label: x.schemaName, value: x.schemaName }))} diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index f68403d7a..5f33b9104 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -148,6 +148,7 @@ export const loadingPluginStore = writable({ loadingPackageName: null, }); export const activeDbKeysStore = writableWithStorage({}, 'activeDbKeysStore'); +export const appliedCurrentSchema = writable(null); export const currentThemeDefinition = derived([currentTheme, extensions], ([$currentTheme, $extensions]) => $extensions.themes.find(x => x.themeClassName == $currentTheme) @@ -311,3 +312,9 @@ appUpdaterActive.subscribe(value => { appUpdaterActiveValue = value; }); export const getAppUpdaterActive = () => appUpdaterActiveValue; + +let appliedCurrentSchemaValue = null; +appliedCurrentSchema.subscribe(value => { + appliedCurrentSchemaValue = value; +}); +export const getAppliedCurrentSchema = () => appliedCurrentSchemaValue; diff --git a/packages/web/src/tableeditor/newTable.ts b/packages/web/src/tableeditor/newTable.ts index df8285c9d..1048abd0f 100644 --- a/packages/web/src/tableeditor/newTable.ts +++ b/packages/web/src/tableeditor/newTable.ts @@ -1,7 +1,7 @@ import _ from 'lodash'; import openNewTab from '../utility/openNewTab'; import { findEngineDriver, getConnectionLabel } from 'dbgate-tools'; -import { getExtensions } from '../stores'; +import { getAppliedCurrentSchema, getExtensions } from '../stores'; export default function newTable(connection, database) { const tooltip = `${getConnectionLabel(connection)}\n${database}`; @@ -21,7 +21,7 @@ export default function newTable(connection, database) { editor: { current: { pureName: 'new_table', - schemaName: driver?.dialect?.defaultSchemaName, + schemaName: getAppliedCurrentSchema() ?? driver?.dialect?.defaultSchemaName, columns: [ { columnName: 'id', diff --git a/packages/web/src/widgets/SchemaSelector.svelte b/packages/web/src/widgets/SchemaSelector.svelte index bfb457e04..6f4350f6c 100644 --- a/packages/web/src/widgets/SchemaSelector.svelte +++ b/packages/web/src/widgets/SchemaSelector.svelte @@ -9,34 +9,30 @@ import ConfirmModal from '../modals/ConfirmModal.svelte'; import { runOperationOnDatabase } from '../modals/ConfirmSqlModal.svelte'; import InputTextModal from '../modals/InputTextModal.svelte'; + import { appliedCurrentSchema } from '../stores'; export let dbinfo: DatabaseInfo; export let selectedSchema; export let objectList; - export let onApplySelectedSchema; export let valueStorageKey; export let conid; export let database; - let appliedSchema; - $: { if (selectedSchema != null) { - appliedSchema = selectedSchema; + $appliedCurrentSchema = selectedSchema; } else { const usedSchemas = Object.keys(countBySchema); if (usedSchemas.length == 1) { - appliedSchema = usedSchemas[0]; + $appliedCurrentSchema = usedSchemas[0]; } else { - appliedSchema = null; + $appliedCurrentSchema = null; } } } - $: onApplySelectedSchema(appliedSchema); - function computeCountBySchema(list) { const res = {}; for (const item of list) { @@ -63,18 +59,20 @@ type: 'createSchema', schemaName: name, }); - selectedSchema = name; + if (selectedSchema) { + selectedSchema = name; + } }, }); } function handleDropSchema() { showModal(ConfirmModal, { - message: `Really drop schema ${appliedSchema}?`, + message: `Really drop schema ${$appliedCurrentSchema}?`, onConfirm: async () => { const dbid = { conid, database }; runOperationOnDatabase(dbid, { type: 'dropSchema', - schemaName: appliedSchema, + schemaName: $appliedCurrentSchema, }); selectedSchema = null; }, @@ -95,7 +93,7 @@ // ...schemaList.filter(x => countBySchema[x]).map(x => ({ label: `${x} (${countBySchema[x] ?? 0})`, value: x })), // ...schemaList.filter(x => !countBySchema[x]).map(x => ({ label: `${x} (${countBySchema[x] ?? 0})`, value: x })), ]} - value={selectedSchema ?? appliedSchema ?? ''} + value={selectedSchema ?? $appliedCurrentSchema ?? ''} on:change={e => { selectedSchema = e.detail; localStorage.setItem(valueStorageKey, e.detail); @@ -116,7 +114,7 @@ - + diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 7c2ec45fd..203f8eeeb 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -36,13 +36,13 @@ import { apiCall } from '../utility/api'; import { filterAppsForDatabase } from '../utility/appTools'; import SchemaSelector from './SchemaSelector.svelte'; + import { appliedCurrentSchema } from '../stores'; export let conid; export let database; let filter = ''; let selectedSchema = null; - let appliedSelectedSchema = null; $: objects = useDatabaseInfo({ conid, database }); $: status = useDatabaseStatus({ conid, database }); @@ -147,9 +147,6 @@ dbinfo={$objects} bind:selectedSchema objectList={flatFilteredList} - onApplySelectedSchema={x => { - appliedSelectedSchema = x; - }} valueStorageKey={`sql-object-list-schema-${conid}-${database}`} {conid} {database} @@ -161,7 +158,7 @@ {:else} (appliedSelectedSchema ? x.schemaName == appliedSelectedSchema : true)) + .filter(x => ($appliedCurrentSchema ? x.schemaName == $appliedCurrentSchema : true)) .map(x => ({ ...x, conid, database }))} module={databaseObjectAppObject} groupFunc={data => getObjectTypeFieldLabel(data.objectTypeField, driver)} @@ -173,7 +170,7 @@ passProps={{ showPinnedInsteadOfUnpin: true, connection: $connection, - hideSchemaName: !!appliedSelectedSchema, + hideSchemaName: !!$appliedCurrentSchema, }} /> {/if}