diff --git a/integration-tests/__tests__/schema-tests.spec.js b/integration-tests/__tests__/schema-tests.spec.js index 5f5b4f04e..38dbed4e8 100644 --- a/integration-tests/__tests__/schema-tests.spec.js +++ b/integration-tests/__tests__/schema-tests.spec.js @@ -23,17 +23,16 @@ describe('Schema tests', () => { testWrapper(async (conn, driver, engine) => { await baseStructure(conn, driver); const structure1 = await driver.analyseFull(conn); - expect(structure1.schemas.find(x => x.schemaName == 'myschema')).toBeFalsy(); - const count = structure1.schemas.length; + const schemas1 = await driver.listSchemas(conn); + expect(schemas1.find(x => x.schemaName == 'myschema')).toBeFalsy(); + const count = schemas1.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(); + const schemas2 = await driver.listSchemas(conn); + expect(schemas2.find(x => x.schemaName == 'myschema')).toBeTruthy(); + expect(schemas2.length).toEqual(count + 1); + expect(structure2).toBeNull(); }) ); @@ -44,29 +43,14 @@ describe('Schema tests', () => { await runCommandOnDriver(conn, driver, dmp => dmp.createSchema('myschema')); const structure1 = await driver.analyseFull(conn); - expect(structure1.schemas.find(x => x.schemaName == 'myschema')).toBeTruthy(); + const schemas1 = await driver.listSchemas(conn); + expect(schemas1.find(x => x.schemaName == 'myschema')).toBeTruthy(); expect(structure1.tables.length).toEqual(2); await runCommandOnDriver(conn, driver, dmp => dmp.dropSchema('myschema')); const structure2 = await driver.analyseIncremental(conn, structure1); - expect(structure2.schemas.find(x => x.schemaName == 'myschema')).toBeFalsy(); - expect(structure2.tables.length).toEqual(2); - - const structure3 = await driver.analyseIncremental(conn, structure2); - 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); + const schemas2 = await driver.listSchemas(conn); + expect(schemas2.find(x => x.schemaName == 'myschema')).toBeFalsy(); + expect(structure2).toBeNull(); }) ); }); diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index 8b731c37e..7c81384ad 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -199,7 +199,7 @@ module.exports = { return res.result || null; }, - async loadDataCore(msgtype, { conid, database, ...args }, req) { + async loadDataCore(msgtype, { conid, database, ...args }, req) { testConnectionPermission(conid, req); const opened = await this.ensureOpened(conid, database); const res = await this.sendRequest(opened, { msgtype, ...args }); @@ -213,6 +213,12 @@ module.exports = { return res.result || null; }, + schemaList_meta: true, + async schemaList({ conid, database }, req) { + testConnectionPermission(conid, req); + return this.loadDataCore('schemaList', { conid, database }); + }, + loadKeys_meta: true, async loadKeys({ conid, database, root, filter }, req) { testConnectionPermission(conid, req); diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 894fba18c..d88ddb394 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -213,6 +213,10 @@ async function handleDriverDataCore(msgid, callMethod) { } } +async function handleSchemaList({ msgid }) { + return handleDriverDataCore(msgid, driver => driver.listSchemas(systemConnection)); +} + async function handleCollectionData({ msgid, options }) { return handleDriverDataCore(msgid, driver => driver.readCollection(systemConnection, options)); } @@ -337,6 +341,7 @@ const messageHandlers = { loadFieldValues: handleLoadFieldValues, sqlSelect: handleSqlSelect, exportKeys: handleExportKeys, + schemaList: handleSchemaList, // runCommand: handleRunCommand, }; diff --git a/packages/tools/src/DatabaseAnalyser.ts b/packages/tools/src/DatabaseAnalyser.ts index 9ebceaac4..6c7b371f1 100644 --- a/packages/tools/src/DatabaseAnalyser.ts +++ b/packages/tools/src/DatabaseAnalyser.ts @@ -5,7 +5,6 @@ import _pick from 'lodash/pick'; import _compact from 'lodash/compact'; import { getLogger } from './getLogger'; import { type Logger } from 'pinomin'; -import stableStringify from 'json-stable-stringify'; const logger = getLogger('dbAnalyser'); @@ -71,10 +70,7 @@ export class DatabaseAnalyser { async fullAnalysis() { const res = this.addEngineField(await this._runAnalysis()); // console.log('FULL ANALYSIS', res); - return { - ...res, - schemas: await this.readSchemaList(), - }; + return res; } async singleObjectAnalysis(name, typeField) { @@ -91,10 +87,6 @@ export class DatabaseAnalyser { return obj; } - async readSchemaList() { - return undefined; - } - async incrementalAnalysis(structure) { this.structure = structure; @@ -107,35 +99,22 @@ export class DatabaseAnalyser { const structureModifications = modifications.filter(x => x.action != 'setTableRowCounts'); const setTableRowCounts = modifications.find(x => x.action == 'setTableRowCounts'); - let structureUpdated = null; + let structureWithRowCounts = null; if (setTableRowCounts) { const newStructure = mergeTableRowCounts(structure, setTableRowCounts.rowCounts); if (areDifferentRowCounts(structure, newStructure)) { - structureUpdated = newStructure; + structureWithRowCounts = newStructure; } } - const schemas = await this.readSchemaList(); - const areSchemasDifferent = stableStringify(schemas) != stableStringify(this.structure.schemas); - if (areSchemasDifferent) { - structureUpdated = { - ...structure, - ...structureUpdated, - schemas, - }; - } - if (structureModifications.length == 0) { - return structureUpdated ? this.addEngineField(structureUpdated) : null; + return structureWithRowCounts ? this.addEngineField(structureWithRowCounts) : null; } this.modifications = structureModifications; - if (structureUpdated) this.structure = structureUpdated; + if (structureWithRowCounts) this.structure = structureWithRowCounts; logger.info({ modifications: this.modifications }, 'DB modifications detected:'); - return { - ...this.addEngineField(this.mergeAnalyseResult(await this._runAnalysis())), - schemas, - }; + return this.addEngineField(this.mergeAnalyseResult(await this._runAnalysis())); } mergeAnalyseResult(newlyAnalysed) { @@ -359,7 +338,6 @@ export class DatabaseAnalyser { functions: [], procedures: [], triggers: [], - schemas: [], }; } diff --git a/packages/types/dbinfo.d.ts b/packages/types/dbinfo.d.ts index 038ba345e..fcf0866d2 100644 --- a/packages/types/dbinfo.d.ts +++ b/packages/types/dbinfo.d.ts @@ -139,7 +139,6 @@ export interface DatabaseInfoObjects { } export interface DatabaseInfo extends DatabaseInfoObjects { - schemas?: SchemaInfo[]; engine?: string; defaultSchema?: string; } diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index 1ee4b71a6..de6e604c0 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -11,6 +11,7 @@ import { FunctionInfo, TriggerInfo, CollectionInfo, + SchemaInfo, } from './dbinfo'; import { FilterBehaviour } from './filter-type'; @@ -230,6 +231,7 @@ export interface EngineDriver extends FilterBehaviourProvider { ): any[]; // adapts table info from different source (import, other database) to be suitable for this database adaptTableInfo(table: TableInfo): TableInfo; + async listSchemas(pool): SchemaInfo[]; analyserClass?: any; dumperClass?: any; diff --git a/packages/web/src/impexp/FormSchemaSelect.svelte b/packages/web/src/impexp/FormSchemaSelect.svelte index 7096d8266..bcc6c757b 100644 --- a/packages/web/src/impexp/FormSchemaSelect.svelte +++ b/packages/web/src/impexp/FormSchemaSelect.svelte @@ -1,15 +1,15 @@