diff --git a/e2e-tests/.localconfig.js b/e2e-tests/.localconfig.js index 3fc7c3427..4ef84edc7 100644 --- a/e2e-tests/.localconfig.js +++ b/e2e-tests/.localconfig.js @@ -2,6 +2,6 @@ module.exports = { mysql: true, postgres: true, mssql: true, -// oracle: true, - sqlite: true, + // oracle: true, + // sqlite: true, }; diff --git a/e2e-tests/init/multi-sql.js b/e2e-tests/init/multi-sql.js index 866ab67bf..2ec3bada7 100644 --- a/e2e-tests/init/multi-sql.js +++ b/e2e-tests/init/multi-sql.js @@ -84,7 +84,7 @@ async function run() { port: process.env.PORT_oracle, engine: 'oracle@dbgate-plugin-oracle', }, - 'DROP USER C##my_guitar_shop', + 'DROP USER c##my_guitar_shop CASCADE', 'CREATE USER c##my_guitar_shop IDENTIFIED BY my_guitar_shop DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 10M ON users', 'C##my_guitar_shop' ); diff --git a/package.json b/package.json index 77bea81ea..9fa34d46f 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "install:drivers:packer": "node common/defineVolatileDependencies.js packer/build", "prepare:docker": "yarn plugins:copydist && yarn build:web && yarn build:api && yarn copy:docker:build && yarn install:drivers:docker", "prepare:packer": "yarn plugins:copydist && yarn build:web && yarn build:api && yarn copy:packer:build", + "build:e2e": "yarn build:lib && yarn prepare:packer", "start": "concurrently --kill-others-on-fail \"yarn start:api\" \"yarn start:web\"", "lib": "concurrently --kill-others-on-fail \"yarn start:sqltree\" \"yarn start:filterparser\" \"yarn start:datalib\" \"yarn start:tools\" \"yarn build:plugins:frontend:watch\"", "ts:api": "yarn workspace dbgate-api ts", diff --git a/packages/tools/src/SqlDumper.ts b/packages/tools/src/SqlDumper.ts index d3320a0a4..031d3a091 100644 --- a/packages/tools/src/SqlDumper.ts +++ b/packages/tools/src/SqlDumper.ts @@ -259,11 +259,21 @@ export class SqlDumper implements AlterProcessor { this.putRaw(' '); this.specialColumnOptions(column); - if (includeNullable && !this.dialect?.specificNullabilityImplementation) { - this.put(column.notNull ? '^not ^null' : '^null'); - } - if (includeDefault && column.defaultValue?.toString()?.trim()) { - this.columnDefault(column); + + if (this.dialect?.defaultValueBeforeNullability) { + if (includeDefault && column.defaultValue?.toString()?.trim()) { + this.columnDefault(column); + } + if (includeNullable && !this.dialect?.specificNullabilityImplementation) { + this.put(column.notNull ? '^not ^null' : '^null'); + } + } else { + if (includeNullable && !this.dialect?.specificNullabilityImplementation) { + this.put(column.notNull ? '^not ^null' : '^null'); + } + if (includeDefault && column.defaultValue?.toString()?.trim()) { + this.columnDefault(column); + } } } diff --git a/packages/tools/src/createBulkInsertStreamBase.ts b/packages/tools/src/createBulkInsertStreamBase.ts index 05db2fe24..b21b9e7a5 100644 --- a/packages/tools/src/createBulkInsertStreamBase.ts +++ b/packages/tools/src/createBulkInsertStreamBase.ts @@ -45,6 +45,10 @@ export function createBulkInsertStreamBase(driver: EngineDriver, stream, dbhan, logger.info({ sql: dmp.s }, `Creating table ${fullNameQuoted}`); await driver.script(dbhan, dmp.s); structure = await driver.analyseSingleTable(dbhan, name); + writable.structure = structure; + } + if (!writable.structure) { + throw new Error(`Error importing table - ${fullNameQuoted} not found`); } if (options.truncate) { await driver.script(dbhan, `TRUNCATE TABLE ${fullNameQuoted}`); diff --git a/packages/types/dialect.d.ts b/packages/types/dialect.d.ts index 9aabe7026..02dbe595c 100644 --- a/packages/types/dialect.d.ts +++ b/packages/types/dialect.d.ts @@ -63,6 +63,7 @@ export interface SqlDialect { requireFromDual?: boolean; userDatabaseNamePrefix?: string; // c## in Oracle upperCaseAllDbObjectNames?: boolean; + defaultValueBeforeNullability?: boolean; predefinedDataTypes: string[]; diff --git a/plugins/dbgate-plugin-oracle/src/frontend/driver.js b/plugins/dbgate-plugin-oracle/src/frontend/driver.js index 52316391c..36901e061 100644 --- a/plugins/dbgate-plugin-oracle/src/frontend/driver.js +++ b/plugins/dbgate-plugin-oracle/src/frontend/driver.js @@ -23,6 +23,7 @@ const dialect = { userDatabaseNamePrefix: 'C##', upperCaseAllDbObjectNames: true, requireStandaloneSelectForScopeIdentity: true, + defaultValueBeforeNullability: true, createColumn: true, dropColumn: true, @@ -177,6 +178,12 @@ END trigger_name; } return dialect; }, + + adaptDataType(dataType) { + if (dataType?.toLowerCase() == 'datetime') return 'timestamp'; + if (dataType?.toLowerCase() == 'text') return 'clob'; + return dataType; + }, }; module.exports = oracleDriver;