From bf85a922cac0fd3c85b8a8f334c0b95ff8eda9a8 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Tue, 10 Dec 2024 16:03:26 +0100 Subject: [PATCH] first oracle test works --- .../__tests__/table-analyse.spec.js | 16 +++++++++------- integration-tests/tools.js | 10 ++++++---- packages/types/dialect.d.ts | 1 + .../dbgate-plugin-oracle/src/frontend/driver.js | 3 ++- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/integration-tests/__tests__/table-analyse.spec.js b/integration-tests/__tests__/table-analyse.spec.js index ea3ca82eb..f8404ec13 100644 --- a/integration-tests/__tests__/table-analyse.spec.js +++ b/integration-tests/__tests__/table-analyse.spec.js @@ -1,7 +1,8 @@ +const { runCommandOnDriver } = require('dbgate-tools'); const engines = require('../engines'); const { testWrapper } = require('../tools'); -const t1Sql = 'CREATE TABLE t1 (id int not null primary key, val1 varchar(50))'; +const t1Sql = 'CREATE TABLE ~t1 (~id int not null primary key, ~val1 varchar(50))'; const ix1Sql = 'CREATE index ix1 ON t1(val1, id)'; const t2Sql = engine => `CREATE TABLE t2 (id int not null primary key, val2 varchar(50) ${engine.skipUnique ? '' : 'unique'})`; @@ -15,7 +16,7 @@ const txMatch = (engine, tname, vcolname, nextcol, defaultValue) => columns: [ expect.objectContaining({ columnName: 'id', - dataType: expect.stringMatching(/int.*/i), + dataType: expect.stringMatching(/int.*|number/i), ...(engine.skipNullability ? {} : { notNull: true }), }), expect.objectContaining({ @@ -59,9 +60,10 @@ describe('Table analyse', () => { test.each(engines.map(engine => [engine.label, engine]))( 'Table structure - full analysis - %s', testWrapper(async (conn, driver, engine) => { - await driver.query(conn, t1Sql); + await runCommandOnDriver(conn, driver, dmp => dmp.put(t1Sql)); const structure = await driver.analyseFull(conn); + console.log(JSON.stringify(structure, null, 2)); expect(structure.tables.length).toEqual(1); expect(structure.tables[0]).toEqual(t1Match(engine)); @@ -77,7 +79,7 @@ describe('Table analyse', () => { expect(structure1.tables.length).toEqual(1); expect(structure1.tables[0]).toEqual(t2Match(engine)); - await driver.query(conn, t1Sql); + await runCommandOnDriver(conn, driver, dmp => dmp.put(t1Sql)); const structure2 = await driver.analyseIncremental(conn, structure1); expect(structure2.tables.length).toEqual(2); @@ -89,7 +91,7 @@ describe('Table analyse', () => { test.each(engines.map(engine => [engine.label, engine]))( 'Table remove - incremental analysis - %s', testWrapper(async (conn, driver, engine) => { - await driver.query(conn, t1Sql); + await runCommandOnDriver(conn, driver, dmp => dmp.put(t1Sql)); await driver.query(conn, t2Sql(engine)); const structure1 = await driver.analyseFull(conn); expect(structure1.tables.length).toEqual(2); @@ -107,7 +109,7 @@ describe('Table analyse', () => { test.each(engines.map(engine => [engine.label, engine]))( 'Table change - incremental analysis - %s', testWrapper(async (conn, driver, engine) => { - await driver.query(conn, t1Sql); + await runCommandOnDriver(conn, driver, dmp => dmp.put(t1Sql)); await driver.query(conn, t2Sql(engine)); const structure1 = await driver.analyseFull(conn); @@ -130,7 +132,7 @@ describe('Table analyse', () => { test.each(engines.filter(x => !x.skipIndexes).map(engine => [engine.label, engine]))( 'Index - full analysis - %s', testWrapper(async (conn, driver, engine) => { - await driver.query(conn, t1Sql); + await runCommandOnDriver(conn, driver, dmp => dmp.put(t1Sql)); await driver.query(conn, ix1Sql); const structure = await driver.analyseFull(conn); diff --git a/integration-tests/tools.js b/integration-tests/tools.js index dc4df6a6d..96b68024d 100644 --- a/integration-tests/tools.js +++ b/integration-tests/tools.js @@ -1,10 +1,12 @@ const requireEngineDriver = require('dbgate-api/src/utility/requireEngineDriver'); const crypto = require('crypto'); -function randomDbName() { +function randomDbName(dialect) { const generatedKey = crypto.randomBytes(6); const newKey = generatedKey.toString('hex'); - return `db${newKey}`; + const res = `db${newKey}`; + if (dialect.upperCaseAllDbObjectNames) return res.toUpperCase(); + return res; } function extractConnection(engine) { @@ -75,7 +77,7 @@ const testWrapper = async (label, ...other) => { const engine = other[other.length - 1]; const driver = requireEngineDriver(engine.connection); - const conn = await connect(engine, randomDbName()); + const conn = await connect(engine, randomDbName(driver.dialect)); try { await body(conn, driver, ...other); } finally { @@ -88,7 +90,7 @@ const testWrapperPrepareOnly = async (label, ...other) => { const engine = other[other.length - 1]; const driver = requireEngineDriver(engine.connection); - const conn = await prepareConnection(engine, randomDbName()); + const conn = await prepareConnection(engine, randomDbName(driver.dialect)); await body(conn, driver, ...other); }; diff --git a/packages/types/dialect.d.ts b/packages/types/dialect.d.ts index 6ec6205a4..c48d2a604 100644 --- a/packages/types/dialect.d.ts +++ b/packages/types/dialect.d.ts @@ -52,6 +52,7 @@ export interface SqlDialect { dropReferencesWhenDropTable?: boolean; requireFromDual?: boolean; userDatabaseNamePrefix?: string; // c## in Oracle + upperCaseAllDbObjectNames?: boolean; predefinedDataTypes: string[]; diff --git a/plugins/dbgate-plugin-oracle/src/frontend/driver.js b/plugins/dbgate-plugin-oracle/src/frontend/driver.js index ab745402d..d52d49aac 100644 --- a/plugins/dbgate-plugin-oracle/src/frontend/driver.js +++ b/plugins/dbgate-plugin-oracle/src/frontend/driver.js @@ -20,7 +20,8 @@ const dialect = { quoteIdentifier(s) { return '"' + s + '"'; }, - userDatabaseNamePrefix: 'c##', + userDatabaseNamePrefix: 'C##', + upperCaseAllDbObjectNames: true, createColumn: true, dropColumn: true,