From f8ef06c8498e87e3ad12c4cb526ccd4296ac6466 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 10 Feb 2023 11:54:16 +0000 Subject: [PATCH 1/3] Fix issue with MS-SQL, port needs to be a number for the node-mssql package, with env vars it isn't anymore. --- packages/server/src/api/controllers/datasource.ts | 1 - packages/server/src/integrations/microsoftSqlServer.ts | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index 469cd29b56..d212f7f361 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -14,7 +14,6 @@ import { invalidateDynamicVariables } from "../../threads/utils" import { db as dbCore, context, events } from "@budibase/backend-core" import { UserCtx, Datasource, Row } from "@budibase/types" import sdk from "../../sdk" -import { mergeConfigs } from "../../sdk/app/datasources/datasources" export async function fetch(ctx: UserCtx) { // Get internal tables diff --git a/packages/server/src/integrations/microsoftSqlServer.ts b/packages/server/src/integrations/microsoftSqlServer.ts index 437a9812a6..48cb244b84 100644 --- a/packages/server/src/integrations/microsoftSqlServer.ts +++ b/packages/server/src/integrations/microsoftSqlServer.ts @@ -26,7 +26,7 @@ interface MSSQLConfig { user: string password: string server: string - port: number + port: number | string database: string schema: string encrypt?: boolean @@ -108,6 +108,9 @@ class SqlServerIntegration extends Sql implements DatasourcePlus { constructor(config: MSSQLConfig) { super(SqlClient.MS_SQL) this.config = config + if (typeof this.config?.port === "string") { + this.config.port = parseInt(this.config.port) + } const clientCfg = { ...this.config, options: { From 4acfae6af631a2061850cb1258ed88bc9700bbc2 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 10 Feb 2023 12:47:23 +0000 Subject: [PATCH 2/3] Updating so that datasources always have correct types after environment variable enrichment. --- packages/server/src/integrations/index.ts | 9 ++++++ .../src/integrations/microsoftSqlServer.ts | 3 -- .../src/sdk/app/datasources/datasources.ts | 29 +++++++++++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/server/src/integrations/index.ts b/packages/server/src/integrations/index.ts index e2dd69da24..edbce6db0a 100644 --- a/packages/server/src/integrations/index.ts +++ b/packages/server/src/integrations/index.ts @@ -67,6 +67,15 @@ if ( INTEGRATIONS[SourceName.ORACLE] = oracle.integration } +export async function getDefinition(source: SourceName): Promise { + // check if its integrated, faster + if (DEFINITIONS[source]) { + return DEFINITIONS[source] + } + const allDefinitions = await getDefinitions() + return allDefinitions[source] +} + export async function getDefinitions() { const pluginSchemas: { [key: string]: Integration } = {} if (env.SELF_HOSTED) { diff --git a/packages/server/src/integrations/microsoftSqlServer.ts b/packages/server/src/integrations/microsoftSqlServer.ts index 48cb244b84..2da190df5e 100644 --- a/packages/server/src/integrations/microsoftSqlServer.ts +++ b/packages/server/src/integrations/microsoftSqlServer.ts @@ -108,9 +108,6 @@ class SqlServerIntegration extends Sql implements DatasourcePlus { constructor(config: MSSQLConfig) { super(SqlClient.MS_SQL) this.config = config - if (typeof this.config?.port === "string") { - this.config.port = parseInt(this.config.port) - } const clientCfg = { ...this.config, options: { diff --git a/packages/server/src/sdk/app/datasources/datasources.ts b/packages/server/src/sdk/app/datasources/datasources.ts index dfcde96cfc..3a1f33b151 100644 --- a/packages/server/src/sdk/app/datasources/datasources.ts +++ b/packages/server/src/sdk/app/datasources/datasources.ts @@ -3,6 +3,7 @@ import { findHBSBlocks, processObjectSync } from "@budibase/string-templates" import { Datasource, DatasourceFieldType, + Integration, PASSWORD_REPLACEMENT, RestAuthConfig, RestAuthType, @@ -11,16 +12,38 @@ import { } from "@budibase/types" import { cloneDeep } from "lodash/fp" import { getEnvironmentVariables } from "../../utils" -import { getDefinitions } from "../../../integrations" +import { getDefinitions, getDefinition } from "../../../integrations" const ENV_VAR_PREFIX = "env." +export function checkDatasourceTypes(schema: Integration, config: any) { + for (let key of Object.keys(config)) { + if (!schema.datasource[key]) { + continue + } + const type = schema.datasource[key].type + if ( + type === DatasourceFieldType.NUMBER && + typeof config[key] === "string" + ) { + config[key] = parseFloat(config[key]) + } + } + return config +} + async function enrichDatasourceWithValues(datasource: Datasource) { const cloned = cloneDeep(datasource) const env = await getEnvironmentVariables() - const processed = processObjectSync(cloned, { env }, { onlyFound: true }) + const processed = processObjectSync( + cloned, + { env }, + { onlyFound: true } + ) as Datasource + const definition = await getDefinition(processed.source) + processed.config = checkDatasourceTypes(definition, processed.config) return { - datasource: processed as Datasource, + datasource: processed, envVars: env as Record, } } From 31ca094ec54cd9bdf77f16466213068b3b40b96d Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 10 Feb 2023 13:14:08 +0000 Subject: [PATCH 3/3] Adding mock required for pro. --- packages/backend-core/tests/utilities/mocks/licenses.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/backend-core/tests/utilities/mocks/licenses.ts b/packages/backend-core/tests/utilities/mocks/licenses.ts index 1fbda5655e..e374612f5f 100644 --- a/packages/backend-core/tests/utilities/mocks/licenses.ts +++ b/packages/backend-core/tests/utilities/mocks/licenses.ts @@ -74,6 +74,10 @@ export const useGroups = () => { return useFeature(Feature.USER_GROUPS) } +export const useEnvironmentVariables = () => { + return useFeature(Feature.ENVIRONMENT_VARIABLES) +} + // QUOTAS export const setAutomationLogsQuota = (value: number) => {