From 832f8b3aa852aff2903a3d1c44d72d501e3957eb Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 16 May 2023 19:04:46 +0100 Subject: [PATCH 1/4] Adding Oracle connection checking. --- packages/server/src/integrations/oracle.ts | 28 ++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/server/src/integrations/oracle.ts b/packages/server/src/integrations/oracle.ts index 82d8382a31..73e41e1d79 100644 --- a/packages/server/src/integrations/oracle.ts +++ b/packages/server/src/integrations/oracle.ts @@ -8,6 +8,7 @@ import { Table, DatasourcePlus, DatasourceFeature, + ConnectionInfo, } from "@budibase/types" import { buildExternalTableId, @@ -21,7 +22,7 @@ import { FieldTypes } from "../constants" import { BindParameters, Connection, - ConnectionAttributes, + ConnectionAttributes, DBError, ExecuteOptions, Result, } from "oracledb" @@ -49,7 +50,7 @@ const SCHEMA: Integration = { type: "Relational", description: "Oracle Database is an object-relational database management system developed by Oracle Corporation", - features: [], + features: [DatasourceFeature.CONNECTION_CHECKING], datasource: { host: { type: DatasourceFieldType.STRING, @@ -322,6 +323,29 @@ class OracleIntegration extends Sql implements DatasourcePlus { this.schemaErrors = final.errors } + async testConnection() { + const response: ConnectionInfo = { + connected: false, + } + let connection + try { + connection = await this.getConnection() + } catch (err: any) { + response.connected = false + response.error = err.message + } finally { + if (connection) { + try { + await connection.close() + } catch (err: any) { + response.connected = false + response.error = err.message + } + } + } + return response + } + private async internalQuery(query: SqlQuery): Promise> { let connection try { From 9f57d7c33a700621513f6ee9b3f9d70464db9077 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 16 May 2023 19:31:12 +0100 Subject: [PATCH 2/4] Fixes after testing against actual Oracle service. --- .../server/src/api/controllers/datasource.ts | 25 +++++++++++++------ packages/server/src/integrations/oracle.ts | 4 ++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index 956bffa795..4676a84744 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -47,7 +47,10 @@ async function getConnector( datasource: Datasource ): Promise { const Connector = await getIntegration(datasource.source) - datasource = await sdk.datasources.enrich(datasource) + // can't enrich if it doesn't have an ID yet + if (datasource._id) { + datasource = await sdk.datasources.enrich(datasource) + } // Connect to the DB and build the schema return new Connector(datasource.config) } @@ -127,13 +130,19 @@ export async function verify( ctx: UserCtx ) { const { datasource } = ctx.request.body - const existingDatasource = await sdk.datasources.get(datasource._id!) - - const enrichedDatasource = sdk.datasources.mergeConfigs( - datasource, - existingDatasource - ) - + let existingDatasource: undefined | Datasource + try { + existingDatasource = await sdk.datasources.get(datasource._id!) + } catch (err) { + // doesn't exist - can ignore, first creation + } + let enrichedDatasource = datasource + if (existingDatasource) { + enrichedDatasource = sdk.datasources.mergeConfigs( + datasource, + existingDatasource + ) + } const connector = await getConnector(enrichedDatasource) if (!connector.testConnection) { ctx.throw(400, "Connection information verification not supported") diff --git a/packages/server/src/integrations/oracle.ts b/packages/server/src/integrations/oracle.ts index 73e41e1d79..a2101ff303 100644 --- a/packages/server/src/integrations/oracle.ts +++ b/packages/server/src/integrations/oracle.ts @@ -22,7 +22,8 @@ import { FieldTypes } from "../constants" import { BindParameters, Connection, - ConnectionAttributes, DBError, + ConnectionAttributes, + DBError, ExecuteOptions, Result, } from "oracledb" @@ -330,6 +331,7 @@ class OracleIntegration extends Sql implements DatasourcePlus { let connection try { connection = await this.getConnection() + response.connected = true } catch (err: any) { response.connected = false response.error = err.message From ee5f0ec64149c0c899844116ca0f6528da211197 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 17 May 2023 09:15:06 +0100 Subject: [PATCH 3/4] Remove unused type. --- packages/server/src/integrations/oracle.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/integrations/oracle.ts b/packages/server/src/integrations/oracle.ts index a2101ff303..f8ec6e8bae 100644 --- a/packages/server/src/integrations/oracle.ts +++ b/packages/server/src/integrations/oracle.ts @@ -23,7 +23,6 @@ import { BindParameters, Connection, ConnectionAttributes, - DBError, ExecuteOptions, Result, } from "oracledb" From e09550f7e31c3063c053a11e9d4e5cea25da9443 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 17 May 2023 09:45:25 +0100 Subject: [PATCH 4/4] PR comments. --- packages/server/src/api/controllers/datasource.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index 4676a84744..8f13e0e618 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -131,10 +131,8 @@ export async function verify( ) { const { datasource } = ctx.request.body let existingDatasource: undefined | Datasource - try { - existingDatasource = await sdk.datasources.get(datasource._id!) - } catch (err) { - // doesn't exist - can ignore, first creation + if (datasource._id) { + existingDatasource = await sdk.datasources.get(datasource._id) } let enrichedDatasource = datasource if (existingDatasource) {